題:
在“ / storage / emulated / 0”中創建的文件是否應該出現在“ / storage / sdcard0”中?
Narcotixs
2017-04-27 20:59:43 UTC
view on stackexchange narkive permalink

根據我的猜測,每個用戶都可以使用內部存儲。如果模擬存儲是為特定用戶創建的存儲位置,則在 / storage / emulated / 0 中創建的文件是否應該出現在 / storage / sdcard0 中?我認為不會,因為用戶創建的文件應僅以仿真方式顯示,否則由用戶創建的文件將可供所有其他用戶查看。

是什麼讓您認為`/ storage / emulated / 0`是特定於給定用戶的,而不僅僅是`“第一個仿真存儲設備”,因為`/ storage / sdcard0`是第一個(內部)SD卡?
@Izzy因為編號(即在這種情況下為'0')表示為特定用戶分配的存儲空間。從Android 4.2開始,Android不會成為多用戶平台嗎?
啊,很抱歉–再次混淆了這一點(“ 0”與“ / 0”太容易混淆了)。請檢查以下內容:[為什麼/ sdcard /在4.2下變成/sdcard/0/?](https://android.stackexchange.com/q/35541/16575)和[被虛擬的/ sdcard的許多位置所混淆/](https://android.stackexchange.com/q/39542/16575)。我自己從來沒有和多用戶一起玩過,所以在這裡我不做深入探討。如果您的設備上有多個用戶,可以檢查嗎?我很好奇,但我的猜測是`/ storage / sdcard0`總是指向相應用戶的目錄,就像`/ storage / emulated / legacy /`一樣。
-1
-1
@Narcotixs目錄鏈接到相同的物理位置,這是正常的。
@DanBrown如果我理解正確,那麼OP會問:“ *如果** / storage / sdcard0 **是可自由讀寫的,那麼為每個用戶提供** / storage / emulated / X **目錄有什麼意義呢?*”,這是一個很好的問題。
@DeathMaskSalesman如果是這樣,那就不知道了。從來沒有真正干預過多用戶(但誰擁有?)
確實,這讓我感到困惑-而且,我也只有在寫完我的最初評論後才意識到。因此,請問一個設備上有多個用戶的人是否可以交叉檢查。
一個小時前,我是@DanBrown。不喜歡這種經歷。
-1
好的,@DanBrown –之後(或什至之前),使用`mount`命令進行檢查。出乎意料的是,我期望:上面覆蓋了一個FUSE文件系統(這就是內部SD卡與其他內部存儲在同一分區上的分離方式)。我現在懷疑的是,此FUSE系統可能會注意分離用戶數據,將“ SD卡”映射到適當的位置。
@Izzy嗯,那很有意義。我沒有可與ATM相連的有根設備(實際上我根本沒有任何有根的設備,我剛剛意識到),因此我無法真正與終端搞混。
@DanBrown無需root,可以使用沒有終端的設備:)是的,我的猜測似乎是正確的:[為什麼Android將保險絲用於內部SD卡安裝?](/ q / 50056/16575)說* FUSE文件系統也可以管理存儲在/ data / media文件夾中的文件的許可權。*讓我們看看是否可以找到更多證據來證明答案是正確的:)
相關:[什麼是/storage/emulated/0/?](https://android.stackexchange.com/a/205494/218526)
二 答案:
Izzy
2017-04-28 03:21:58 UTC
view on stackexchange narkive permalink

我已經檢查了我的其中一台設備,並且由於已經懷疑註釋鏈,因此您不必擔心每個人都可以訪問其他人的數據。首先:

  / storage / sdcard0 -> / storage / emulated / legacy  

這意味著,它只是一個符號鏈接,始終指向當前用戶:

  / storage / emulated / legacy -> / mnt / shell / emulated / 0  

(第一個用戶–在我的情況下是唯一一)。其次,通常在哪裡尋找它:

  / sdcard -> / storage / emulated / legacy  

再次進行相同的遊戲。因此,對於仿真的SD卡(又名“內部SD卡”),Android系統會謹慎地將其映射到當前用戶。不確定外部SD卡(如果可以例如在多個用戶之間共享數據)通常在 / storage / sdcard1 中找到:

  $ mount | grep sdcard / dev / block / vold / 179:65 / mnt / media_rw / sdcard1 vfat […] / dev / fuse / storage / sdcard1保險絲[…] $ ls / mnt / media_rw / sdcard1 / mnt / media_rw / sdcard1:權限被拒絕$ su -c“ ls / mnt / media_rw / sdcard1” [來自外部SD的數據卡]  

因此您可以看到外部SD卡只能用root權限直接訪問 ,為什麼“普通用戶”必須通過覆蓋的FUSE支架進行訪問因此,系統可能會再次注意每個用戶只能在該位置訪問他/她自己的數據,我對內部結構還不夠熟悉,無法肯定地說(甚至不能說那裡到底做了什麼)。

現在,對於您的明確問題,在 / storage / emulated / 0 中創建的文件是否應該出現在 / storage / sdcard0 中:您說的是 / mnt / shell / emulated / 0 (我在設備上找不到 / storage / emulated / 0 ),從經驗上講,他們當然可以,因為它們都是相同的位置: / storage / sdcard0 -> / storage / emulated / legacy -> / mnt / shell / emulated / 0 –表示 / storage / sdcard0 顯示 / mnt / shell / emulated / 0 中包含的內容。但是您不必擔心:由於存在“中間人”( / storage / emulated / legacy ), / storage / sdcard0 始終指向“已記錄”的存儲-in user” –例如第二個用戶看那裡,他將看到 / mnt / shell / emulated / 1 中的內容(或他/她所模擬的存儲區域)。


因此,作為PS,讓我從註釋中總結一下內容,作為一個簡短的FAQ:

  • 我想知道如果其他用戶嘗試訪問和保存數據會發生什麼情況?
    他收到一個錯誤消息,提示該存儲不存在或無法訪問。
  • 為什麼需要這些符號鏈接?
    出於多種原因,其中許多是歷史原因(一個詞:“兼容性”)。
  • 這些符號鏈接是什麼,用外行術語來說,它們是如何工作的?
    它們基本上是“路標”,說“請看那裡”。除了您最初假定的以外,它們本身不包含任何數據-它們實際上只是路標或“指針”。數據本身位於“目標位置”,並且僅存在於此。有關更多詳細信息,請參見有關符號鏈接的Wikipedia文章

另請參見:

這可能有點偏離主題,但是為什麼需要這些符號鏈接?為什麼將存儲體系結構更改和設計為現在的原因是什麼?
為什麼“ / storage / sdcard0”指向“ / storage / emulated / legacy”?我認為模擬存儲應該始終指向原始存儲位置(即內部存儲或實際虛擬存儲位置),或者根本沒有指向,這只是相互之間的雙向引用?
對不起,我無法回答。也許您將其作為一個單獨的問題提出?另外,如果這回答了您的原始問題,請考慮[接受](/ help / someone-answers),@Narcotixs;)很抱歉拒絕您的修改:您的更改未反映我的發現;這裡的“ / sdcard”是指向“ / storage / emulated / legacy”的直接鏈接,而不是“ / storage / sdcard0”。
很難說您是否真的回答了這個問題,符號鏈接很有幫助,但是它引入了更多的問題。我現在想知道符號鏈接是否是雙向的?如果我在/ storage / emulated / 0中創建文件,它將顯示在/ storage / sdcard0中嗎?您的箭頭指向並指示信息的傳輸(即從存儲到模擬),但是它也相反嗎?那是我的問題。根據你的意思,我認為這是真的。你同意嗎?
符號鏈接是單向的,是某種“重定向”(也稱為“在那兒看”)。但是這樣,如果您要在`/ storage / emulated / 0`中創建文件,則該文件當然會顯示在`/ storage / sdcard0`中,因為兩者都指向同一位置。哦,我明白了,我應該寫清楚的-如果您每天處理某件事,那就是問題,很明顯,符號鏈接可以做到這一點:)好,將其添加到我的答案中。
如果所有位置都指向同一個虛擬存儲,那麼為每個不同的用戶分別設置存儲位置又有什麼意義(當然,如果存在多個存儲位置)?因此,/ storage / emulated / 0、1、2、3等。它們都指向/ storage / sdcard0,也指向/ sdcard?那麼為什麼存在這些數字呢?如果它們都指向同一位置並包含相同的確切信息,為什麼還要分配數字文件夾?
您再次轉過頭來,這引起了您的困惑(“為什麼它的頭在錯誤的一端?”)。指向`/ storage / sdcard0`的不是`/ storage / emulated / *`,而是相反。因此,如果登錄了“ user0”,則“ sdcard0”指向“ emulated / 0”,但是如果登錄了“ user1”,則指向“ emulated / 1” –即“ sdcard”始終指向專用於該存儲區的模擬存儲登錄用戶–當然,每個用戶擁有不同的內容。
該線程在以下位置繼續:https://android.stackexchange.com/questions/173918/when-files-are-created-in-android-4-2-and-above-are-files-ever-stored-in-one-lo
miksha
2018-01-24 10:07:32 UTC
view on stackexchange narkive permalink

Expensive Toys先生說:“令我們感到驚訝的是,直到蜂窩蜂窩開始出現此問題時,仍然出現。

因此, / storage / emulated / 0 / DCIM / Camera 是與常規DCIM / Camera文件夾相同的文件夾。它只是一個符號鏈接。因此,文件實際上位於正確的位置,您只需要一個應用程序即可將錯誤的數據放入MediaStore數據庫中。

從PC訪問文件時,實際上是在枚舉MediaStorage數據庫中的文件。它不拉傳統目錄列表。因此,您所看到的內容基於該數據庫中的內容以及該數據庫中的路徑條目。

數據庫中指向仿真目錄的文件未顯示,因為它們被假定為與普通DCIM /相機相同的物理目錄重複。發生的情況是,一些寫得不好的第三方應用程序正在使用 / storage / emulated / 0 / DCIM / Camera 路徑(而不是DCIM / Camera的正確根路徑)將條目插入數據庫。這意味著當您連接到PC時,MTP服務看不​​到它們。

通常,解決此問題的最簡單方法是清除MediaStore數據庫,以從中刪除不良條目。 MediaStore數據庫,然後讓系統重新索引文件並使用正確的路徑放入數據庫。清除DataFind外部存儲,選擇它,選擇存儲,然後清除DataTurn關閉電話,重新打開電話,等待索引器服務重建數據。

完成後,文件應顯示在正確的目錄樹中,並且在PC上可見。根據電話上文件的數量,服務在電話目錄中移動,獲取元數據,創建縮略圖等時,重建媒體數據庫可能需要10到20分鐘的時間。



該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...