2017-10-10 73 views
0

我異步複製文件與微軟提供的https://docs.microsoft.com/en-us/dotnet/standard/io/asynchronous-file-i-o問題與文件複製異步

我遇到使用此問題是,當文件完成複製後,它不會保留修改日期有價值物品和設置爲創建文件的時間。

爲了彌補這一點,我試圖設置每個文件完成複製後的日期修改時間,使用靜態方法File.SetLastWriteTime

foreach (var file in dir.EnumerateFiles()) 
{ 
    string temppath = Path.Combine(destDirName, file.Name); 
    using (FileStream reader = new FileStream(file.FullName, FileMode.Open, FileAccess.Read)) 
    { 
     using (FileStream writer = new FileStream(temppath, FileMode.Create, FileAccess.ReadWrite)) 
     { 
      await reader.CopyToAsync(writer); 
      File.SetLastWriteTime(temppath, file.LastWriteTime); 
     } 
    } 
} 

遺憾的是,似乎之前await reader.CopyToAsync(writer)已完成File.SetLastWriteTime方法立即執行。

如何確保在reader.CopyToAsync完成後才能執行File.SetLastWriteTime方法?

如果我更改方法在Task.Run內同步複製,但它不能確定這是否是正確的方法。

+1

「不幸的是,似乎在等待reader.CopyToAsync(writer)完成之前,File.SetLastWriteTime方法立即執行。」你確定?你經歷過什麼樣的系統行爲導致你這麼說? –

+0

_「如何才能確保File.SetLastWriteTime方法不會在reader.CopyToAsync完成後才執行?」 - 您發佈的代碼會執行此操作。所以,如果你有問題,那很可能是你沒有發佈的代碼。你的問題應該包括一個可靠地再現問題的良好[mcve]。或者,也許你應該嘗試'File.Copy()'方法(使用'Task.Run()'運行它以獲得異步行爲)。 –

+0

我收到一條消息,指出它無法在文件上設置時間,因爲它正在被另一個進程使用。 – Ambidex

回答

1

我能弄明白。

它無法設置文件時間的原因是因爲它仍在流內。

我只是將該方法移出寫入流,並解決了問題。

 foreach (var file in dir.EnumerateFiles()) 
     { 
      string temppath = Path.Combine(destDirName, file.Name); 
      using (FileStream reader = new FileStream(file.FullName, FileMode.Open, FileAccess.Read)) 
      { 
       using (FileStream writer = new FileStream(temppath, FileMode.Create, FileAccess.ReadWrite)) 
       { 
        await reader.CopyToAsync(writer); 

       } 
       File.SetLastWriteTime(temppath, file.LastWriteTime); 
      } 
     }