我的问题涉及文件复制性能。我们有一个媒体管理系统,需要在文件系统上将文件移动到不同的位置,包括同一网络上的Windows共享、FTP站点、AmazonS3等。当我们全部使用一个Windows网络时,我们可以使用 System.IO.File.Copy(source, destination) 来复制文件。由于很多时候我们只有输入流(如MemoryStream),我们尝试抽象Copy操作以接受输入流和输出流,但我们发现性能大幅下降。以下是一些用于复制文件的代码,供讨论。
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()慢这么多吗?有没有任何方法可以提高它的性能?我是不是必须要特别设计逻辑来判断文件是否在同一个Windows位置中拷贝,如果是的话就用File.Copy(),否则就使用流?
请告诉我你的想法以及是否需要额外的信息。我已经尝试使用不同的缓冲区大小,似乎64k缓冲区大小对于我们的“小”文件是最优的,而256k+缓冲区大小对于我们的“大”文件更好一些,但无论如何,性能都远不如File.Copy()。预先感谢您!