c++ cli try block不允许文件流打开大文件

c++ cli try block is not letting file stream open big files

本文关键字:文件 不允许 cli try block c++      更新时间:2023-10-16

我正在使用c++ cli。我正在试着扫描文件,看看它们是否被打包了。

问题在这里

如果我把我的代码不在一个尝试块,它将扫描任何文件大小20mb或更多,但问题是,如果一个文件是一个系统文件(如ntuser.dat),它会给我一个错误,不能访问文件。这很好,因为我不需要像那样扫描文件,所以我把我的代码放在一个try块中来消除这个错误。现在的问题是,当它到达20mb的文件时,它会跳过它,而不是扫描它。我不知道为什么try块会让它跳过大文件。它不会跳过文件的唯一方法是大文件是要扫描的第一个文件,但这是无用的,因为它将扫描多个大文件。

代码

try
{
    FileStream^ fs2 = gcnew FileStream(line, FileMode::Open, FileAccess::Read, FileShare::ReadWrite);
    BinaryReader^ br = gcnew BinaryReader(fs2);
    array<Byte>^writeArray = br->ReadBytes(br->BaseStream->Length);
    fs2->Close();
    String^ datafile = BitConverter::ToString(writeArray);
    datafile = datafile->Replace("-","");
    if (datafile->Contains("55505830")) {
        listBox1->Items->Add(line);
    }   
}
catch (...)
{
}

我没有把循环部分放在它从文本文件中读取下一个文件的地方,因为那部分很好。

那么我如何让它扫描大文件而忽略系统文件呢?

也许我需要改变catch异常。

谢谢

如果当前代码失败,那么了解抛出了哪些异常是必要的。在做任何其他事情之前,在catch块中放入Debug::WriteLine,看看会得到什么异常!

但是,您所列出的方法几乎肯定会在处理大文件时给您带来问题。您将整个文件内容读入内存,然后将字节数组转换为Unicode字符串,导致扩展6倍,然后从字符串中删除破折号,导致总内存使用量为原始文件大小的10倍。

相反,读入字节并在读取时检查它们。也许像这样:

array<Byte>^ target = { 0x55, 0x50, 0x58, 0x30 };
try
{
    int matched = 0;
    FileStream^ fs2 = gcnew FileStream(line, FileMode::Open, FileAccess::Read, FileShare::ReadWrite)
    int value;
    do
    {
        value = fs2->ReadByte();
        if(value == target[matched])
            matched++;
        else
            matched = 0;
        if(matched == target->Length)
        {
            listBox1->Items->Add(line);
            break;
        }
    } while (value != -1);
    fs2->Close();
}
catch(Exception^ e)
{
    Debug::WriteLine("Skipping file: " + line + " due to " + e->Message);
}

在打开操作系统文件时仍然会遇到异常,但至少你会知道异常是什么,并且你将能够毫无问题地处理大文件。