iOS路徑相關的, 都在這了

weixin_34138377發表於2017-07-21
5752770-c0daccdfaf6efde5.jpg

每個應用的沙盒目錄都是相似的,主要包含圖中所示的4個目錄:

一、MyApp.app

  • 該目錄包含了應用程式本身的資料,包括資原始檔和可執行檔案等。程式啟動以後,會根據需要從該目錄中動態載入程式碼或資源到記憶體,這裡用到了lazy loading的思``
  • 整個目錄是隻讀的, 為了防止被篡改,應用在安裝的時候會將該目錄簽名。非越獄情況下,該目錄中內容是無法更改的;在越獄裝置上如果更改了目錄內容,對應的簽名就會被改變,這種情況下蘋果官網描述的後果是應用程式將無法啟動,我沒實踐過。
  • 不會被iTunes同步
  • 獲取方法 NSString *appPath = [[NSBundle mainBundle] bundlePath]

二、Documents

  • 存放內容 我們可以將應用程式的資料檔案儲存在該目錄下。不過這些資料型別僅限於不可再生的資料,可再生的資料檔案應該存放在Library/Cache目錄下。
  • 會被iTunes同步
  • 獲取方法 NSString *document = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
FOUNDATION_EXPORT NSArray *NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directory, NSSearchPathDomainMask domainMask, BOOL expandTilde);  

該方法用於返回指定範圍內的指定名稱的目錄的路徑集合。有三個引數:
directory
NSSearchPathDirectory型別的enum值,表明我們要搜尋的目錄名稱,比如這裡用NSDocumentDirectory表明我們要搜尋的是Documents目錄。如果我們將其換成NSCachesDirectory就表示我們搜尋的是Library/Caches目錄。
domainMask
NSSearchPathDomainMask型別的enum值,指定搜尋範圍,這裡的NSUserDomainMask表示搜尋的範圍限制於當前應用的沙盒目錄。還可以寫成NSLocalDomainMask(表示/Library)、NSNetworkDomainMask(表示/Network)等。
expandTilde
BOOL值,表示是否展開波浪線~。我們知道在iOS中~的全寫形式是/User/userName,該值為YES即表示寫成全寫形式,為NO就表示直接寫成“~”。

三、Documents/Inbox

  • 存放內容 該目錄用來儲存由外部應用請求當前應用程式開啟的檔案。 比如我們的應用叫A,向系統註冊了幾種可開啟的檔案格式,B應用有一個A支援的格式的檔案F,並且申請呼叫A開啟F。由於F當前是在B應用的沙盒中,我們知道,沙盒機制是不允許A訪問B沙盒中的檔案,因此蘋果的解決方案是講F拷貝一份到A應用的Documents/Inbox目錄下,再讓A開啟F。
  • 是否會被iTunes同步

  • 獲取方法 NSHomeDirectory()

四、Library

  • 存放內容

蘋果建議用來存放預設設定或其它狀態資訊。

  • 是否會被iTunes同步

是,但是要除了Caches子目錄外

  • 獲取方法 NSTemporaryDirectory()

五、Library/Caches

  • 存放內容

主要是快取檔案,使用者使用過程中快取都可以儲存在這個目錄中。前面說過,Documents目錄用於儲存不可再生的檔案,那麼這個目錄就用於儲存那些可再生的檔案,比如網路請求的資料。鑑於此,應用程式通常還需要負責刪除這些檔案。

  • 是否會被iTunes同步

否。

  • 獲取方法NSString *document = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];

六、Library/Preferences

  • 存放內容

應用程式的偏好設定檔案。我們使用NSUserDefaults寫的設定資料都會儲存到該目錄下的一個plist檔案中,這就是所謂的寫道plist中!

  • 是否會被iTunes同步

  • 獲取方法NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];

七、tmp

  • 存放內容

各種臨時檔案,儲存應用再次啟動時不需要的檔案。而且,當應用不再需要這些檔案時應該主動將其刪除,因為該目錄下的東西隨時有可能被系統清理掉,目前已知的一種可能清理的原因是系統磁碟儲存空間不足的時候。

  • 是否會被iTunes同步

  • 獲取方法NSTemporaryDirectory()

其他一些路徑:

    NSSearchPathForDirectoriesInDomains(“想要查詢的目錄”,“想要從哪個路徑區域保護區查詢”)
查詢的區域:
typedef NS_OPTIONS(NSUInteger, NSSearchPathDomainMask) {
    NSUserDomainMask = 1,       // 使用者的主目錄
    NSLocalDomainMask = 2,      // 當前機器的本地目錄
    NSNetworkDomainMask = 4,    // 在網路中公開可用的位置
    NSSystemDomainMask = 8,     // 被蘋果系統提供的,不可更改的位置 (/System)
    NSAllDomainsMask = 0x0ffff  // 上述所有及未來的位置
};
想要查詢的目錄:
NSApplicationDirectory = 1,             // 到applications (Applications)目錄下
    NSDemoApplicationDirectory,             // 到Applications/Demos目錄下
    NSDeveloperApplicationDirectory,        // 到Developer/Applications目錄下.
    NSAdminApplicationDirectory,            // 到Applications/Utilities目錄下
    NSLibraryDirectory,                     // 到Library目錄下
    NSDeveloperDirectory,                   // 到Developer目錄下.
    NSUserDirectory,                        // 到使用者的主目錄下
    NSDocumentationDirectory,               // 到documentation (Documentation)的目錄下
    NSDocumentDirectory,                    // 到documents (Documents)目錄下
    NSCoreServiceDirectory,                 // CoreServices目錄的位置 (System/Library/CoreServices)
    NSAutosavedInformationDirectory NS_ENUM_AVAILABLE(10_6, 4_0) = 11,   // 自動儲存的文件位置 (Documents/Autosaved)
    NSDesktopDirectory = 12,                // 本地使用者的桌面
    NSCachesDirectory = 13,                 // 本地緩衝區目錄(Library/Caches)
    NSApplicationSupportDirectory = 14,     // 本地應用支援檔案目錄 (plug-ins, etc) (Library/Application Support)
    NSDownloadsDirectory NS_ENUM_AVAILABLE(10_5, 2_0) = 15,              // 本地下載downloads目錄
    NSInputMethodsDirectory NS_ENUM_AVAILABLE(10_6, 4_0) = 16,           // 輸入方法目錄 (Library/Input Methods)
    NSMoviesDirectory NS_ENUM_AVAILABLE(10_6, 4_0) = 17,                 // 電影目錄 (~/Movies)
    NSMusicDirectory NS_ENUM_AVAILABLE(10_6, 4_0) = 18,                  // 音樂目錄 (~/Music)
    NSPicturesDirectory NS_ENUM_AVAILABLE(10_6, 4_0) = 19,               // 圖片目錄 (~/Pictures)
    NSPrinterDescriptionDirectory NS_ENUM_AVAILABLE(10_6, 4_0) = 20,     // PPDs目錄 (Library/Printers/PPDs)
    NSSharedPublicDirectory NS_ENUM_AVAILABLE(10_6, 4_0) = 21,           // 本地使用者分享目錄 (~/Public)
    NSPreferencePanesDirectory NS_ENUM_AVAILABLE(10_6, 4_0) = 22,        // PreferencePanes目錄的位置使用系統的偏好設定 (Library/PreferencePanes)
    NSApplicationScriptsDirectory NS_ENUM_AVAILABLE(10_8, NA) = 23,      // 本地使用者 scripts 資料夾,對於所需的應用(~/Library/Application Scripts/code-signing-id)
    NSItemReplacementDirectory NS_ENUM_AVAILABLE(10_6, 4_0) = 99,        // For use with NSFileManager's URLForDirectory:inDomain:appropriateForURL:create:error:
    NSAllApplicationsDirectory = 100,       // 應用能夠發生的所有路徑
    NSAllLibrariesDirectory = 101,          //資源可以發生的所有目錄
    NSTrashDirectory NS_ENUM_AVAILABLE(10_8, NA) = 102                   // 垃圾存放目錄
};
NSHomeDirectory()只能到達使用者的主目錄
列印結果: /Users/yinsuke/Library/Application Support/iPhone Simulator/6.0/Applications/FB3B8EAF-63D9-4CFE-878C-2692093CC763
NSString *tempPath = NSTemporaryDirectory();
/Users/yinsuke/Library/Application Support/iPhone Simulator/6.0/Applications/FB3B8EAF-63D9-4CFE-878C-2692093CC763/tmp/  
NSString *fullName=NSFullUserName();
當前使用者的一個完整使用者名稱,在需要的路徑下可以插入進去。
NSString *userName=NSUserName();
返回當前使用者的登陸使用者名稱
NSString * NSHomeDirectoryForUser ( NSString *userName );
返回指定使用者名稱的使用者根目錄(home)
NSString * NSOpenStepRootDirectory (void);
返回當前使用者的系統根目錄

相關文章