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 (). Заранее спасибо!