异步文件复制的问题

时间:2017-10-10 02:45:46

标签: c# .net asynchronous concurrency task

我正在使用Microsoft提供的文章this post

异步复制文件

我遇到的问题是,当文件完成复制时,它不会保留日期修改值,并设置为文件创建的时间。

为了弥补这一点,我试图在使用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); } } } 静态方法完成复制后为每个文件设置日期修改时间。

File.SetLastWriteTime

不幸的是,似乎await reader.CopyToAsync(writer)方法在File.SetLastWriteTime完成之前立即执行。

如何确保reader.CopyToAsync方法在Task.Run完成之后才会执行?

如果我将方法更改为在{{1}}内同步复制,但似乎无法确定这是否是正确的方法,它似乎按预期工作。

1 个答案:

答案 0 :(得分: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);
            }
        }