gpt4 book ai didi

c# - 在非常大的文件流上处理缓慢?

转载 作者:行者123 更新时间:2023-11-30 20:48:01 25 4
gpt4 key购买 nike

我有这个代码

string archiveFileName = BuildArchiveFileName(i, null);
string tmpArchiveFileName = BuildArchiveFileName(i, "tmp");
try
{
using (FileStream tmpArchiveMemoryStream = new FileStream(tmpArchiveFileName, FileMode.Create))
{
using (BinaryWriter pakWriter = new BinaryWriter(tmpArchiveMemoryStream))
{
if (i == 0)
{
WriteHeader(pakWriter, pakInfo.Header);
WriteFileInfo(pakWriter, pakInfo.FileList);
uint remainingBytesToDataOffset = pakInfo.Header.DataSectionOffset - CalculateHeaderBlockSize(pakInfo.Header);
pakWriter.Write(Util.CreatePaddingByteArray((int)remainingBytesToDataOffset));
}

foreach (String file in pakInfo.FileList.Keys)
{
DosPak.Model.FileInfo info = pakInfo.FileList[file];
if (info.IndexArchiveFile == i)
{
//Console.WriteLine("Writing " + file);
byte[] fileData = GetFileAsStream(file, false);
int paddingSize = (int)CalculateFullByteBlockSize((uint)fileData.Length) - fileData.Length;
pakWriter.Write(fileData);
pakWriter.Write(Util.CreatePaddingByteArray(paddingSize));
}
}
}
}
}
finally
{
File.Delete(archiveFileName);
File.Move(tmpArchiveFileName, archiveFileName);
}

我已经用 NUnit 对小文件进行了测试,效果很好。然后当我在现实生活中尝试时,这些文件超过 1 GB。我在删除时遇到麻烦。它指出该文件仍在被另一个进程使用。虽然不应该在退出 using 分支后处理该文件。所以我想知道文件流的处理是否执行起来很慢,这就是我遇到麻烦的原因。在我所有的文件处理中,请注意我使用带有 using 关键字的 FileStream。

最佳答案

While it shouldn't that file should have been disposed of after exiting the using branch

这不是它所提示的,您不能删除 archiveFileName。正如异常消息所说,其他一些进程已经打开了文件。如果您不知道可能是什么进程,请使用任务管理器的“进程”选项卡开始一个接一个地终止它们。顺便说一句,这是你自己的过程并不完全不寻常。最好的方法是使用 SysInternals 的 Handle 实用程序,它可以显示进程名称。

在多任务操作系统上,删除文件通常是一次危险的冒险,其他进程也对该文件感兴趣的几率总是非零。他们应该使用 FileShare.Delete 打开文件,但这常常被忽视。

最安全的方法是使用 File.Replace() .第三个参数,备份文件名,是至关重要的,它允许文件被重命名并继续存在,以便其他进程可以继续使用它。您应该尝试在代码的开始 处删除该备份文件。如果那不成功,则 File.Replace() 也无法工作。但是请先检查它不是您程序中的错误,然后运行 ​​Handle 实用程序。

关于c# - 在非常大的文件流上处理缓慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25226326/

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