也許我只是錯過了文檔中的東西,但我無法找到任何東西,說這種行爲應該在iOS版已經改變8.的NSFileManager -createFileAtPath失敗NSInvalidArgumentException
我的應用程序設置當前工作目錄Documents
目錄,然後嘗試使用NSFileManager -createFileAtPath
在那裏創建文件。在iOS 8之前,這工作正常。在運行iOS 8的設備,我得到的電話會議後,以-createFileAtPath:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '*** -[NSFileManager fileSystemRepresentationWithPath:]: nil or empty path argument'
下面是一個最小的代碼片段重現問題:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docsDir = [paths objectAtIndex:0];
[[NSFileManager defaultManager] changeCurrentDirectoryPath:docsDir];
[[NSFileManager defaultManager] createFileAtPath:@"temp.dat" contents:nil attributes:nil];
註上createFileAtPath
路徑參數是"temp.dat"
-如果我將其更改爲"./temp.dat"
,則調用成功。
我在做一些愚蠢的事情,這只是「意外」在以前的iOS版本中工作?還是他們故意改變這裏的行爲?或者這是iOS 8中的一個錯誤?採用path
參數的其他NSFileManager方法似乎只需一個文件名即可(例如-removeItemAtPath:@"temp.dat" error:&err
成功)。
編輯補充:
這只是發生在物理設備上。在模擬器中,上述createFileAtPath
的調用成功。
'createFileAtPath'應該傳遞一個完整的路徑名。將'temp.dat'附加到'docsDir'並將其傳入。不需要更改當前目錄。 – rmaddy 2014-09-23 17:50:56
@rmaddy:我想我的觀點是,它在iOS 8之前的所有版本中都能正常工作(這是iOS 3以後的應用程序),我在文檔中找不到的東西表明它應該改變。 「temp.dat」是一個相對路徑(與「./temp.dat」相同) - 文檔沒有指定它必須是絕對路徑,其他NSFileManager方法接受相同的相對路徑(有或沒有。 /) 正好。我傾向於將它稱爲一個錯誤(無論是在操作系統還是在文檔中)並向Apple發送錯誤報告。 – 2014-09-23 18:14:05
在iOS8發行說明中有一個簡短的提及:「應用程序容器的文件系統佈局在磁盤上已更改,而不是依賴硬編碼的目錄結構,請使用NSSearchPathForDirectoriesInDomains函數或URLForDirectory:inDomain:appropriateForURL:create:錯誤:NSFileManager類的方法。「但是,這並不能解釋你的錯誤... – Gismay 2014-09-23 18:25:28