C#-复制文件和恢复支持

本文关键字:恢复 支持 文件 复制 C#- | 更新日期: 2023-09-27 17:52:39

嗨有人有可行的示例代码来复制文件并支持在源代码断开连接的情况下恢复它们吗?

在这个例子中,我正在复制视频文件。如果源已断开连接,即usb已拔出,我如何支持再次恢复它们?我在stackoverflow上尝试了一些代码,但恢复后,视频文件似乎已损坏。FileStream是视频传输/简历的最佳解决方案吗?

欢迎任何其他建议。

private void CreateNewCopyTo(FileStream source, FileStream dest) {
  int size = (source.CanSeek) ? Math.Min((int)(source.Length - source.Position), 0x2000) : 0x2000;
  byte[] buffer = new byte[size];
  int read;
  long fileLength = source.Length;
  while ((read = source.Read(buffer, 0, buffer.Length)) > 0) {
    dest.Write(buffer, 0, read);
    dest.Close();
    dest = new FileStream(dest.Name, FileMode.Append, FileAccess.Write);
  }
  dest.Close();
}
private void ResumeCopyTo(FileStream source, FileStream dest) {
  int size = (source.CanSeek) ? Math.Min((int)(source.Length - source.Position), 0x2000) : 0x2000;
  byte[] buffer = new byte[size];
  long TempPos = source.Position;
  while (true) {
    int read = source.Read(buffer, 0, buffer.Length);
    if (read <= 0)
      return;
    dest.Write(buffer, 0, read);
    dest.Close();
    dest = new FileStream(dest.Name, FileMode.Append, FileAccess.Write);
  }
}

C#-复制文件和恢复支持

尝试在ResumePyTo方法中插入source.Seek(dest.Length, SeekOrigin.Begin);作为第一行。

创建一个与您复制的文件大小相同的文件。如果连接断开,在文件中写一个"书签"。文件结尾的一些任意字符串,告诉您停止的位置

最好获取原始文件的哈希值,以确定自上次复制尝试以来文件是否已更改。(如果文件不同,那么您应该将目标中的数据与源中的数据进行检查,也许还可以使用另一个数据哈希。(

其中最重要的部分是在源和目的地中查找两个文件中完全相同的点。在恢复尝试之前。

您需要确保您的查找将为您提供源文件中的下一个字节。不是你留下的同一个字节。否则,你的数据将只有一个重复的字符。这将损坏数据。

(例如,如果源文件是12345678901234567890,而您的目的地是123456,则您不想在6继续,您想在7继续。否则您的目的地将是123456678901234567890(

假设文件不会随时间变化,我们可以使用您编写的函数。但是,它们应该稍微修改并简化为一个功能。

    private void ResumeCopy(FileStream source, FileStream dest)
    {
        byte[] buffer = new byte[0x10000]; //use 64kB buffer
        int read;
        source.Seek(dest.Length, SeekOrigin.Begin);
        while ((read = source.Read(buffer, 0, buffer.Length)) > 0)
        {
            dest.Write(buffer, 0, read);
            dest.Flush();
        }
    }

我们可以创建一个附加功能:

    private void ResumeCopyTo(string sourceFilePath, string destFilePath)
    {
        FileStream input = new FileStream(sourceFilePath, FileMode.Open, FileAccess.Read);
        FileStream output = new FileStream(destFilePath, FileMode.Append, FileAccess.Write);
        ResumeCopy(input, output);
        output.Close();
        input.Close();
    }

生产环境的想法:

  • 添加错误处理
  • 检查文件是否已更改(使用校验和(
  • 以独占模式打开源文件

顺便说一句:通过这种方式,我在9个小时内通过质量非常差的网络连接复制了一个15GB的文件。