File.Copy или Manual FileStream.Write для копирования файла

Моя проблема связана с производительностью копирования файлов. У нас есть система управления мультимедиа, которая требует много перемещения файлов в файловой системе в разные места, включая общие папки Windows в той же сети, FTP-сайты, AmazonS3 и т. Д. Когда мы все были в одной сети Windows, мы могли бы избежать использования System.IO.File.Copy (источник, место назначения) для копирования файла. Поскольку во многих случаях у нас есть только входной поток (например, MemoryStream), мы пытались абстрагировать операцию копирования, чтобы получить входной поток и выходной поток, но мы наблюдаем значительное снижение производительности. Ниже приведен код для копирования файла для использования в качестве темы для обсуждения.

public void Copy(System.IO.Stream inStream, string outputFilePath)
{
    int bufferSize = 1024 * 64;

    using (FileStream fileStream = new FileStream(outputFilePath, FileMode.OpenOrCreate, FileAccess.Write))
    {

        int bytesRead = -1;
        byte[] bytes = new byte[bufferSize];

        while ((bytesRead = inStream.Read(bytes, 0, bufferSize)) > 0)
        {
            fileStream.Write(bytes, 0, bytesRead);
            fileStream.Flush();
        }
    }
}

Кто-нибудь знает, почему это работает намного медленнее, чем File.Copy? Что я могу сделать, чтобы улучшить производительность? Должен ли я просто ввести специальную логику, чтобы увидеть, копирую ли я из одного местоположения окна в другое - в этом случае я бы просто использовал File.Copy, а в других случаях я буду использовать потоки?

Пожалуйста, дайте мне знать, что вы думаете и нужна ли вам дополнительная информация. Я пробовал разные размеры буферов, и кажется, что размер буфера в 64 Кб является оптимальным для нашего & quot; маленького & quot; файлы и 256k + - лучший размер буфера для нашего & quot; большого & quot; файлы - но в любом случае он работает намного хуже, чем File.Copy (). Заранее спасибо!

Ответы на вопрос(8)

Ваш ответ на вопрос