2010-08-17 44 views
0

測試人員說他只收到一次此消息,而我似乎無法再現該消息或找出此消息是如何出現的。在堅果殼中,我的應用程序啓動後臺線程並從我們的服務器獲取數據。一旦我們完成下載數據,我們將它存儲在一個xml文件中,所以我們可以從這個文件中獲取數據,以便在關閉xml的解析過程中關閉數據。一旦我完成解析XML我刪除該文件。這是我的代碼刪除。嘗試刪除存在的文件時出錯

-(void)deleteSavedXmlServerData 
{ 
    AppDelegate_Shared* appDelegate = (AppDelegate_Shared*)[[UIApplication sharedApplication] delegate]; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *fileToLoad = [NSString stringWithFormat:@"%@/%@/upload.xml", [paths objectAtIndex:0], appDelegate.userId]; 

    if([[NSFileManager defaultManager] fileExistsAtPath:fileToLoad] == YES) 
    { 

     NSError *error = nil; 
     [[NSFileManager defaultManager] removeItemAtPath:fileToLoad error:&error]; 
     if(error != nil) 
     { 

      eNSLog(@"%s Error Parsing old data: %@ info: %@", __PRETTY_FUNCTION__, error, [error userInfo]); 

      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Problem With Syncing" 
                 message:@"Problem reading in old data." 
                 delegate:nil 
               cancelButtonTitle:@"ok" 
               otherButtonTitles:nil]; 
      [alert show]; 
      [alert release]; 
     } 
    } 
} 

一切看起來都很完美,如果這個文件沒有被刪除就沒有什麼大不了的。但我很困惑,爲什麼我會有刪除這個文件的問題。

當我檢查了什麼是錯誤信息,這是我得到這個。

-[ServerSync deleteSavedXmlServerData] Error Parsing old data: Error Domain=NSCocoaErrorDomain Code=4 UserInfo=0x11f3ed60 "Operation could not be completed. (Cocoa error 4.)" info: { 
    NSFilePath = "/var/mobile/Applications/CD181518-512F-4A0E-82ED-C438886E4A1D/Documents/71BD9A11-A604-6001-549C-DF6582F60124/upload.xml"; 
    NSUserStringVariant = Remove; 
} 

如果有人知道爲什麼如果我的文件存在,我創建它,爲什麼我不能刪除它?

更新

是困惑我的大部分問題,就是爲什麼第一個if語句表示該文件存在,但我是從嘗試刪除的文件得到錯誤信息說,我的文件不存在?

回答

2

閱讀NSFileManager的文檔(不知道我是否第一次錯過),它說不使用單例方法[NSFileManager defaultManager],因爲NSFileManager不是線程安全的。從那以後,我沒有遇到這個問題。

1

它看起來像文件的目錄路徑是/.../71BD9A11-A604-6001-549C-DF6582F60124CD181518-512F-4A0E-82ED-C438886E4A1D/Documents/71BD9A11-A604-6001-549C-DF6582F60124。它應該以/ Documents結尾。

谷歌搜索NSCocoaErrorDomain給出NSFileNoSuchFileError = 4

+0

哎呀,我貼錯fileToLoad。我將帖子編輯爲正確的。至於NSCocoaErrorDomain代碼,那是我困惑的一部分。我的第一條if語句檢查文件是否存在,並且它確實存在。爲什麼remove語句說它不存在? – NixonsBack 2010-08-18 18:24:29

+1

您正在使用線程。另一個線程可能訪問它嗎? – 2010-08-19 00:10:59

+0

這是一種可能性,但該文件僅在同一個線程上創建和刪除。不應該訪問不同的線程,除非fileManger在主線程上執行所有操作。我會再給這個支票。 – NixonsBack 2010-08-23 18:02:58

0

在刪除文件之前測試文件是否存在競爭條件,因爲另一個線程可以在執行刪除代碼之前將其刪除。重構代碼首先刪除文件並忽略與找不到文件相關的任何「錯誤」會更好。

順便說一句:關於[NSFileManager defaultManager]不是線程安全的答案並不完全正確。除了使用委託進行通知時,它是線程安全的。

0

根據這個答案

NSFileManager: removing item

,我們需要有一個文件://前綴。您可以使用[NSURL fileURLWithPath:]來實現它。

爲SWIFT使用NSURL(fileURLWithPath: realmPath)

相關問題