gpt4 book ai didi

c# - FileStream 很慢吗?

转载 作者:行者123 更新时间:2023-11-30 13:23:43 27 4
gpt4 key购买 nike

我试图将 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, 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-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,然后抛出了内存不足异常。

最佳答案

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

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

1小时270k需要努力(除非IO基本死掉);我的猜测是它在某处引发了错误。

关于c# - FileStream 很慢吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9102698/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com