0

我正在使用 c++ cli。我正在尝试扫描文件以查看它们是否已由 pe 打包程序打包。

这是问题所在

如果我将我的代码不在 try 块中,它将扫描任何 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 (...)
{

}

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

那么如何让它扫描大文件并忽略系统文件。

我是否需要更改捕获异常。

谢谢你

4

1 回答 1

2

如果您当前的代码失败,那么了解引发了哪些异常是必不可少的。在你做任何其他事情之前,在你的 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);
}

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

于 2013-04-17T04:50:09.960 回答