FileStream использует блок, не удаляя файл должным образом при использовании CopyToAsync - PullRequest
2 голосов
/ 22 апреля 2020

У меня есть ситуация, когда мне нужно асинхронно переместить небольшой список файлов в другое место в сети. У меня есть следующий метод, чтобы сделать это, но иногда выдает IO Exception (не может получить доступ к файлу 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);
    }

Я пытался сделать это с File.Move в Parallel.ForEach l oop но наш метод оказался намного быстрее в моих тестах. Будем весьма благодарны за любые указания на то, что может происходить.

...