2012-02-27 96 views
18

考慮以下兩個代碼示例:爲什麼在創建新文件時使用NSFileManager而不是僅僅使用NSData的writeToFile:atomically:方法?

NSData *imgData = UIImagePNGRepresentation(imgFull); 
    NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
    NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"itemImg_%i.png", timestamp]]; //add our image to the path 
    [imgData writeToFile:fullPath atomically:YES]; 

NSData *imgData = UIImagePNGRepresentation(imgFull); 
NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"itemImg_%i.png", timestamp]]; //add our image to the path 
NSFileManager *fileManager = [NSFileManager defaultManager]; 
[fileManager createFileAtPath:fullPath contents:imgData attributes:nil]; 

第二個例子需要的代碼和一個的NSFileManager對象的初始化一個額外的行,而第一實施例簡單地具有NSData對象imgData將自己寫入文件。第一個示例的另一個優點是可以覆蓋同名的預先存在的文件。

我的問題是:創建新的文件,在什麼情況下,你會真的想使用的NSFileManager和方法createFileAtPath:contents:attributes:什麼時候?

+0

的NSData的將writeToFile不會改寫爲默認值,從我的經驗。 NSFileManager的createFileAtPath也沒有屬性:nil。有關屬性NSDictionary方法的信息即將出現,這表明它並不常用。 – 2013-06-27 21:09:15

回答

35

NSFileManager方法的優點是attributes字段:

包含的屬性的字典與新文件相關聯。您可以使用這些屬性來設置所有者和組號,文件權限和修改日期。有關鍵的列表,請參閱「文件屬性鍵」。如果爲屬性指定nil,則會使用一組默認屬性創建文件。

此功能在iOS上使用時不常見,但NSFileManager比iOS舊。

順便說一句,你描述幾乎沒有多餘的線條在實際代碼出現。要麼你已經有了,你用其他原因fileManager變量,或者你兩行合併爲一個:

[[NSFileManager defaultManager] createFileAtPath:fullPath contents:imgData attributes:nil]; 

而且只是多一個。當您注意到:

第一個示例的另一個優點是它可以覆蓋具有相同名稱的預先存在的文件。

那麼,這是一個優勢或劣勢取決於你想要什麼。如果你的意思是「創建這個文件,但不覆蓋它,如果它已經存在,」那麼FM方法更方便。也許這是覆蓋現有文件的錯誤;這可以節省您撥打fileExistsAtPath:的電話。也許你想創建一個空文件,如果它不存在,但如果它是一個單獨的文件。簡單:通過[NSData data]作爲contents的值。

因此,這是更好地取決於你解決什麼問題。

+0

很好的答案,感謝您簡要地談談NSFileManager類的更廣泛的非iOS存在問題。 – maxedison 2012-02-27 15:16:34

+0

的確很好的答案。感謝SandBox下的Rob – Eugene 2012-02-27 15:20:06

+0

,它的差異越來越大。 Hope Rob可以升級答案。謝謝! – 2012-06-28 18:16:12

0

根據我的知識和後搶讀答案,大多數文件操作都可以通過共享文件管理器對象來進行。因爲每條路徑只生成一次。所以不能出現覆蓋情況。如果我錯了,請糾正。

0

最近,我發現writeToFile:atomically:不合身時,單元測試代碼。爲了使測試更加舒適,我必須將NSFileManager注入到課程中,並且在測試中我使用了模擬文件管理器來驗證行爲。

相關問題