




Юстас писал(а):Обычный FindFirstFile поддерживает поиск с *ZZZZZZZZ*

Cryonyx писал(а):Юстас писал(а):Обычный FindFirstFile поддерживает поиск с *ZZZZZZZZ*
А для тех, кто с бронепоезда: FindFirstFile - это через что?



tyomitch писал(а):Через что FindFirstFile там, где достаточно Dir - комментировать не буду



tyomitch писал(а):Через что FindFirstFile там, где достаточно Dir - комментировать не буду

Public Function test0()
Dim ff As Long
Dim i&, t!
t = Timer()
For i = 1 To 5000
ff = FreeFile()
Open "d:\4\06D763A311_D911AD0F_4313A292_" & Format$(i, "0000") & ".txt" For Output As #ff
Close #ff
Next
Debug.Print Timer() - t, i
End Function?test0
3,636719 5001 Public Sub FileNameCompare(ByVal Path As String, ByVal Mask As String)
Dim FileName As String
Dim Mask2 As String
Dim arr() As String
Dim t!, i&
t = Timer()
FileName = Dir$(Path & "\*")
Do While (Len(FileName))
i = i + 1
arr = Split(FileName, "_")
Mask2 = arr(0) & "_" & arr(1) & "_" & arr(2)
If (Mask2 <> Mask) Then
Debug.Print FileName
End If
FileName = Dir$()
Loop
Debug.Print Timer() - t, i
End Sub
Public Function test()
Call FileNameCompare("d:\4", "06D763A311_D911AD0F_4313A292")
End Function?test
0,1015625 5000
Юстас писал(а):Т.к. Dir - это тот же FindFirstFile, обернутый ещё дополнительно всяким vb-хламом
Public Const MAX_PATH = 260
Public Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
Public Type WIN32_FIND_DATA
dwFileAttributes As Long
ftCreationTime As FILETIME
ftLastAccessTime As FILETIME
ftLastWriteTime As FILETIME
nFileSizeHigh As Long
nFileSizeLow As Long
dwReserved0 As Long
dwReserved1 As Long
cFileName As String * MAX_PATH
cAlternate As String * 14
End Type
Public Declare Function FindFirstFile Lib "kernel32" _
Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
Public Declare Function FindNextFile Lib "kernel32" _
Alias "FindNextFileA" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long
Function StripNulls(OriginalStr As String) As String
Dim p&
p = InStr(OriginalStr, Chr(0))
If (p) Then OriginalStr = Left$(OriginalStr, p - 1)
StripNulls = OriginalStr
End Function
Public Sub FileNameCompare2(ByVal Path As String, ByVal Mask As String)
Dim FileName As String
Dim Mask2 As String
Dim arr() As String
Dim t!, i&, r&
Dim FileData As WIN32_FIND_DATA
Dim bIsDirectory As Boolean
Dim hSearch As Long
t = Timer()
hSearch = FindFirstFile(Path & "*.*", FileData)
r = hSearch
Do While (r > 0)
i = i + 1
FileName = StripNulls(FileData.cFileName)
If FileName <> "." And FileName <> ".." Then
bIsDirectory = (FileData.dwFileAttributes And vbDirectory) = vbDirectory
If (Not bIsDirectory) Then
arr = Split(FileName, "_")
Mask2 = arr(0) & "_" & arr(1) & "_" & arr(2)
If (Mask2 <> Mask) Then
Debug.Print FileName
End If
End If
End If
r = FindNextFile(hSearch, FileData)
Loop
r = FindClose(hSearch)
Debug.Print Timer() - t, i
End Sub
Public Function test()
Call FileNameCompare2("d:\4", "06D763A311_D911AD0F_4313A292")
End Function?test
0,1289063 5003
0,140625 5003
0,1523438 5003
0,140625 5003 
Public Sub FileNameCompare(ByVal Path As String, ByVal Mask As String)
Dim FileName As String
Dim Mask2 As String
Dim t!, i&, MaskLen&
t = Timer()
MaskLen = Len(Mask)
FileName = Dir$(Path & "\*")
Do While (Len(FileName))
i = i + 1
Mask2 = Left$(FileName, MaskLen)
If (Mask2 <> Mask) Then
Debug.Print FileName
End If
FileName = Dir$()
Loop
Debug.Print Timer() - t, i
End Sub?test
0,046875 5000
5,078125E-02 5000
0,0390625 5000
5,078125E-02 5000
0,0390625 5000 

Юстас писал(а):Скорость снизилась, потому что тестировать не умеешь. Сначала научись тестировать, а затем приводи в качестве аргумента цифры.
Юстас писал(а):Из того времени, что работает приведенный тобой код, львиная уходит на вызовы аппендикса по имени StripNulls, на вызов функции split ( которая работает с типом Variant, это ни о чем не говорит?), InStr, Left$ и прочие разные Debug.Print'ы
Юстас писал(а):Если не знаешь других способов, кроме кривого из ApiGuide, то не приводи его в пример.


skiperski писал(а):Что там ещё можно оптимизировать?


Юстас писал(а):Нарисуй код, чтобы не пару десятков или сотен файлов было, а как у автора вопроса, несколько тысяч.
Юстас писал(а):Например, поиск в папке C:\Windows\ со всеми вложенными папками . А то и мерять нечего будет. Естественно с Dir$. О FindFirst\Next не заботься. Это уже готово. Пости свой код, я его добавлю в тест-проект и приаттачу.




Юстас писал(а):Я предвижу крики, что всё это нечестно, поэтому сразу: FindFirstFile в самом что ни на есть голом виде, без шелухи
Юстас писал(а):И ещё: автор не вел речь о том, как пожиже да попроще да меньше букв набрать. Речь о скорости.
Юстас писал(а):Хотя кода тоже меньше
Юстас писал(а):Результат приводить не буду, машины разные, единственно FindFirst быстрее Dir'a

FindFiles proc lpStartPath:DWORD, lpPattern:DWORD, hBox:DWORD
LOCAL FindData :WIN32_FIND_DATA
LOCAL hFind :DWORD
LOCAL szBuff[260] :BYTE
xor ebx,ebx
invoke SendMessage,hBox,LB_RESETCONTENT,0,0
invoke lstrcpy, addr szBuff,lpStartPath
invoke lstrcat, addr szBuff,lpPattern
invoke FindFirstFile, addr szBuff, addr FindData
.if eax != INVALID_HANDLE_VALUE
mov hFind, eax
.while eax != 0
.if byte ptr FindData.cFileName != '.'
invoke SendMessage,hBox,LB_ADDSTRING,0,addr FindData.cFileName
inc ebx
.endif
invoke FindNextFile, hFind, addr FindData
.endw
.endif
invoke FindClose, hFind
invoke MessageBeep,0FFFFFFFFh
mov eax,ebx
ret
FindFiles endp


Юстас писал(а):skiperski, есть устойчивый выигрыш FindFirst'a в 2 раза. Это факт.
Юстас писал(а):Теперь о пользе для автора. Чтобы была польза, нужно конкретное описание задания, а не такое расплывчатое, как в вопросе в заголовке темы. Сделать под конкретную задачу - не проблема.
Юстас писал(а):Ближе к вопросу автора: определяет просто наличие или отсутствие указанного файла. Если есть - результат отличный от нуля, если нет файлов, удовлетворяющих условию поиска - возвращается ноль.
Юстас писал(а):Пока автор конкретно не опишет задачу
Юстас писал(а):трудно выдать готовое решение.
Юстас писал(а):О полезном коде на VB:
FileCount = FindFiles(ByVal TxtStartPath.Text, ByVal TxtPattern.Text, ByVal ListBox.hWnd)
Юстас писал(а):Если требуешь выложить внутренности моей либы, то будет справедливым, если ты тоже выложишь кишки msvbvm60.dll в той части, что касается Dir.

Юстас писал(а):Спору нет, я не поливаю елеем, но вполне корректно дискутирую с оппонентом.
Юстас писал(а):У меня есть точка зрения, я её отстаиваю
Юстас писал(а):вполне корректно, никого не оскорбляя, не применяя каких-то грязных и нецензурных выражений.
Юстас писал(а):Есть VB-составляющая кода, есть asm-составляющая кода в dll.
У кода skiperski совершенно аналогично есть VB-составляющая и C-составляющая кода в msvbvm.
Юстас писал(а):Так что никто не сравнивает VB с asm'ом. Сравниваются коды внутри обеих dll. По скорости работы. Думаю, что теперь более или менее понятно, о каком сравнении идёт речь.
Юстас писал(а):Если я невольно обидел skiperski, то я сожалею, что он воспринял это как оскорбление.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9