file and folder copy
BlitzMax Forums/BlitzMax Beginners Area/file and folder copy
| ||
I have not had much experience in file handling, so I am having some problems getting a specific program made. I need to be able to copy files and folders from one location to another, but I need it to copy and delete the source files one file at a time. I have the following code to go though folders and files, but I am uncertain as to how I can use this to do the above. enumFiles("E:\applications\") Function enumFiles:Int(dir:String) Local folder:Int=ReadDir(dir) Local file:String Local fullpath:String Repeat file=NextFile(folder) If (file) And (file <> ".") And (file <> "..") fullPath = RealPath(dir+"/"+file) If FileType(fullPath)=FILETYPE_DIR Print "Folder: "+file enumFiles(fullPath) Else Print "File: "+file End If End If Until (file=Null) CloseDir folder End Function I cannot have it simply copy an entire directory at once, I need it to copy each file one at a time, and have it create the folders at the destination location one at a time as needed. |
| ||
Just knocked this up for you:SuperStrict 'Warning, this function will overwrite any existing files in the destination 'directory if they have the same filenames WITHOUT WARNING. CopyFolder( "D:\Favorites\", "C:\Temp\My Favorites\") Function CopyFolder( pSource$, pDest$ ) pSource = StripSlash(pSource.Replace("\","/")) pDest = StripSlash(pDest.Replace("\","/")) 'Create the directory if it isn't already there. CreateDir( pDest, True ) For Local tmpItem$ = EachIn LoadDir(pSource,True) Local tmpFullItemPath$ = pSource + "/" + tmpItem Local tmpFullItemDest$ = pDest + "/" + tmpItem Select FileType(tmpFullItemPath) Case FILETYPE_FILE Print "Copying file: ~q" + tmpItem + "~q" CopyFile( tmpFullItemPath, tmpFullItemDest ) Case FILETYPE_DIR Print "Copying folder: ~q" + tmpItem + "~q" CopyFolder(tmpFullItemPath, tmpFullItemDest) EndSelect Next EndFunctionHope it helps! |
| ||
I must have overlooked the LoadDir command, because that surely simplyfies filehandling somewhat. It works really well as far as copying files and folders. But it does not delete the source files and folders. I am not sure what I need is possible. This is the senario that I am trying to solve: We have some folders with files and subfolders that needs to be moved to another area of a network drive. Unfortunately we cannot just move the files because of problems with access rights being moved with the files when using move, but if we copy first and then delete the old, then the access rights are not transfered with the files. We also have the problem of not having room on the drive to simply move complete folders at once, but we figured that if we copied one file at a time and deleted the source afterwards, then we would not need much extra space and there should be room on the drive for it. |
| ||
Aha, if you wanted an equivalent MoveFolder() function, why didn't you ask... ;-)SuperStrict 'Warning, this function will overwrite any existing files in the destination 'directory if they have the same filenames WITHOUT WARNING. MoveFolder( "C:\Temp\My Favorites\", "D:\Favorites\") Function MoveFolder%( pSource$, pDest$ ) Local tmpReturnValue% = True pSource = StripSlash(pSource.Replace("\","/")) pDest = StripSlash(pDest.Replace("\","/")) 'Create the directory if it isn't already there. CreateDir( pDest, True ) For Local tmpItem$ = EachIn LoadDir(pSource,True) Local tmpFullItemPath$ = pSource + "/" + tmpItem Local tmpFullItemDest$ = pDest + "/" + tmpItem Select FileType(tmpFullItemPath) Case FILETYPE_FILE 'Test if copy was successful and if so, remove the original file. If CopyFile( tmpFullItemPath, tmpFullItemDest ) Then DeleteFile( tmpFullItemPath ) Else Print "Unable to move ~q" + tmpFullItemPath + "~q" tmpReturnValue = False EndIf Case FILETYPE_DIR If Not MoveFolder(tmpFullItemPath, tmpFullItemDest) Then tmpReturnValue = False EndSelect Next If tmpReturnValue Then DeleteDir(pSource) Else Print "Unable to delete source folder: ~q" + pSource + "~q" Return tmpReturnValue EndFunctionSeems to work fine here. :-P |
| ||
That sure does seem to do the job just fine. Thank you very much, its really appreciated. |