2015-06-16 25 views
4

我有一個問題,如何知道該文件是否可以訪問?如何知道一個文件是通過NSFileManager寫入

例如,文件寫的,但沒有完成呢。 我再次檢查該文件,

我用

[[NSFileManager defaultManager] fileExistsAtPath:filePath]; 

它返回true ...但該文件是不可訪問。

如何確定文件已準備好?

感謝

韋伯

編輯 也許我沒有明確告訴我的問題。我的意思是如果你開始傳輸視頻文件。運輸完成前。視頻文件無法訪問,但您仍然可以獲取傳輸文件的一部分。

+0

「isReadableFileAtPath」 可以提供幫助。 –

+0

isReadableFileAtPath不起作用,即使文件只有一個字節,它也會返回true。 –

回答

0

NSFileCoordinatorNSFilePresenter只是爲創建。您可能會從wwdc中找到有趣的Advanced iCloud Document Storage視頻,其中涵蓋了這些課程的用法。 Building a Document-based App也會很高興收看。

+0

非常接近我所尋找的,從未閱讀過此文檔,謝謝 –

+0

NSFileCoordinator和NSFilePresenter只有在使用另一個NSFilePresenter移動文件時才起作用。這意味着如果其他應用程序(例如使用NSFileManager)在刪除或創建文件時不會收到通知。 – kelin

0

嘗試使用下面的代碼來獲取文件的數據:使用GCD概念在異步方式

NSURL *url = [NSURL fileURLWithPath:filePath]; 
NSData *readData = [NSData dataWithContentsOfURL:url]; 
+0

我認爲它不會工作...因爲您可以獲取數據,但它們不是完整的文件。只是數據的一部分。 但仍然感謝您的回覆。 –

1

寫入數據,一旦完成,完成處理程序將被執行(其中寫作過程完成應檢測)

調度I/O方便的API,可以執行異步讀取和文件描述符寫入操作。該API支持基於流的語義來訪問文件描述符的內容。

方法:

void dispatch_write (dispatch_fd_t fd, dispatch_data_t data, dispatch_queue_t queue, void (^handler)(dispatch_data_t data, int error)); 

編號:https://developer.apple.com/library/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/index.html#//apple_ref/c/func/dispatch_write

+0

我想我從你的回覆中得到了一些想法,是的,我正在使用流寫入文件。 –

+0

謝謝,如果它解決了你的問題,那麼請標記答案。 –

1

基本上你需要檢查文件的屬性和particullary的NSFileBusy屬性:

if ([fileManager fileExistsAtPath:filePath]) { 
    NSDictionary *attributes = [fileManager attributesOfItemAtPath:filePath error:nil]; 
    NSLog(@"File Busy %@", [attributes objectForKey:NSFileBusy]); 
} 
+0

嘿,我只能得到「File Busy(null)」,我不知道爲什麼,但是我檢查屬性-fileSIzE和fileModificationDate,它在異步寫入完成之前每次都改變。 –

+0

您可以檢查fileSize並將其與原始文件大小(每X毫秒)比較一次,比方說100,並且一旦目標文件大小與您知道複製操作完成的源文件大小相匹配 – Lefteris

相關問題