在應用程序執行時,經常需要本地化保存一些重要的數據,這時就有可能需要創建一些目錄。Objective-C提供了一個非常強大的創建目錄的接口:
- (BOOL)createDirectoryAtPath:(NSString *)path withIntermediateDirectories:(BOOL)createIntermediates attributes:(NSDictionary *)attributes error:(NSError **)error;
很多人使用這個接口時,往往將attributes參數設置為nil,這樣雖然能夠創建出目錄,但是在一些特殊場景下(比如iPhone的apps)所創建的目錄的屬性往往不是我們期望的,因而導致目錄的讀寫失敗等問題。其實通過設置attributes參數,這個接口可以完成我們的期望。
根據蘋果官方文檔介紹,這個參數可以設置所創建目錄所屬的用戶和用戶組,目錄的訪問權限和修改時間等。如果設置為nil,那么所創建目錄的屬性則采用系統默認設置,一般會將目錄的用戶設置為root,訪問權限設置為0755,這樣就導致其他用戶向這個目錄寫入時失敗。
attributes參數是一個字典類型。查看蘋果官方文檔的介紹,可以看到在NSFileManager.h頭文件定義了很多常量字符串,用於作為attributes字典的鍵,針對於這個接口的鍵主要包括下面幾個:
NSString * const NSFileType; NSString * const NSFileSize; NSString * const NSFileModificationDate; NSString * const NSFileReferenceCount; NSString * const NSFileDeviceIdentifier; NSString * const NSFileOwnerAccountName; NSString * const NSFileGroupOwnerAccountName; NSString * const NSFilePosixPermissions; NSString * const NSFileSystemNumber; NSString * const NSFileSystemFileNumber; NSString * const NSFileExtensionHidden; NSString * const NSFileHFSCreatorCode; NSString * const NSFileHFSTypeCode; NSString * const NSFileImmutable; NSString * const NSFileAppendOnly; NSString * const NSFileCreationDate; NSString * const NSFileOwnerAccountID; NSString * const NSFileGroupOwnerAccountID; NSString * const NSFileBusy;
本文不打算翻譯蘋果的官方文檔,只把我們比較關心的幾個鍵的意義說明如下:
- NSFileAppendOnly
這個鍵的值需要設置為一個表示布爾值的NSNumber對象,表示創建的目錄是否是只讀的。
- NSFileCreationDate
這個鍵的值需要設置為一個NSDate對象,表示目錄的創建時間。
- NSFileOwnerAccountName
這個鍵的值需要設置為一個NSString對象,表示這個目錄的所有者的名字。
- NSFileGroupOwnerAccountName
這個鍵的值需要設置為一個NSString對象,表示這個目錄的用戶組的名字。
- NSFileGroupOwnerAccountID
這個鍵的值需要設置為一個表示unsigned int的NSNumber對象,表示目錄的組ID。
- NSFileModificationDate
這個鍵的值需要設置一個NSDate對象,表示目錄的修改時間。
- NSFileOwnerAccountID
這個鍵的值需要設置為一個表示unsigned int的NSNumber對象,表示目錄的所有者ID。
- NSFilePosixPermissions
這個鍵的值需要設置為一個表示short int的NSNumber對象,表示目錄的訪問權限。
- NSFileReferenceCount
這個鍵的值需要設置為一個表示unsigned long的NSNumber對象,表示目錄的引用計數,即這個目錄的硬鏈接數。
這樣,通過合理的設計attributes字典中的不同鍵的值,這個接口所創建的目錄的屬性就會基本滿足我們的需求了。
by yyhu