2011-10-24 64 views
-1

複製和訪問文件時,我遇到了多線程問題。訪問由單獨線程創建的文件

我有一個服務,即下載和解壓Zip文件,然後將其複製從解壓文件夾中的文件到正確的位置:

//Download, and uzip archive... 

//Copy a needed file to its right location 
File.Copy(fileName, fileDestination); 

然後,我開始一個單獨的線程,需要訪問複製文件:

TheadPool.QueueUserWorkItem(s => processCopiedFile(fileDestination)); 

下面的代碼片段從ProcessCopiedFile:

private void ProcessCopiedFile(string filePath) 
{ 
    ... 
    //Load the file, previously copied here 
    var xml = XDocument.Load(filePath); 
    ... 
    //Do other work... 
} 

的XDoument.Load調用失敗,出現異常:

The process cannot access the file <FileName> because it is used by another process. 

好像File.Copy保持鎖定結果文件。什麼時候同步工作,它的工作沒有錯誤。 你有什麼想法嗎? Thx。

回答

1

File.Copy不保持任何打開或鎖定狀態,這是一個需要一些時間的原子操作,具體取決於磁盤/網絡I/O和文件大小。

當然,當從同步移動到異步時,應確保在複製仍在進行時不訪問目標文件。

+0

首先我打電話File.Copy(synchronuously),然後我開始新的主題。原因File.Copy同步調用,它確保在新線程啓動之前完成其工作。或者我錯了某處? – Skog

+0

+1 - 只是爲了澄清最後一部分:當文件被複制時,Windows對文件進行獨佔鎖定。 – ebb

0

複製與流的文件,以避免窗鎖從File.Copy

using(var s = new MemoryStream(File.ReadAllBytes(filePath)) 
{ 
    using(var fs = new FileStream(newLocation, FileMode.Create)) 
    { 
     s.WriteTo(fs); 
    } 
} 
+1

正確複製文件是火箭科學。需要注意保留文件中的文件屬性和備用流。不要自己動手。 –