c++ cli try block不允许文件流打开大文件
c++ cli try block is not letting file stream open big files
我正在使用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);
}
在打开操作系统文件时仍然会遇到异常,但至少你会知道异常是什么,并且你将能够毫无问题地处理大文件。
相关文章:
- 为什么 Clang 不允许"and"作为函数名称?
- 不允许在向量中添加更多元素
- std::带有自定义缓冲区的 iostream 不允许我写入
- Visual Studio 2017 不允许我创建 C++ 专用模板
- 返回时不允许隐式转换
- 为什么 c++(g++) 不允许模板返回类型和函数名称之间有空格?
- C++ 读取文件读取文件不正确
- 为什么 c++ 不允许(自动)强制转换?
- 为什么文件不是由 F 流创建的,或者即使它是输出只是垃圾值?
- 为什么 c++11 不允许使用自动
- 合并文本文件不同行中的重复项
- 为什么不允许成员函数和非成员函数之间的函数重载?
- 为什么不允许使用可变长度数组作为向量元素?
- 余数除法和不允许除以零 (c++) 时遇到问题
- C++从外部类继承的嵌套类;不允许使用不完整的类型
- 在 c++ 中三元运算符中不允许继续(关键字)吗?
- gitignore 允许 obj 模型,但不允许编译 obj 文件
- 提供的头文件不会 #include <string> ,也不允许更改。如何将其包含在我的 cpp 文件中?
- c++ cli try block不允许文件流打开大文件
- 如何在 ofn.lpstrFilter 中用数字开始文件格式名称?它不允许在开头写 3?