Page 1 of 1

Delete Folder

Posted: Mon Feb 19, 2018 10:13 am
by Timm
Hi!

I delete folders with oFs:DeleteFolder( cFolder, .t. ) but this crashes with an error message when a file in the directory is in use (for example in Adobe Reader).

Does someone have a idea how to check if a folder can be deleted?

Best regards, Timm.

Re: Delete Folder

Posted: Tue Feb 20, 2018 2:18 pm
by ignacio
Hi Timm,

The easiest way: Just use a TRY..CATCH

But I suggest to first read all the files on that directory and below and try to delete them one by one. If any deletion fails show a message.

Use the following function to retrieve all the files.

Regards,

Code: Select all

STATIC FUNCTION RecurseDir( cMask, lRecursive, aFiles )

   LOCAL aDir, aFile
   LOCAL cPath, cFile

   DEFAULT aFiles TO {}, lRecursive TO .F.

   aDir  := Directory( cMask )
   cPath := FilePath( cMask )
   cMask := FileFullname( cMask )

   FOR EACH aFile IN aDir
      cFile := aFile[ F_NAME ]
      AAdd( aFiles, cPath + "\" + cFile )
   NEXT

   IF lRecursive
      aDir := Directory( cPath + "\*.*", "D" )
      FOR EACH aFile IN aDir
         cFile := aFile[ F_NAME ]
         IF "D" $ aFile[ F_ATTR ] .AND. cFile != "." .AND. cFile != ".."
            RecurseDir( cPath + "\" + cFile + "\" + cMask, .T., @aFiles )
         ENDIF
      NEXT
   ENDIF

RETURN aFiles

Re: Delete Folder

Posted: Fri Mar 09, 2018 1:37 pm
by Timm
Hi Ignacio,

many thanks for your help!
I use this now to check if a file is in use before I delete the folder:

Code: Select all

FUNCTION IsFileOpen( cPath )

   local aFile
   local lFileOpen := .f.

   for each aFile in DirectoryRecurse( cPath + "*.*" )
      if FRename( aFile[ F_NAME ], aFile[ F_NAME ] ) <> 0
         lFileOpen := .t.
         exit
      endif
   next

RETURN lFileOpen

That gives me the possibility to inform the user before starting the deleting process.

Best regards, Timm.