бЫСТРЫЙ пОИСК в фАЙЛЕ
Надо найти вложение в файле (двоичном). Файл большой и простым перебором байт получается долговато. Хотелось бы, чтобы как поиск в промоторщиках - раз и готово. Возможно поможет API-функция?
Помогите кто, чем может.
:o
Вроде когда-то эта тема уже рассматривалась на форуме, но найти по поиску не смог.
Надо найти вложение в файле (двоичном). Файл большой и простым перебором байт получается долговато. Хотелось бы, чтобы как поиск в промоторщиках - раз и готово. Возможно поможет API-функция?
Помогите кто, чем может.
:o
Как мне кажется поисковики быстро работают, потому что у них есть база на определённые слова, из которой и достаются быстро ссылки, по существу твоё слово и есть ссылка на, скажем так, ячейку в базе. А быстро находить из файла тебе просто функции не помогут. Ищи другие пути решений.
Если я в чём-то не прав, не вините строго.
Как мне кажется поисковики быстро работают, потому что у них есть база на определённые слова, из которой и достаются быстро ссылки, по существу твоё слово и есть ссылка на, скажем так, ячейку в базе. А быстро находить из файла тебе просто функции не помогут. Ищи другие пути решений.
Если я в чём-то не прав, не вините строго.
У меня файл в принципе не текстовый, а бинарный. Сомневаюсь я, что в базе можно записать ссылки на его "слова".
Еще есть объект Application.FileSearch
у него есть свойство TextOrProperty, которое указывает на поиск файла с определенным содержанием. И это работает махом, а у меня перебором около минуты. Но определить позицию найденного вхождения не получается.
Вроде когда-то эта тема уже рассматривалась на форуме, но найти по поиску не смог.
Надо найти вложение в файле (двоичном). Файл большой и простым перебором байт получается долговато. Хотелось бы, чтобы как поиск в промоторщиках - раз и готово. Возможно поможет API-функция?
Помогите кто, чем может.
:o
А что за вложения? Какой опознавательный механизм.
Когда типы файлов подразумевают сложные вложения то их структуру разрабатывают как правило таким образом - в их заголовках размещают что-то типа оглавления, например тот же xls-файл построен по принципу FAT.
А что за вложения? Какой опознавательный механизм.
Когда типы файлов подразумевают сложные вложения то их структуру разрабатывают как правило таким образом - в их заголовках размещают что-то типа оглавления, например тот же xls-файл построен по принципу FAT.
Ну вложение это просто я подразумевал ключевое слово - в моем конкретном случае название 3-х мерного массива "PRESSURE". Вообще файл создан специальной программой (кажется написана на FORTRANe) и вряд ли обычные поисковики будут настараиваться на его довольно произвольную структуру.
Ну вложение это просто я подразумевал ключевое слово - в моем конкретном случае название 3-х мерного массива "PRESSURE". Вообще файл создан специальной программой (кажется написана на FORTRANe) и вряд ли обычные поисковики будут настараиваться на его довольно произвольную структуру.
Ага, значит в бинарном файле надо найти слово/текст, правильно я тебя понял?
Если это так, то можно попробовать открывать его как текстовый - а кто нам мешает это сделать, ну и уже использовать все возможности по поиске текста в текстовых файлах.... надо посмотреть что нам могуть предложить встроенные VB средства
Ага, значит в бинарном файле надо найти слово/текст, правильно я тебя понял?
Если это так, то можно попробовать открывать его как текстовый - а кто нам мешает это сделать, ну и уже использовать все возможности по поиске текста в текстовых файлах.... надо посмотреть что нам могуть предложить встроенные VB средства
Так я и поступал. Считывал 20Мб файл в строковую переменную и в ней искал InStr(). Все работает быстро, но отыскивается не первое вхождение а примерно двадцатое. Даже если я MID() вырезаю в нужном месте из этой переменной, то получается пустота. А то что находит InStr(), то работает нормально, но мне нужно первое вхождение.
Public Sub fff()
Const ForReading = 1, ForWriting = 2, ForAppending = 3
Dim fs, f
Dim s As String
Dim lTime As Long
lTime = timeGetTime
Set fs = CreateObject("Scripting.FileSystemObject")
Set f = fs.OpenTextFile("c:\Winword.exe", ForReading, 0)
Do
s = f.ReadLine
i = InStr(1, s, "E??xc", vbTextCompare)
If i > 0 Then Exit Do
Loop
MsgBox timeGetTime - lTime
f.Close
End Sub
Время поиска получается от 5099 в начале и 4166 на 4, 5 попытку (файл кешируется видно и уже побыстрее открывается системой). Помойму достаточно быстро ?!
P.S. токо я на свою седую башку не нашел как определить конец файла в FSO, так что кто знает пусть подскажет
Вот, написал тестовой код, открываю на чтение файл winword.exe (OfficeXp), ищу кусок текста из конца 10 мб файла.
Public Sub fff()
Const ForReading = 1, ForWriting = 2, ForAppending = 3
Dim fs, f
Dim s As String
Dim lTime As Long
lTime = timeGetTime
Set fs = CreateObject("Scripting.FileSystemObject")
Set f = fs.OpenTextFile("c:\Winword.exe", ForReading, 0)
Do
s = f.ReadLine
i = InStr(1, s, "E??xc", vbTextCompare)
If i > 0 Then Exit Do
Loop
MsgBox timeGetTime - lTime
f.Close
End Sub
Время поиска получается от 5099 в начале и 4166 на 4, 5 попытку (файл кешируется видно и уже побыстрее открывается системой). Помойму достаточно быстро ?!
P.S. токо я на свою седую башку не нашел как определить конец файла в FSO, так что кто знает пусть подскажет
Я примерно так и делал, считывал правда сразу весь файл
s = f.readall
Но при таком "текстовом" обращении позиция определяется неверно. Работает да - быстро!
:{
Я примерно так и делал, считывал правда сразу весь файл
s = f.readall
Но при таком "текстовом" обращении позиция определяется неверно. Работает да - быстро!
:{
Неверно?! ну да, не в байтах конечно, можно вести счетчик и узнать номер строки и кол-во симолов от начала строки. Эти данные пригодятся если извлекать данные текстом, хотя.... кто тебе мешает запихнуть все в строку, а потом эту строку уже рассматривать как Byte-массив? Тебе что потом после нахождения ключев. текста делать то надо? что и и в каком виде извлекать?
Неверно?! ну да, не в байтах конечно, можно вести счетчик и узнать номер строки и кол-во симолов от начала строки. Эти данные пригодятся если извлекать данные текстом, хотя.... кто тебе мешает запихнуть все в строку, а потом эту строку уже рассматривать как Byte-массив? Тебе что потом после нахождения ключев. текста делать то надо? что и и в каком виде извлекать?
Я пробовал по-разному. И все в одну строку запихивал (readall) - пооиск дает не первое, а 20-е вхождение. и LineInput'ом - при этом позиция получается в 2 с лишним раза больше чем на самом деле (17Mb вместо 8Mb). Видимо содержимое файла чем то уникалено, но послать его такой большой для проверки сложновато.
Неверно?! ну да, не в байтах конечно, можно вести счетчик и узнать номер строки и кол-во симолов от начала строки. Эти данные пригодятся если извлекать данные текстом, хотя.... кто тебе мешает запихнуть все в строку, а потом эту строку уже рассматривать как Byte-массив? Тебе что потом после нахождения ключев. текста делать то надо? что и и в каком виде извлекать?
Попробовал с winword.exe (из 2000 MSO).
Получается такая же ерунда. Вот мой пример
Set fs = CreateObject("Scripting.FileSystemObject")
fl = "C:\Program Files\Microsoft Office\Office\WINWORD.EXE"
Set a = fs.OpenTextFile(fl, 1, -2)
c$ = a.readall
i = InStr(1, c$, "ADVAPI32.dll")
a.Close
при этом позиция указывается i=7637041
а это позиция второго вхождения - можно проверить вручную в просмоторщике файлов. Первое вхождение в самом начале файла.
Попробовал с winword.exe (из 2000 MSO).
Получается такая же ерунда. Вот мой пример
Set fs = CreateObject("Scripting.FileSystemObject")
fl = "C:\Program Files\Microsoft Office\Office\WINWORD.EXE"
Set a = fs.OpenTextFile(fl, 1, -2)
c$ = a.readall
i = InStr(1, c$, "ADVAPI32.dll")
a.Close
при этом позиция указывается i=7637041
а это позиция второго вхождения - можно проверить вручную в просмоторщике файлов. Первое вхождение в самом начале файла.
Смотрю этот файл через просмотрощик Total Commander - Lister: режимы: только текст, кодировка ANSI.
Находит "ADVAPI32.dll" только один раз, ближе к концу файла.
Смотрю этот файл через просмотрощик Total Commander - Lister: режимы: только текст, кодировка ANSI.
Находит "ADVAPI32.dll" только один раз, ближе к концу файла.
Спасибо! С помощью объекта TextStream, который ты предлагал, выход нашелся.
Использую метод Read(1000000), т.е. считываю по 1Мб и тогда все видится точно и быстро. А ReadLine непонятно как позиционирует.
Размер файла нахожу с помощью Len(a.ReadAll).
А "ADVAPI32.dll" Far-просмоторщик находит два раза, в самом начале (745) и в конце, правда офисы у наз могут быть разными.
Спасибо! С помощью объекта TextStream, который ты предлагал, выход нашелся.
Использую метод Read(1000000), т.е. считываю по 1Мб и тогда все видится точно и быстро. А ReadLine непонятно как позиционирует.
Размер файла нахожу с помощью Len(a.ReadAll).
А "ADVAPI32.dll" Far-просмоторщик находит два раза, в самом начале (745) и в конце, правда офисы у наз могут быть разными.
Наверное, у меня там еще сервиспики стоят, так что надо рег. номера этих файлов для полной идентичности.
Я тоже предпочитаю кусками считывать, так работает более предсказуемо чем пытаться сразу запихнуть все в память.