我有这个代码
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分支后将该文件丢弃。所以我想知道文件流的处理是否执行缓慢,这就是我遇到麻烦的原因。在所有文件处理中的小提示,我将FileStream与using关键字一起使用。
虽然不应该在退出using分支后处理掉该文件
那不是它所抱怨的,您不能删除archiveFileName。正如异常消息所示,其他一些进程已打开文件。如果您不知道可能是哪个进程,则可以使用“任务管理器”的“进程”选项卡将其一一杀死。顺便说一句,作为您自己的过程并不是完全不寻常的。最好的方法是使用SysInternals的Handle实用程序,它可以为您显示进程名称。
在多任务操作系统上,删除文件通常是一个危险的冒险,某些其他进程也对该文件感兴趣的可能性总是非零。他们应该使用FileShare.Delete打开文件,但这经常被忽略。
最安全的方法是使用File.Replace()。第三个参数(备份文件名)至关重要,它允许重命名文件并继续存在,以便其他进程可以继续使用它。您应该尝试在代码的开头删除该备份文件。如果这样不成功,则File.Replace()也不起作用。但是首先要检查它不是程序中的错误,然后运行Handle实用程序。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句