Filefunctions.bmx
Strict
Import brl.linkedlist
Import BRL.StandardIO
Import BRL.FileSystem
Function DirectorySize:Long(npath:String)
'fix the path value
npath = realdir(npath)
'fix forward slashes
npath = npath.replace("\","/")
'create a list to store folder information
Local temp_paths:TList = CreateList()
Local temp_path:String
Local temp_count:Long
Local temp_dir:Int
Local temp_file:String
'add first instance to folder list
temp_paths.addlast(npath)
'start a scan in this folder
While temp_paths.isempty() = False
'grab first path and remove it
temp_path = String(temp_paths.first())
temp_paths.removefirst()
Print "scanning: "+temp_path
'scan through the path
temp_dir = ReadDir(temp_path)
Repeat
temp_file = NextFile(temp_dir)
If temp_file = "" Exit
If temp_file = "." Or temp_file = ".." Continue
Select FileType(temp_path + temp_file)
Case 1
'add the filesize to the count
temp_count :+ FileSize(temp_path + temp_file)
Case 2
'add the path to list of paths to scan
temp_paths.addlast(temp_path + temp_file + "/")
End Select
Forever
CloseDir temp_dir
Wend
Return temp_count
End Function
Function ExtractPathSegments:String[](npath:String)
Local temp_segments:String[]
Local temp_count:Int
Local temp_pos:Int
Local temp_segment:String
Local temp_subpos:Int
Local temp_subsegment1:String
Local temp_subsegment2:String
'fix dotted paths
npath = realdir(npath)
'fix forward slashes
npath = npath.replace("/","\")
temp_pos = npath.find("\")
While temp_pos <> -1
'extract the segment
temp_segment = npath[..temp_pos]
'check to see if segment needs splitting
temp_subpos = temp_segment.find(":")
If temp_subpos = -1
'no split needed
'resize segment array
temp_segments = temp_segments[..temp_count+1]
'set segment
temp_segments[temp_count] = temp_segment
'increase segment count
temp_count :+ 1
Else
'needs splitting
temp_subsegment1 = temp_segment[..temp_subpos]
temp_subsegment2 = temp_segment[temp_subpos+1..]
'check to see for drive name
If temp_subsegment2.length = 0
'this is a correctly formed path so extract drive name
'resize segment array
temp_segments = temp_segments[..temp_count+1]
'set segment
temp_segments[temp_count] = temp_subsegment1 + ":"
'increase segment count
temp_count :+ 1
Else
'path missed out backslash after drive name
'resize segment array
temp_segments = temp_segments[..temp_count+2]
'set segments
temp_segments[temp_count] = temp_subsegment1
temp_segments[temp_count+1] = temp_subsegment2
'increase segment count
temp_count :+ 2
End If
End If
npath = npath[temp_pos+1..]
temp_pos = npath.find("\")
Wend
'add last
temp_segment = npath
'check to see if segment needs splitting
temp_subpos = temp_segment.find(":")
If temp_subpos = -1
'no split needed
'resize segment array
temp_segments = temp_segments[..temp_count+1]
'set segment
temp_segments[temp_count] = temp_segment
'increase segment count
temp_count :+ 1
Else
'needs splitting
temp_subsegment1 = temp_segment[..temp_subpos]
temp_subsegment2 = temp_segment[temp_subpos+1..]
'check to see for drive name
If temp_subsegment2.length = 0
'this is a correctly formed path so extract drive name
'resize segment array
temp_segments = temp_segments[..temp_count+1]
'set segment
temp_segments[temp_count] = temp_subsegment1 + ":"
'increase segment count
temp_count :+ 1
Else
'path missed out backslash after drive name
'resize segment array
temp_segments = temp_segments[..temp_count+2]
'set segments
temp_segments[temp_count] = temp_subsegment1
temp_segments[temp_count+1] = temp_subsegment2
'increase segment count
temp_count :+ 2
End If
End If
Return temp_segments
End Function
Function EmptyFolder:Int(npath:String)
'fix the path
npath = realdir(npath)
'check to see if folder exists
If FileType(npath) <> 2
' folder doesn't exist so return false
Return False
Else
'folder exists
Local temp_folder:Int = ReadDir(npath)
Local temp_file:String
Local temp_path:String
Repeat
temp_file = NextFile(temp_folder)
If temp_file = "" Exit
If temp_file = "." Or temp_file = ".." Continue
temp_path = npath + "/" + temp_file
Select FileType(temp_path)
Case 1
DeleteFile(temp_path)
Case 2
DeleteDir(temp_path,True)
End Select
Forever
End If
End Function
Function CreateFolderStructure(npath:String)
Local temp_i:Int
Local temp_segment:String
Local temp_segments:String[]
Local temp_count:Int
Local temp_path:String
'get path segments
temp_segments = ExtractPathSegments(npath)
'go through created segments and create structure
If temp_segments.length > 0
For temp_i = 0 Until temp_segments.length
temp_segment = temp_segments[temp_i]
'check to see what type if segment this is
If temp_segment[1..2] = ":"
'drive
temp_path :+ temp_segment
Else
'folder
'create the folder
temp_path :+ "\" + temp_segment
CreateDir(temp_path)
SetFileMode(temp_path,%111111111)
End If
Next
End If
End Function
Function FindFileInFolder:String(npath:String,nfile:String)
'fix path
npath = realdir(npath)
'this function will find a file in a folder.
Local temp_folder:Int = ReadDir(npath)
Local temp_file:String
Local temp_path:String
Local temp_i:Int
Local temp_until:Int
Local temp_match:Int
'fix case of nfile
nfile = nfile.tolower()
Repeat
temp_file = NextFile(temp_folder).tolower()
If temp_file = "" Exit
If temp_file = "." Or temp_file = ".." Continue
'check only files
temp_path = npath + "/" + temp_file
If FileType(temp_path) = 1
'check to see for match in file name
'check to see scanning until which size
If nfile.length >= temp_file.length
temp_until = temp_file.length
Else
temp_until = nfile.length
End If
'scan the strings for a match
temp_match = True
For temp_i = 0 Until temp_until
If temp_file[temp_i] <> nfile[temp_i]
temp_match = False
Exit
End If
Next
If temp_match = True
Return temp_path
End If
End If
Forever
Return ""
End Function
Function MoveFile:Int(nfrom:String,nto:String)
'this function will move a file from one place to another
'fix paths
nfrom = realdir(nfrom)
nto = realdir(nto)
'make sure from file exists
If FileType(nfrom) <> 1 Return False
'set nfrom permissions
SetFileMode(nfrom,%111111111)
'remove to file if it already exists
If FileType(nto) = 1
'set to file permissions
SetFileMode(nto,%111111111)
DeleteFile(nto)
'check to see if couldnt delete
If FileType(nto) = 1 Return False
End If
'copy nfrom to nto
CopyFile(nfrom,nto)
'delete nfrom
DeleteFile(nfrom)
'return that file was copied
Return True
End Function
Function RealDir:String(npath:String)
If npath.length > 0
'this is a temporary fix for the blitzmax bug
npath = npath.replace("\","/")
npath = npath.replace("//","/")
If npath[..1] = "/" npath = npath[2..]
End If
Return RealPath(npath)
End Function
tpathsizereport.bmx
Strict
Import BRL.FileSystem
Import BRL.LinkedList
Import BRL.StandardIO
Import BRL.System
Function CreatePathSizeReport:TList(npath:String,nfilter:Long=0)
'fix the path value
npath = RealPath(npath)
'fix forward slashes
npath = npath.replace("\","/")
Local temp_list:TList = CreateList()
RecurseDirectory(npath,temp_list,nfilter)
Return temp_list
End Function
Function RecurseDirectory:Long(npath:String,nlist:TList Var,nfilter:Long Var)
'this function will recurse a directory
Local temp_dir:Int = ReadDir(npath)
Local temp_file:String
Local temp_count:Long
Local temp_returned:Long
Local temp_item:tpathsizeitem
temp_dir = ReadDir(npath)
Repeat
temp_file = NextFile(temp_dir)
If temp_file = "" Exit
If temp_file = "." Or temp_file = ".." Continue
Select FileType(npath + temp_file)
Case 1
'add the filesize to the count
temp_returned = FileSize(npath + temp_file)
If temp_returned >= nfilter
'add file instance to the list
temp_item = New tpathsizeitem
temp_item.file = True
temp_item.path = npath + temp_file
temp_item.size = temp_returned
'add to list
nlist.addlast(temp_item)
End If
'increase count for return
temp_count :+ temp_returned
Case 2
'recurse sub folder
temp_returned = RecurseDirectory(npath + temp_file + "/",nlist,nfilter)
If temp_returned >= nfilter
'add folder instance to the list
temp_item = New tpathsizeitem
temp_item.file = False
temp_item.path = npath + temp_file
temp_item.size = temp_returned
'add to list
nlist.addlast(temp_item)
End If
'increase count for return
temp_count :+ temp_returned
End Select
Delay 1
Forever
CloseDir temp_dir
Return temp_count
End Function
Type tpathsizeitem
Field file:Byte
Field path:String
Field size:Long
End Type
Enjoy!
|