Up to this day, 4D cannot move or delete folders recursively including content.
So I wrote a few methods to do it, and while I was at it, I also wrote a method that compares folders.
These methods are part of my AC_FileTools component to be published in a while. Till then feel free to serve yourself:
Deleting folders:
// ----------------------------------------------------
// Method: ACFT_DeleteFolder
// ----------------------------------------------------
// Call: HasLockedContent:= ACFT_DeleteFolder(FolderPath{;BreakOnError})
// ----------------------------------------------------
// UserName (OS): Alexander Heintz
// Date and Time: 28.10.14, 12:09:04
// ----------------------------------------------------
// Does:
// deletes folder and all of its content.
// if locked content is encoundtered, it either breaks off
// or continues deleting he other stuff (Default)
// ----------------------------------------------------
// Parameters:
// -> $1 text the folder path to delete
// -> $2 boolean true if stop on error desired
// ----------------------------------------------------
// Parameters:
// -> $1 text the folder path to delete
// -> $2 boolean true if stop on error desired
// ----------------------------------------------------
// Parameter Definition
C_TEXT($1)
C_BOOLEAN($2)
C_BOOLEAN($0)
// ----------------------------------------------------
// Local Variable Definition
C_BOOLEAN($b_Break)
C_BOOLEAN($b_FolderLocked)
C_BOOLEAN($b_Locked)
C_BOOLEAN($b_StopOnLocked)
C_LONGINT($l)
C_TEXT($t_File)
C_TEXT($t_Folder)
C_TEXT($t_Path)
// ----------------------------------------------------
// Parameter Assignment
$t_Path:=$1
$b_StopOnLocked:=$2
// ----------------------------------------------------
If (Test path name($t_Path)=Is a folder)
ARRAY TEXT($at_Folders;0)
ARRAY TEXT($at_Files;0)
//get the documents and folders in the path
DOCUMENT LIST($t_Path;$at_Files)
FOLDER LIST($t_Path;$at_Folders)
//first delete all documents
For ($l;1;Size of array($at_Files))
$t_File:=$t_Path+$at_Files{$l}
DELETE DOCUMENT($t_File)
Case of
: ((OK=0) & ($b_StopOnLocked))
$b_Break:=True
$b_Locked:=True
$l:=Size of array($at_Files)
: (OK=0)
$b_Locked:=True
End case
End for
//now delete the folders recursively
If ($b_Break=False)
For ($l;1;Size of array($at_Folders))
$t_Folder:=$t_Path+$at_Folders{$l}+Folder separator
If (ACFT_DeleteFolder ($t_Folder;$b_StopOnLocked))
$b_FolderLocked:=True
If ($b_StopOnLocked)
$b_Break:=True
$l:=Size of array($at_Folders)
End if
End if
End for
End if
DELETE FOLDER($t_Path)
End if
$0:=($b_FolderLocked | $b_Locked)
Copy a folder with all content:
// ----------------------------------------------------
// Method: ACFT_CopyFolder
// ----------------------------------------------------
// Call: ACFT_CopyFolder(Sourcepath;TargetPath{;DeleteExisting})
// ----------------------------------------------------
// UserName (OS): Alexander Heintz
// Date and Time: 28.10.14, 12:52:39
// ----------------------------------------------------
// Does:
// copies a folder to a new destination overweriting anything there already is
// if you want to first delete an already existing copy of the folder pass
// true in the third parameter
// ----------------------------------------------------
// Parameters:
// -> $1 type description
// ----------------------------------------------------
// Parameter Definition
C_TEXT($1)
C_TEXT($2)
C_BOOLEAN($3)
// ----------------------------------------------------
// Local Variable Definition
C_BOOLEAN($b_Break)
C_LONGINT($l)
C_TEXT($t_FolderName)
C_TEXT($t_NewDocPath)
C_TEXT($t_NewPath)
C_TEXT($t_OldDocPath)
C_TEXT($t_OldFOlder)
C_TEXT($t_OldPath)
C_TEXT($t_Path)
// ----------------------------------------------------
// Parameter Assignment
$t_OldPath:=$1
$t_NewPath:=$2
If (Count parameters>2)
$b_DeleteFirst:=$3
End if
// ----------------------------------------------------
If (Test path name($t_OldPath)=Is a folder)
If (Test path name($t_NewPath)#Is a folder)
CREATE FOLDER($t_NewPath;*)
End if
$t_FolderName:=$t_OldPath
If ($t_FolderName=("@"+Folder separator))
$t_FolderName:=Substring($t_FolderName;1;Length($t_FolderName)-1)
End if
While (Position(Folder separator;$t_FolderName)>0)
$t_FolderName:=Substring($t_FolderName;Position(Folder separator;$t_FolderName)+1)
End while
$t_NewPath:=$t_NewPath+$t_FolderName+Folder separator
If (Test path name($t_NewPath)#Is a folder)
CREATE FOLDER($t_NewPath)
Else
If ($b_DeleteFirst)
If (ACFT_DeleteFolder ($t_NewPath))
$b_Break:=True
Else
CREATE FOLDER($t_NewPath)
End if
End if
End if
If ($b_Break=False)
ARRAY TEXT($at_Folders;0)
ARRAY TEXT($at_Files;0)
//get the documents and folders in the path
DOCUMENT LIST($t_OldPath;$at_Files)
FOLDER LIST($t_OldPath;$at_Folders)
//first copy all documents
For ($l;1;Size of array($at_Files))
$t_OldDocPath:=$t_OldPath+$at_Files{$l}
$t_NewDocPath:=$t_NewPath+$at_Files{$l}
COPY DOCUMENT($t_OldDocPath;$t_NewDocPath;*)
End for
//now copy folders recursively
For ($l;1;Size of array($at_Folders))
$t_OldFOlder:=$t_OldPath+$at_Folders{$l}+Folder separator
ACFT_CopyFolder ($t_OldFOlder;$t_NewPath)
End for
End if
Else
ALERT("Some existing items could not be deleted")
End if
And a last, compare folders:
// ----------------------------------------------------
// Method: ACFT_CompareFolder
// ----------------------------------------------------
// Call: FoldersDiffer:=ACFT_CompareFolder(Folder1;Folder2)
// ----------------------------------------------------
// UserName (OS): Alexander Heintz
// Date and Time: 28.10.14, 14:28:37
// ----------------------------------------------------
// Does:
//
//
// ----------------------------------------------------
// Parameters:
// -> $1 text first folder path
// -> $2 text second folder path
// -> $0 boolean true if folders are different
// ----------------------------------------------------
// Parameter Definition
C_TEXT($1)
C_TEXT($2)
C_BOOLEAN($0)
// ----------------------------------------------------
// Local Variable Definition
C_BOOLEAN($b_Different)
C_BOOLEAN($b_Invisible)
C_BOOLEAN($b_Lock)
C_DATE($d_Created1)
C_DATE($d_Created2)
C_DATE($d_Modified1)
C_DATE($d_Modified2)
C_TIME($h_Created1)
C_TIME($h_Created2)
C_TIME($h_Modified1)
C_TIME($h_Modified2)
C_LONGINT($l)
C_TEXT($t_DocPath1)
C_TEXT($t_DocPath2)
C_TEXT($t_Folder1)
C_TEXT($t_Folder2)
C_TEXT($t_FolderPath1)
C_TEXT($t_FolderPath2)
// ----------------------------------------------------
// Parameter Assignment
$t_Folder1:=$1
$t_Folder2:=$2
// ----------------------------------------------------
Case of
: (Test path name($t_Folder1)#Is a folder)
$b_Different:=True
: (Test path name($t_Folder2)#Is a folder)
$b_Different:=True
Else
//check the files first
ARRAY TEXT($at_Files1;0)
ARRAY TEXT($at_Files2;0)
DOCUMENT LIST($t_Folder1;$at_Files1)
DOCUMENT LIST($t_Folder2;$at_Files2)
SORT ARRAY($at_Files1)
SORT ARRAY($at_Files2)
If (Size of array($at_Files1)=Size of array($at_Files2))
For ($l;1;Size of array($at_Files1))
If (Find in array($at_Files2;$at_Files1{$l})<0)
$l:=Size of array($at_Files1)
$b_Different:=True
End if
End for
If (Not($b_Different))
For ($l;1;Size of array($at_Files1))
If ($at_Files1{$l}#".@")
$t_DocPath1:=$t_Folder1+$at_Files1{$l}
$t_DocPath2:=$t_Folder2+$at_Files1{$l}
If (Get document size($t_DocPath1)#Get document size($t_DocPath2))
$l:=Size of array($at_Files1)
$b_Different:=True
Else
GET DOCUMENT PROPERTIES($t_DocPath1;$b_Lock;$b_Invisible;$d_Created1;$h_Created1;$d_Modified1;$h_Modified1)
GET DOCUMENT PROPERTIES($t_DocPath2;$b_Lock;$b_Invisible;$d_Created2;$h_Created2;$d_Modified2;$h_Modified2)
Case of
: ($d_Modified1#$d_Modified2)
$b_Different:=True
$l:=Size of array($at_Files1)
: ($h_Modified1#$h_Modified2)
$b_Different:=True
$l:=Size of array($at_Files1)
End case
End if
End if
End for
End if
Else
$b_Different:=True
End if
If (Not($b_Different))
ARRAY TEXT($at_Folders1;0)
ARRAY TEXT($at_Folders2;0)
FOLDER LIST($t_Folder1;$at_Folders1)
FOLDER LIST($t_Folder2;$at_Folders2)
SORT ARRAY($at_Folders1)
SORT ARRAY($at_Folders2)
If (Size of array($at_Folders1)#Size of array($at_Folders2))
$b_Different:=True
Else
For ($l;1;Size of array($at_Folders1))
If (Find in array($at_Folders2;$at_Folders1{$l})<0)
$l:=Size of array($at_Folders1)
$b_Different:=True
End if
End for
If (Not($b_Different))
For ($l;1;Size of array($at_Folders1))
$t_FolderPath1:=$t_Folder1+$at_Folders1{$l}+Folder separator
$t_FolderPath2:=$t_Folder2+$at_Folders1{$l}+Folder separator
If (ACFT_CompareFolder ($t_FolderPath1;$t_FolderPath2))
$b_Different:=True
$l:=Size of array($at_Folders1)
End if
End for
End if
End if
End if
End case
$0:=$b_Different
Am Anfang ist etwas verdreht ?! oder es fehlt etwas !
Danke, da ist mir im Editor von WordPress was quer gegangen…
Der mag keinen Code…
Ist korrigiert, sollte jetzt gehen.