使用File.Copy移动文件或将流写入该位置有什么区别吗?

我正在重构一些代码,有一个问题,我可以使用一些评论。

原始代码将文件下载到流中。 然后,在使用File.Copy覆盖生产目录中的现有文件之前,它会将流写入临时目录中的File。

将它写入temp目录并使用File.Copy与仅将流写入生产目录相比,是否有任何好处?

一个原因可能是File.Copy比写入流更快,并且减少了某人在写入文件时读取文件的机会。 但这甚至会发生吗? 我还应该记住什么? 我正在考虑将temp目录分解出来。

MemoryStream stream = new MemoryStream(); ....Download and valiate stream.... using (Stream sourceFileStream = stream) { using (FileStream targetFileStream = new FileStream(tempPath, FileMode.CreateNew)) { const int bufferSize = 8192; byte[] buffer = new byte[bufferSize]; while (true) { int read = sourceFileStream.Read(buffer, 0, bufferSize); targetFileStream.Write(buffer, 0, read); if (read == 0) break; } } } File.Copy(tempPath, destination, true); 

只是将流写入目的地。

这只是我的代码,我会正确使用像sourceFileStream.CopyToAsync(TargetFileStream);这样的东西sourceFileStream.CopyToAsync(TargetFileStream);

File.Copy简单地封装了流的使用等。没有任何区别。

好吧,想想当你开始下载并覆盖现有文件时会发生什么,然后由于某种原因下载被中止,你将留下一个损坏的文件。 但是,首先在另一个位置下载并将其复制到目标目录会导致问题。

编辑:好的,现在看到代码。 如果文件已经在MemoryStream中,那么实际上没有理由将文件写入临时位置并将其复制。 你可以只做File.WriteAllBytes(destination,stream.ToArray());

将字节文件流组装到一个隔离的位置并且只有在它被组装后才能将其复制到生产区域是一种更好的做法,原因如下:

  1. 假设在组装阶段电力不足,当它处于隔离文件夹(例如’temp’)时,您最终会得到部分文件,您可以重新检查并稍后忽略..但是如果您直接在生产中组装文件并且电力不足发生 – 下次打开应用程序时,您需要检查所有非“静态”文件的完整性。

  2. 如果文件正在生产中使用并且“正在组装”新文件很长 – 最终让您的用户等待组装过程完成,但是当组装缓冲区的过程如同您的示例一样 – 只需复制就绪文件将为您的用户造成更短的等待时间。

  3. 假设磁盘空间已满…与#1中的问题相同。

  4. 假设应用程序中的另一个进程存在内存泄漏,并且在完成组装过程之前应用程序已被清除。

  5. 假设[填写您的灾难案例] ……

所以,是的。 在你的例子中做更好的做法,但真正的问题是这个文件对你的应用程序有多重要? 它只是另一个数据文件,如“保存游戏”文件,还是可以粉碎您的应用程序,如果无效?