c# – FileStream很慢吗?

c# – FileStream很慢吗?,第1张

概述我试图将一个5 GB的ISO文件复制到一个具有29 GB可用空间的32 GB闪存驱动器上. Windows 7拒绝让我将文件拖放到闪存驱动器上,报告文件对于目标文件系统来说太大了. 我最终了解到这是因为驱动器被格式化为FAT32而不是NTFS,但是在我编写此例程以复制文件之前: private void copyFile(string from, string to) { bool ok = 我试图将一个5 GB的ISO文件复制到一个具有29 GB可用空间的32 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,FOUR_K);          sw.Write(buf,len);          sw.Flush();        }      }       catch (Exception err) {        ok = false;        throw err;      }    }  }  if (ok) {    Console.Writeline("Done!");  }}

我让它运行了大约一个小时,文件大小只有270 MB.

这是怎么回事?

我的代码中有什么导致我的文件花了这么长时间?

这是我选择的FOUR_K变量大小吗?

[UPDATE]

我有两个ISO文件:Win8-32bit在~3 GB,Win8-64bit-Developer在~5 GB.使用拖放功能,windows资源管理器在大约三分钟内将3 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,然后抛出了Out Of Memory Exception.

解决方法 我不知道性能问题(听起来很奇怪),但是没有理由在这里使用StreamReader / StreamWriter,因为你可以只在二进制级别进行复制.实际上,ISO映像不是文本,因此将其读入char数据很可能会破坏事物.有关信息,即使您不想使用 File.Copy,您只需要:

using(var infile = file.OpenRead(source))using(var outfile = file.Create(destination)){    infile.copyTo(outfile);}

要在一小时内获得270k,你需要努力(除非IO基本上死了);我的猜测是它在某处发生了错误.

总结

以上是内存溢出为你收集整理的c# – FileStream很慢吗?全部内容,希望文章能够帮你解决c# – FileStream很慢吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1223366.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存