Юстас писал(а):Обычный 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, то я сожалею, что он воспринял это как оскорбление.
Сейчас этот форум просматривают: AhrefsBot и гости: 8