2013-03-20 123 views
4

我試圖用[[NSFileManager defaultManager] copyItemAtPath: toPath: error:]複製一個文件不存在的文件,但它與下面的錯誤而失敗:的NSFileManager copyItemAtPath抱怨確實存在

4: The file does not exist.

相關的代碼如下,並且該文件確實存在,路徑字符串是正確的,因爲它是事先用完全相同的文件路徑字符串創建的。

NSFileManager* manager = [NSFileManager defaultManager]; 
NSError* error; 
NSString* fileName = [Sound getFileName:Title]; 
NSString* oldDirectory = [NSString stringWithFormat:@"%@%@/", [settings stringForKey:@"downloadFolder"], authorFolder]; 
NSString* oldFile = [oldDirectory stringByAppendingFormat:@"%@.mp3", fileName]; 
NSString* newFile = [NSString stringWithFormat:@"%@/iTunes/iTunes Media/Automatically Add to iTunes/%@.mp3", [NSSearchPathForDirectoriesInDomains(NSMusicDirectory, NSUserDomainMask, YES) objectAtIndex:0], fileName]; 
BOOL result = [manager copyItemAtPath:oldFile toPath:newFile error:&error]; 
if (!result && error) 
{ 
    NSLog(oldFile); 
    NSLog(@"There was an error copying the file to the iTunes directory! %@", [error localizedDescription]); 
} 

這不是確切的代碼,但所有相關的代碼應該在上面。如果我使用[manager fileExistsAtPath:oldFile],結果是

什麼會導致複製失敗,並說該文件不存在,即使它呢?

UPDATE:

發出定額。結果是輸出文件夾實際上是自動添加到iTunes.localized,但是當通過查找器分頁時,我沒有注意到這一點。修復輸出路徑解決了問題!謝謝您的幫助。

+0

記住了'copyItemAtPath:toPath:錯誤:'方法,如果目標文件已經存在失敗。它不會覆蓋現有的文件。 – rmaddy 2013-03-20 06:15:46

+0

@rmaddy感謝你的擡頭。我已在本地更正了我的代碼以檢查此問題,但我已手動確保目標文件不存在,並且仍然收到此錯誤。 – 2013-03-20 06:35:12

回答

5

如果任何目的地的路徑中的目錄不存在,你會得到一個類似的錯誤,如果源不存在你會得到什麼。檢查什麼[manager fileExistsAtPath:[newFile stringByDeletingLastPathComponent] isDirectory:&isDir]返回。

+0

對於isDir和實際返回值,結果爲NO。我會認爲這意味着我的問題在於輸出路徑。我會進一步研究,希望能夠獨立解決我的問題。謝謝你的擡頭,我至少知道現在哪裏好看 – 2013-03-20 15:13:03

+0

標記爲答案,因爲沒有給出正確的答案,但這導致我找到問題! – 2013-03-20 15:24:31

+0

感謝您接受,但我很困惑,爲什麼你說這是不正確的。這聽起來像我完全預測了什麼是錯的。 – 2013-03-20 15:29:48

3

您正在使用的API錯誤。您需要查看-copyItemAtPath:toPath:error:的返回值。只有在返回NO時,這意味着發生了錯誤。

如果您使用ARC,您error可變應該nil沒有發生錯誤(儘管這在技術上並不保證),但如果你使用它MRR可能不會,因爲你永遠不初始化它。

+0

我實際上試過使用返回值,並且它與錯誤一起返回NO。它也沒有真正複製文件,所以這是一個非常大的指示器,它不起作用。 – 2013-03-20 06:33:59