Я использую C ++ Cli. Я пытаюсь сканировать файлы, чтобы увидеть, были ли они упакованы pe-упаковщиком.
вот проблема
если я поместил свой код не в блок try, он будет сканировать любой файл размером 20 МБ или более, но проблема в том, что если файл является системным файлом (например, ntuser.dat), он выдаст ошибку, из-за которой невозможно получить доступ к файлу. это нормально, потому что мне не нужно сканировать подобные файлы, поэтому я поместил свой код в блок try, чтобы устранить эту ошибку. теперь проблема в том, что когда он доберется до этого файла 20 Мб, он пропустит его, а не сканирует. Я не знаю, почему блок 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 (...)
{
}
Я не поместил часть цикла, где он читает следующий файл из текстового файла, потому что эта часть в порядке.
так как мне заставить его сканировать большие файлы и игнорировать системные файлы.
мне нужно изменить исключения для улова, может быть.
благодарю вас
Если ваш текущий код не работает, то важно знать, какие исключения выдают. Прежде чем делать что-либо еще, поместите Debug :: WriteLine в свой блок catch и посмотрите, какие исключения вы получаете!
Тем не менее, метод, который вы перечислили, почти гарантированно доставит вам проблемы с большими файлами. Вы читаете все содержимое файла в память, затем преобразуете байтовый массив в строку 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);
}
Вы по-прежнему будете получать исключения, пытаясь открыть файлы операционной системы, но, по крайней мере, у вас будет некоторое представление о том, что такое исключения, и вы сможете обрабатывать большие файлы без проблем.
Других решений пока нет …