在大型文件流上处理速度慢吗?

肯尼

我有这个代码

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

整理大型空内容文件时,处理速度慢

来自分类Dev

RAM比CPU支持的速度慢吗?

来自分类Dev

Chrome在大型选择上加载速度慢

来自分类Dev

加快对大型阵列和数据集的操作(熊猫速度慢,Numpy更好,进一步改进吗?)

来自分类Dev

nodejs 同时读取 4 个以上的大文件时速度慢吗?

来自分类Dev

网络速度慢

来自分类Dev

Firefox速度慢

来自分类Dev

为什么get()在多处理中速度慢?

来自分类Dev

为什么get()在多处理中速度慢?

来自分类Dev

处理简单任务时速度慢

来自分类Dev

Haskell计算Ackermann 4 1的速度慢吗?

来自分类Dev

用unityscript调用脚本速度慢吗?

来自分类Dev

MS-Access:对链接的CSV文件的查询速度慢

来自分类Dev

VirtualBox中共享文件夹的速度慢

来自分类Dev

系统速度慢,要删除哪些文件?

来自分类Dev

MS-Access:对链接的CSV文件的查询速度慢

来自分类Dev

SQL加载速度慢

来自分类Dev

Django速度慢的原因

来自分类Dev

图像检索速度慢

来自分类Dev

速度慢,但程序不慢

来自分类Dev

图像检索速度慢

来自分类Dev

DNS解析速度慢

来自分类Dev

磁盘写入速度慢

来自分类Dev

大型记录集(VBA)的MS Access插入速度慢

来自分类Dev

HighCharts / jQuery:chart.redraw速度慢-可以提高速度吗?

来自分类Dev

python requests-futures速度慢-无法正确执行线程处理?

来自分类Dev

Windows 10速度非常慢,音频断断续续,文件浏览器速度慢,滞后

来自分类常见问题

从GPU大量转移到RAM后渲染速度慢吗?

来自分类Dev

计算速度慢:itertools.product可能是罪魁祸首吗?