File "RDir.inc"
Path: /VLC Playlist Manager/inc/RDir.inc
File size: 7.87 KB
MIME-type: text/plain
Charset: utf-8
' List files or folders recursively from a root folder
' See macros below for use in a program:
' RDIR_DeclareLocals ' Local variables for recursive dir macros
'
' RDIR_ListFilesIn(rootfolder, "*.bas")
' FOR i = 0 to RDIR_NbOfFiles
' e = RDIR_File(i) ' full path + filename
' e = RDIR_FileName(i) ' single filename (without path)
' NEXT i
'
' RDIR_ListSubfoldersIn(rootfolder)
' FOR i = 0 to RDIR_NbOfSubfolders
' e = RDIR_Subfolder(i) ' full path + subfolder name
' e = RDIR_SubfolderName(i) ' single subfolder name, without path
' NEXT i
#INCLUDE ONCE "win32api.inc"
'--------------------------------------------------------------------------------
MACRO RDIR_DeclareLocals = LOCAL FileCount, RDIR_NbOfSubfolders AS DWORD
'--------------------------------------------------------------------------------
'--------------------------------------------------------------------------------
MACRO RDIR_ListFilesIn(rootfolder, filter)
REDIM RDIR_FileData(0 TO 0) AS WIN32_FIND_DATA
FileCount = FileEnum(rootfolder, RDIR_FileData(), filter)
END MACRO
'--------------------------------------------------------------------------------
'--------------------------------------------------------------------------------
MACRO RDIR_NbOfFiles() = (FileCount - 1)
'--------------------------------------------------------------------------------
'--------------------------------------------------------------------------------
MACRO RDIR_File(i) = RDIR_FileData(i).cFilename
'--------------------------------------------------------------------------------
'--------------------------------------------------------------------------------
MACRO RDIR_FileName(i) = MID$(RDIR_File(i), INSTR(-1, RDIR_File(i), ANY ":/\") + 1)
'--------------------------------------------------------------------------------
'--------------------------------------------------------------------------------
MACRO RDIR_ListSubfoldersIn(rootfolder)
REDIM RDIR_Subfolder(0 TO 0) AS STRING
RDIR_NbOfSubfolders = SubfolderEnum(rootfolder, RDIR_Subfolder())
END MACRO
'--------------------------------------------------------------------------------
'--------------------------------------------------------------------------------
MACRO RDIR_SubfolderName(i) = MID$(RDIR_Subfolder(i), INSTR(-1, RDIR_Subfolder(i), ANY ":/\") + 1)
'--------------------------------------------------------------------------------
'--------------------------------------------------------------------------------
DECLARE FUNCTION PathMatchSpec LIB "SHLWAPI.DLL" ALIAS "PathMatchSpecA"(pszFile AS ASCIIZ, pszSpec AS ASCIIZ) AS LONG
'--------------------------------------------------------------------------------
'-----------------------------------------------------------------------------------------------
' Calls Win32 API to create the folder and all its parents if not existing (e.g. "C:\D0\D1\D2\D3")
'-----------------------------------------------------------------------------------------------
' Use: MakeSureDirectoryPathExists folderName
DECLARE FUNCTION MakeSureDirectoryPathExists LIB "IMAGEHLP.DLL" ALIAS _
"MakeSureDirectoryPathExists"(lpDirName AS ASCIIZ) AS LONG
'-----------------------------------------------------------------------------------------------
'-----------------------------------------------------------------------------------------------
SUB RDIR_EraseAll(rootfolder AS STRING)
RDIR_DeclareLocals ' Local variables for recursive dir macros
LOCAL i AS LONG
RDIR_ListFilesIn(rootfolder, "*.*")
FOR i = 0 TO RDIR_NbOfFiles
KILL RDIR_File(i)
NEXT
RDIR_ListSubfoldersIn(rootfolder)
FOR i = RDIR_NbOfSubfolders TO 0 STEP -1
RMDIR RDIR_Subfolder(i)
NEXT
END SUB
'--------------------------------------------------------------------------------
'-----------------------------------------------------------------------------------------------
SUB RDIR_Copy(srcfolder AS STRING, tgtfolder AS STRING)
RDIR_DeclareLocals ' Local variables for recursive dir macros
LOCAL i AS LONG
LOCAL e AS STRING
RDIR_ListSubfoldersIn(srcfolder)
FOR i = 0 TO RDIR_NbOfSubfolders
e = tgtfolder + REMOVE$(RDIR_Subfolder(i), srcfolder)
MakeSureDirectoryPathExists TRIM$(e)
NEXT
RDIR_ListFilesIn(srcfolder, "*.*")
FOR i = 0 TO RDIR_NbOfFiles
e = tgtfolder + REMOVE$(RDIR_File(i), srcfolder)
MakeSureDirectoryPathExists TRIM$(e)
FILECOPY RDIR_File(i), e
NEXT
END SUB
'--------------------------------------------------------------------------------
'--------------------------------------------------------------------------------
FUNCTION FileTimeToInternationalDate(File_Time AS FILETIME) AS STRING
LOCAL Sys_Time AS SystemTime
FileTimeToSystemTime File_Time, Sys_Time
FUNCTION = _
FORMAT$(Sys_Time.wyear, "0000") & "/" & FORMAT$(Sys_Time.wMonth, "00") & "/" & _
FORMAT$(Sys_Time.wDay, "00") & " " & FORMAT$(Sys_Time.wHour, "00") & ":" & _
FORMAT$(Sys_Time.wMinute, "00") & ":" & FORMAT$(Sys_Time.wSecond, "00") & " " & _
CHOOSE$(Sys_Time.wDayOfWeek + 1, "sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday")
END FUNCTION
'--------------------------------------------------------------------------------
'--------------------------------------------------------------------------------
FUNCTION FileEnum(rootFolder AS STRING, File() AS WIN32_FIND_DATA, Filter AS STRING) AS LONG
LOCAL FileData AS WIN32_FIND_DATA
LOCAL Looper AS LONG
LOCAL hDir AS DWORD
LOCAL FolderCount AS DWORD
STATIC FileCount AS DWORD
STATIC FolderDeep AS DWORD
INCR FolderDeep
DIM SubFolder(0 TO 0) AS STRING
IF ASC(rootFolder, - 1) <> 92 THEN rootFolder = rootFolder & "\" 'Must end with a backlash
SubFolder(0) = rootFolder
hDir = FindFirstFile(SubFolder(0) & "*", FileData)
IF hDir <> %INVALID_HANDLE_VALUE THEN
DO
IF (FileData.dwFileAttributes AND %FILE_ATTRIBUTE_DIRECTORY) THEN 'It's a folder
IF FileData.cFilename <> "." AND FileData.cFilename <> ".." THEN 'Refuse "." and ".."
INCR FolderCount
REDIM PRESERVE SubFolder(0 TO FolderCount) AS STRING
SubFolder(FolderCount) = SubFolder(0) & FileData.cFilename & "\"
END IF
ELSE 'Its a file ...
IF PathMatchSpec(FileData.cFilename, BYVAL STRPTR(Filter)) THEN 'Check against Filter
REDIM PRESERVE File(0 TO FileCount)
File(FileCount) = FileData
File(FileCount).cFilename = SubFolder(0) & File(FileCount).cFilename 'Set to full path
INCR FileCount 'Zero based array
END IF
END IF
DIALOG DOEVENTS
LOOP WHILE FindNextFile(hDir, FileData)
END IF
FOR Looper = 1 TO FolderCount
FileEnum SubFolder(Looper), File(), Filter 'Function call itself to get sub-folder files
NEXT
FindClose hDir
DECR FolderDeep
IF FolderDeep = 0 THEN 'Exiting from first call, function is not in recursive state
FUNCTION = FileCount
FileCount = 0 'Reset for subsequent call
END IF
END FUNCTION
'--------------------------------------------------------------------------------
'--------------------------------------------------------------------------------
FUNCTION SubfolderEnum(rootFolder AS STRING, Folder() AS STRING) AS LONG
LOCAL iPOS, FolderCount AS LONG, temp AS STRING
Folder(FolderCount) = RTRIM$(rootFolder, "\")
WHILE LEN(Folder(iPOS))
temp = DIR$(BUILD$(Folder(iPOS),"\*.*"), ONLY %SUBDIR) 'subfolders only
WHILE LEN(temp)
INCR FolderCount
IF FolderCount > UBOUND(Folder()) THEN
REDIM PRESERVE Folder(FolderCount + 100)
END IF
Folder(FolderCount) = BUILD$(Folder(iPos),"\",temp)
temp = DIR$(NEXT)
WEND
INCR iPOS
WEND
REDIM PRESERVE Folder(FolderCount)
DIR$ CLOSE
FUNCTION = FolderCount
END FUNCTION
'--------------------------------------------------------------------------------