2017-10-10 51 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); 
      } 
     }