2013-08-30 129 views
1

我有我的應用程序的方法是將一個字符串寫入到文件的末尾:NSFileHandle fileHandleForWriting返回nil,錯誤代碼24

-(void)log:(NSString *)str 
{ 
    if (![[NSFileManager defaultManager] fileExistsAtPath:self.logPath]) 
    [[NSFileManager defaultManager] createFileAtPath:self.logPath contents:nil attributes:nil]; 

    NSError *err = nil; 
NSFileHandle *myHandle = [NSFileHandle fileHandleForWritingToURL:[NSURL fileURLWithPath:self.logPath] error:&err]; 
if (!myHandle) 
    NSLog(@"Failed to write file - %@", err.localizedDescription); 
    [myHandle seekToEndOfFile]; 
    [myHandle writeData:[str dataUsingEncoding:NSUTF8StringEncoding]]; 
    [myHandle closeFile]; 
} 

它工作了一段時間,然後開始出現問題; fileHandleForWritingToURL返回nil。我得到的錯誤是NSCocoaErrorDomain錯誤24.但是我無法在任何地方找到對此錯誤的任何引用。谷歌沒有幫助。有沒有人見過這個?難道我做錯了什麼?

回答

1

我的感覺是NSCocoaErrorDomain被映射到UNIX errno值,而errno 24是「打開的文件太多」。仔細查看NSFileHandle class reference。此外,

[myHandle seekToEndOfFile]; [myHandle writeData:[str dataUsingEncoding:NSUTF8StringEncoding]]; [myHandle closeFile];

應該在你的

if (!myHandle)

測試的其他情況。

+0

是的,我添加了零檢查,因爲它只是停止寫作,我不知道爲什麼。如果它有「打開的文件太多」,我沒有正確關閉文件? –

+0

您肯定需要調用closeFile函數,否則fileHandleForWritingToURL將最終失敗,並出現NSCocoaErrorDomain錯誤24.您是否使用ARC? self.logPath是否更改? self.logPath的價值是什麼?在它失敗之前,你可以調用你的日誌方法多少次? – mjswan

+0

'self.logPath'是我要寫入的字符串路徑。我通過抓取文檔目錄來獲得它。你可以把它看作是一個在函數中定義的靜態字符串,它是一個有效的路徑。它不會改變。是的,這是使用ARC。 –