【问题标题】:FileStream move instead of copyFileStream 移动而不是复制
【发布时间】:2017-02-15 03:18:54
【问题描述】:

我正在尝试连接两个非常大的文件(可能是几 GB)。我不需要保留他们的原始内容,我只对结果感兴趣。

我发现将一个文件附加到另一个文件的最有效方法是使用FileStream.CopyTo()

但是,众所周知,移动操作比复制便宜得多。如果我想在文件系统中移动文件,我会使用File.Move 而不是File.Copy

有没有文件流的等价物?或者围绕文件的任何其他方式?我也可以使用非C# 方法。

【问题讨论】:

  • 但是您不能以流式方式(逐字节)删除文件,那么该移动实际上应该做什么?

标签: c# file stream filestream


【解决方案1】:

没有。

文件系统移动操作只会改变文件的路径——这就是它快速的原因。当您尝试合并两个文件时,无论如何都没有类似的东西。

你能做的最好的就是将第二个文件的内容附加到第一个文件中——至少你可以避免复制第一个文件。这就是FileStream.CopyTo 所做的(不要忘记先搜索到第一个文件的末尾)。

【讨论】:

    【解决方案2】:

    文件系统中的“文件”是比流更高级别的概念。当您在文件系统中执行文件操作时,很多事情正在“幕后”发生,您没有意识到优化性能等。

    另一方面,文件流是一种编程概念,可让您以更精细的方式处理文件。您不能简单地将文件流“移动”到另一个文件流; “移动”是操作系统造成的一种错觉,正如 Luaan 指出的那样,它只是操作系统只是更改指向文件的指针,而不是拾取文件并将其移动到驱动器上的其他位置。

    如果你仔细想想,这怎么可能真的有效?文件是存储在某些静态介质(例如磁盘驱动器)中的一系列 1 和 0。您不能同时清除文件所在的 1 和 0 并将它们写入新位置。您必须先将 1 和 0 复制到新位置,然后在旧位置删除它们。如果操作系统真的这样做了(而不是前面提到的指针方法),它会将操作抽象出来,以便用户似乎认为文件只是被拾取并移动到其他地方一步。

    【讨论】:

    • 好吧,如果您有文件系统对齐的文件,理论上您可以将文件视为由两者的部分组成的碎片文件。但不是。只是不要。不。不。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 2016-02-11
    相关资源
    最近更新 更多