Often the need arises to open, move, or delete a file on disk. Unfortunately there is no direct way within 4D to determine if the file is locked. But there is an indirect way for you to programmatically handle the situation.
If 4D attempts one of numerous operations on an external file, such as open, move, delete, or rename, the operating system can return one of 30 possible errors. The complete list of these errors can be found under "OS File Manager Errors" in chapter 68 - Error Codes of the 4th Dimension Language Reference at: https://www.4d.com/docs/CMu/CMU02028.HTM. A technique of using a customized error handling method in combination with 4D's system variable "Error" can provide a robust method of handling the situation.
First create a method to be installed with ON ERR CALL before any file manipulation. In this tech tip, moving and renaming a file will be used as an example. In this case, the error handler only captures the system variable "Error". This method also prevents 4D from displaying itís own error dialog box.
C_LONGINT(Error;$1) If(Count parameters>0) Error:=$1 End if |
Next initialize the system variable "Error" to zero and capture any installed error handler so we can return it to handling other errors when done.
Error:=0 `// Init the system variable Error to zero C_TEXT($OldErrorHandler_T) $OldErrorHandler_T:=Method called on error ON ERR CALL(EMPTY_HandleError) |
Now to attempt to move and rename some files. This routine assumes that any file currently in use will only be used for a very short period of time and will then be closed and freed.
`// Rename and move the existing file $DST_PathName_T:=$DST_PathName_T+String(Tickcount)+"_"+$FileName_T+".txt" If(Test path name($SRC_PathName_T)=Is a document) $Ticks_L:=Tickcount Repeat Error:=0 MOVE DOCUMENT($SRC_PathName_T;$DST_PathName_T) If(Error#0) DELAY PROCESS(Current process;15) End if Until ((Error=0) | ((Tickcount-$Ticks_L)>60)) End if If(Error=0) If(Test path name($SRC_PathName_T)=Is a document ) DELETE DOCUMENT($SRC_PathName_T) End if If(Test path name($FilePath_T+$FileName_T+".txt")#Is a document ) $SRC_PathName_T:=$FilePath_T+$FileName_T+"_New.txt" If(Test path name($SRC_PathName_T)=Is a document ) $DST_PathName_T:=$FilePath_T+$FileName_T+".txt" MOVE DOCUMENT($SRC_PathName_T;$DST_PathName_T) End if End if End if ON ERR CALL($OldErrorHandler_T) |