Описание функции
FileDirListCmd
Поиск файлов и/или папок, включая подкаталоги (использует команду cmd.exe+Dir).
FileDirListCmd(List FileListOut.s(), Path$, FileMask$ = "*", Flag = 0, SubDir = 1, Sort = 0)
Параметры
FileListOut.s() | Список, куда будет помещён список файлов |
Path$ |
Путь к папке |
FileMask$ |
Маска/фильтр файлов/папок в формате WildCards |
Flag |
Указывает, возвращать ли файлы или папки или оба вместе: 0 - Файлы и папки (по умолчанию) 1 - Только файлы 2 - Только папки |
SubDir |
Указывает, искать ли в подпапках: 1 - Поиск включая подпапки (по умолчанию). Возвращает полные пути. 0 - Поиск в корне текущей папки. Возвращает только имена файлов. |
Sort |
Указывает, сортировать ли результаты поиска (в алфавитном порядке, без учета регистра): 0 - не сортировать (по умолчанию). 1 - сортировать. |
Возвращаемое значение
Возвращает список файлов List().Примечания
Только Windows.Пример
; https://www.purebasic.fr/english/viewtopic.php?t=82308
EnableExplicit
; https://www.purebasic.fr/english/viewtopic.php?f=12&t=65159&p=486382&hilit=SplitL#p486382
Procedure SplitL(String.s, List StringList.s(), Separator.s = " ")
Protected S.String, *S.Integer = @S
Protected.i p, slen
slen = Len(Separator)
ClearList(StringList())
*S\i = @String
Repeat
AddElement(StringList())
p = FindString(S\s, Separator)
StringList() = PeekS(*S\i, p - 1)
*S\i + (p + slen - 1) << #PB_Compiler_Unicode
Until p = 0
*S\i = 0
EndProcedure
; #FUNCTION# ====================================================================================================
; Name...........: FileDirListCmd
; Description....: Search files and\or folders in a specified path (uses system Dir command)
; Syntax.........: FileDirListCmd(List FileListOut.s(), Path$ [, FileMask$ = "*" [, Flag = 0 [, SubDir = 1 [, Sort = 0]]]])
; Parameters.....: List FileListOut.s() - The list where the result will be placed
; Path$ - Path To search the file.
; FileMask$ - [Optional] Filter to use, default is "*" (WildCards).
; Flag - [Optional] Specifies whether to return files folders or both:
; Flag = 0 - Files and folders (default)
; Flag = 1 - Only files
; Flag = 2 - Only folders
; SubDir - [Optional] Specifies whether to search in subfolders or not:
; SubDir = 1 - Search in subfolders (default). Returns full pathes.
; SubDir = 0 - Search without subfolders (only in Path$). Returns filenames only.
; Sort - [Optional] Specifies whether to sort the output list (in alphabetic order) or not (default is 0 - do not sort). Case-insensitive sorting.
;
; Return values..: Success - Returns the number of elements found. The FileListOut() list contains the found elements.
; Failure - number less than zero
; -1 = Path not found or invalid
; -2 = Exitcode returns an error
; -3 = Программа
;
; Author.........: G.Sandler (CreatoR), amel27. (script in AutoIt3)
; Modified.......: AZJIO rewrote AutoIt3 code to PureBasic
; Remarks........: This function uses system Dir command, to speed up the search.
; Related........:
; Link...........: https://autoit-script.ru/threads/_FileDirListCmd-poisk-fajlov-s-ispolzovaniem-komandy-dir.8266/
; Example........:
; ===============================================================================================================
Procedure FileDirListCmd(List FileListOut.s(), Path$, FileMask$ = "*", Flag = 0, SubDir = 1, Sort = 0)
Protected sOutBin$, Out$, hDir, Attrib$, Files$, Exitcode = -3, pos
Protected NewList LstMasks$()
If FileSize(Path$) <> -2
ProcedureReturn -1
EndIf
If SubDir = 1
Attrib$ + " /S"
EndIf
If Sort = 1
Attrib$ + " /O:N"
EndIf
Select Flag
Case 1
Attrib$ + " /A-D"
Case 2
Attrib$ + " /AD"
Default
Attrib$ + " /A"
EndSelect
; Out$ = StringToBinary("0" + #CRLF$, 2)
Path$ = RTrim(Path$, #PS$)
FileMask$ = Trim(FileMask$, ";")
Repeat
pos = FindString(FileMask$, ";;")
If pos
FileMask$ = ReplaceString(FileMask$, ";;", ";")
EndIf
Until Not pos
SplitL(FileMask$, LstMasks$(), ";")
ForEach LstMasks$()
Files$ + Chr(34) + Path$ + #PS$ + LstMasks$() + Chr(34) + ";"
Next
Files$ = RTrim(Files$, ";")
hDir = RunProgram(GetEnvironmentVariable("ComSpec"), ; cmd.exe
; "/u /c (DIR " + Files$ + " /B" + Attrib$ + ")", "",
"/u /c DIR " + Files$ + " /B" + Attrib$, "",
#PB_Program_Open | #PB_Program_Read | #PB_Program_Error | #PB_Program_Unicode | #PB_Program_Hide)
If hDir
While ProgramRunning(hDir)
If AvailableProgramOutput(hDir)
Out$ + ReadProgramString(hDir) + Chr(13)
EndIf
Wend
Exitcode = ProgramExitCode(hDir)
CloseProgram(hDir)
EndIf
If Exitcode
ProcedureReturn -2
EndIf
Out$ = RTrim(Out$, #CR$)
SplitL(Out$, FileListOut(), #CR$)
ProcedureReturn ListSize(FileListOut())
EndProcedure
Define NewList Files.s()
; Debug FileDirListCmd(Files(), #PB_Compiler_Home + "SDK\DocMaker", "*.txt;*.exe", 0, 2, 0) ; Flag, SubDir, Sort
; Debug FileDirListCmd(Files(), #PB_Compiler_Home + "SDK\DocMaker", "*", 1, 1, 1)
Debug FileDirListCmd(Files(), #PB_Compiler_Home + "Examples\3D\Data", "*.ogg;*.zip", 1, 1, 0)
ForEach Files()
Debug Files()
Next