AZJIO

FileSearch (PureBasic)

Feb 17th, 2021 (edited)
524
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. DisableDebugger
  2. EnableExplicit
  3.  
  4. Procedure __FO_FileSearchAll(Dir.s, List Files.s())
  5.     Protected ID, EntryName.s
  6.     ID = ExamineDirectory(#PB_Any, Dir, "*.*")
  7.     If ID
  8.         While NextDirectoryEntry(ID)
  9.             EntryName=DirectoryEntryName(ID)
  10.             If EntryName = "." Or EntryName = ".."
  11.                 Continue
  12.             EndIf
  13.             If DirectoryEntryType(ID) = #PB_DirectoryEntry_Directory ; если путь является папкой, то
  14.                 __FO_FileSearchAll(Dir+EntryName+"\", Files())       ; рекурсивный вызов во вложенную папку
  15.             EndIf
  16.             If AddElement(Files())
  17.                 Files() = Dir+DirectoryEntryName(ID)
  18.             EndIf
  19.         Wend
  20.         FinishDirectory(ID)
  21.     EndIf
  22. EndProcedure
  23.  
  24. Procedure _FO_FileSearch(*Result.string, Path$, Mask$ = "*", TypeMask = 0)
  25.     Protected RID, Len, *Point
  26.     ;       Protected FileList.string\s
  27.     NewList Files.s() ; список для хранения путей
  28.     __FO_FileSearchAll(Path$, Files()) ; функция поиска файлов
  29.     If TypeMask = 0
  30.         RID = CreateRegularExpression(#PB_Any, Mask$)
  31.         If RID
  32.             ForEach Files()
  33.                 If Not MatchRegularExpression(RID, Files())
  34.                     DeleteElement(Files())
  35.                 EndIf
  36.             Next
  37.             FreeRegularExpression(RID)
  38.         Else
  39.             Debug RegularExpressionError()
  40.         EndIf
  41.     EndIf
  42.  
  43.     Len=0
  44.     ForEach Files()
  45.         Len + Len(Files())+2 ; вычисляем длину данных для  вмещения путей
  46.     Next
  47.  
  48.     *Result\s = Space(Len) ; создаём строку забивая её пробелами
  49.     *Point = @*Result\s    ; Получаем адрес строки
  50.     ForEach Files()
  51.         CopyMemoryString(Files()+#CRLF$, @*Point) ; копируем очередной путь в указатель
  52.     Next
  53.  
  54.     ClearList(Files()) ; очищаем список
  55.  
  56. ;   ProcedureReturn Res
  57. EndProcedure
  58.  
  59.  
  60.  
  61. Define StartTime=ElapsedMilliseconds() ; метка времени
  62. ; Path$ = "C:\Музыка"      ; Создаёт список всех файлов и папок в домашнем каталоге.
  63. Define Path$ = "/home/user"
  64.                                                            ; Result = ""
  65. Define Result.string\s = "" ; Объявили встроенную структуру string с именем Result и элементом структуры \s
  66. ; _FO_FileSearch(@Result, Path$, "\A.*?\.mp3\z")
  67. _FO_FileSearch(@Result, Path$, "\A.*?\.js\z")
  68. Define Res.s = "Прошло времени между метками " + Str(ElapsedMilliseconds()-StartTime) + " мсек"
  69.  
  70. EnableDebugger
  71.  
  72. ; Debug Res ; вывод данных о времени выполнения
  73. Debug Result\s
Add Comment
Please, Sign In to add comment