首页 > 解决方案 > 使用 CopyToAsync 时,FileStream 使用块未正确处理文件

问题描述

我有一种情况,我需要将一小部分文件异步移动到网络上的另一个位置。我有以下方法可以做到这一点,但是在尝试删除源文件时偶尔会引发 IO 异常(无法访问文件 x,因为它正在被另一个进程使用)。我希望 using 块能够为我处理 FileStreams,所以我不确定发生了什么。

public static async Task MoveFileAsync(string sourceFile, string destinationFile)
    {
        using (var sourceStream = new FileStream(sourceFile, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, FileOptions.Asynchronous | FileOptions.SequentialScan))
        using (var destinationStream = new FileStream(destinationFile, FileMode.CreateNew, FileAccess.Write, FileShare.None, 4096, FileOptions.Asynchronous | FileOptions.SequentialScan))
        {
            await sourceStream.CopyToAsync(destinationStream);
        }

        File.Delete(sourceFile);
    }

我尝试在 Parallel.ForEach 循环中使用 File.Move 执行此操作,但发现上述方法在我的测试中要快得多。任何有关可能发生的事情的指示将不胜感激。

标签: c#async-awaitio

解决方案


推荐阅读