我试图将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
变量大小吗?
[UPDATE]
我有两个ISO文件:大约3 GB的Win8-32bit和大约5 GB的Win8-64bit-Developer。使用拖放功能,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
,然后抛出了内存异常。
答案 0 :(得分:8)
我不知道性能问题(听起来很奇怪),但没有理由在{strong}使用StreamReader
,,因为你可以只需复制二进制级别。实际上,ISO图像不是文本,因此将其读入StreamWriter
数据很可能会破坏事物。有关信息,即使您不想使用File.Copy
,您只需要:
char
要在一小时内获得270k,你需要努力(除非IO基本上死了);我的猜测是它在某处发生了错误。
答案 1 :(得分:3)
我怀疑每次都是Flush
来电。
如果您使用的是.NET 4,Stream现在有一个CopyTo
方法:
using (var input = File.OpenRead(fromFile))
{
using (var output = File.OpenWrite(toFile))
{
input.CopyTo(output);
}
}
答案 2 :(得分:2)
如果您要复制二进制文件,为什么要使用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();
}