FileStream是否非常慢

本文关键字:非常 是否 FileStream | 更新日期: 2023-09-27 18:22:22

我试图复制一个5 GB ISO文件到32;GB闪存驱动器,带29;GB的可用空间。

Windows 7拒绝让我将文件拖放到闪存驱动器上,报告文件对于目标文件系统来说太大

我最终了解到这是因为驱动器被格式化为FAT32而不是NTFS,但在我写下这个例程来复制文件之前:

private void copyFile(string from, string to) {
  bool ok = true;
  using (StreamReader sr = new StreamReader(from, true)) {
    using (StreamWriter sw = new StreamWriter(to, false, sr.CurrentEncoding)) {
      int FOUR_K = 4048;
      char[] buf = new char[FOUR_K];
      try {
        while (-1 < sr.Peek()) {
          int len = sr.Read(buf, 0, FOUR_K);
          sw.Write(buf, 0, len);
          sw.Flush();
        }
      } 
      catch (Exception err) {
        ok = false;
        throw err;
      }
    }
  }
  if (ok) {
    Console.WriteLine("Done!");
  }
}

我让它运行了大约一个小时,只有达到了270 文件大小为MB。

怎么回事?

是什么原因导致我的文件花了这么长时间?

是我选择的FOUR_K可变尺寸吗?

[更新]

我有两个ISO文件:Win8-32bit在~3 GB和Win8-64位的开发程序;GB。使用拖放,Windows资源管理器复制了;GB文件到我的32;GB闪存驱动器,大约三分钟。

使用Marc Gravell的技术,我再次尝试:

[STAThread]
static void Main(string[] args) {
  using (OpenFileDialog dlg = new OpenFileDialog()) {
    dlg.Title = "Select File";
    if (dlg.ShowDialog() == DialogResult.OK) {
      using (FolderBrowserDialog fdg = new FolderBrowserDialog()) {
        fdg.Description = "Select Destination";
        if (fdg.ShowDialog() == DialogResult.OK) {
          DateTime start = DateTime.Now;
          Console.WriteLine("Started at {0:g}.'nWorking...", start);
          using (FileStream fin = File.Open(dlg.FileName, FileMode.Open)) {
            using (FileStream fout = new FileStream(Path.Combine(fdg.SelectedPath, dlg.SafeFileName), FileMode.Create)) {
              try {
                fin.CopyTo(fout);
              } catch (Exception err) {
                Console.WriteLine("An Error Occurred:");
                Console.WriteLine(err.Message);
              }
            }
          }
          DateTime end = DateTime.Now;
          TimeSpan span = (end - start);
          Console.WriteLine("Process Ended at {0}.'nThe total minutes passed = {1}.", end, span.TotalMinutes);
          Console.WriteLine("Press Any Key.");
          Console.ReadKey();
        }
      }
    }
  }
}

使用上面的FileStream实例,程序运行了大约8个小时,完全复制了4,194,300 KB,然后抛出内存不足异常。

FileStream是否非常慢

我不知道性能问题(听起来很奇怪),但没有理由在这里使用StreamReader/StreamWriter,因为您可以在二进制级别进行复制。事实上,ISO图像不是文本,因此将其读取到char数据中很可能会破坏内容。要了解更多信息,即使您不想使用File.Copy,这里也只需要:

using(var inFile = File.OpenRead(source))
using(var outFile = File.Create(destination))
{
    inFile.CopyTo(outFile);
}

要想在一小时内获得27万,你需要努力(除非IO基本上已经失效);我猜它在某个地方出错了。

我怀疑每次都是Flush调用。

如果您使用的是.NET4,Stream现在有一个CopyTo方法:

using (var input = File.OpenRead(fromFile))
{
  using (var output = File.OpenWrite(toFile))
  {
    input.CopyTo(output);
  }
}

如果您试图复制二进制文件,为什么要使用StreamReader/StreamWriter?试试这样的东西:

using (FileStream source = File.Open(@"c:'Source'data.iso", FileMode.Open))
{
    FileStream destination = new FileStream(@"F:'Desitnation'data.iso",FileMode.OpenOrCreate));
    source.CopyTo(destination);
    destination.Close();
}