使用File有什么不同吗?复制以移动文件或将流写入位置

本文关键字:文件 移动 位置 复制 什么 File 使用 | 更新日期: 2023-09-27 18:12:06

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

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

先将它写入临时目录,然后使用File。复制,而不是直接将流写入生产目录?

一个原因可能是文件。复制比写入流更快,并且减少了有人在写入文件时读取文件的机会。但这真的会发生吗?我还应该考虑些什么呢。我正在考虑把临时目录分解。

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);

使用File有什么不同吗?复制以移动文件或将流写入位置

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

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

File.Copy简单地封装了流的使用等。

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

  1. 假设在装配阶段缺电,当它在孤立的文件夹,比如"temp",你只会得到部分文件稍后你可以重新检查并忽略……但是如果你直接在生产上组装文件,然后发生电源短缺-下一个打开应用程序时,需要检查完整性

  2. 如果文件被用于生产和"正在组装"的新文件很长-你最终让你的用户等待组装过程完成,然而,当组装缓冲区的过程是在你的例子中-简单地复制准备好的文件会给你的用户造成更短的等待时间。

  3. 假设磁盘空间已满…

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

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

所以,是的。按照您的示例进行操作是更好的实践,但真正的问题是该文件对您的应用程序有多重要?它只是另一个数据文件,如"保存游戏"文件或它是什么东西,可以粉碎你的应用程序,如果无效?