代码之家  ›  专栏  ›  技术社区  ›  patchariadog

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

  •  0
  • patchariadog  · 技术社区  · 11 年前

    我使用的是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 (...)
    {
    
    }
    

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

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

    我可能需要更改catch异常吗。

    非常感谢。

    1 回复  |  直到 11 年前
        1
  •  2
  •   David Yaw    11 年前

    如果您当前的代码失败了,那么了解抛出了哪些异常是至关重要的。在执行其他操作之前,请在catch块中放入Debug::WriteLine,看看会出现什么异常!

    然而,您列出的方法几乎可以保证会在大文件上给您带来问题。您将整个文件内容读取到内存中,然后将字节数组转换为Unicode字符串,从而进行6x扩展,然后从字符串中删除短划线,从而使总内存使用量是原始文件大小的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);
    }
    

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