Montag, 30. Juni 2008

Kopieren, verschieben und löschen von Verzeichnisstrukturen / Copy, move and delete directory structures

Das Kopieren, Verschieben/Umbenennen und Löschen von einzelnen Dateien stellt unter Visual Foxpro üblicherweise kein Problem dar. Die Befehle


COPY FILE Filename1 TO Filename2
RENAME Filename1 TO Filename2
DELETE FILE Filename [RECYCLE]

übernehmen diese Aufgaben. An dieser Stelle möchte ich jedoch nochmals auf meinen Blog-Eintrag zum Thema Namensausdrücke hinweisen, denn die dort beschriebenen Vorgehensweisen gelten auch für die o.a. Befehle. Der Sourcecode sollte somit in etwa wie folgt ausschauen:


COPY FILE (cFilename1) TO (cFilename2)
RENAME (cFilename1) TO (cFilename2)
DELETE FILE (cFilename) RECYCLE

Im aktuellen Posting soll es sich aber nicht um einzelne Dateien sondern um komplette Verzeichnisse und Verzeichnisstrukturen drehen.
Um solche Aufgaben zu erledigen, steht uns die Script-Laufzeitbibliothek zur Verfügung. Hierbei handelt es sich um eine einzelne DLL mit dem Namen scrrun.dll die von Microsoftseite üblicherweise von den folgenden Anwendungen installiert wird: Windows Scripting Host, VBScript, Internet Explorer, Office.

In einem früheren Posting habe ich das FileSystemObject (FSO) bereits genutzt um diverse Laufwerksinformationen abzurufen. Damit sind die verfügbaren Möglichkeiten dieses Objektes jedoch noch nicht erschöpft. Bspw. stehen dort auch Funktionen zur Verfügung, welche wie die bereits oben beschriebenen VFP Befehle, das Kopieren, Umbenennen und Löschen einzelner Dateien ermöglichen. Auch das Erstellen, Lesen und Schreiben von Textdateien ist möglich, doch solche Funktionen nutze ich dann doch lieber mit VFP-Bordmitteln.

Wer sich intensiver mit dem FSO befassen möchte, dem steht u.a. dieser zugegebenermassen schon etwas ältere Technet-Artikel zur Verfügung:
http://www.microsoft.com/germany/technet/datenbank/articles/600360.mspx

Hier gibts die Seite im PDF-Format:
http://download.microsoft.com/download/a/3/3/a3393bf9-cfb4-45d9-ab90-772c81884d9b/sas_adm_nize.pdf

Nun zum eigentlichen Thema. Das FSO stellt uns u.a. drei Methoden zur Verfügung, mit deren Hilfe wir Ordner bearbeiten können.

Mit oFSO.CopyFolder werden komplette Verzeichnisstrukturen kopiert. oFSO.MoveFolder verschiebt Verzeichnisse und oFSO.DeleteFolder löscht sie. Nun ja, die sprechenden Funktionsnamen lassen ohne weiteres den Rückschluss auf ihre jeweilige Funktion zu. Der Hinweis an dieser Stelle ist sozusagen rein obligatorisch... ;-)

Der Einsatz der drei Methoden ist recht unspektakulär, solange wir darauf achten, dass wir Verzeichnisnamen nicht mit einem Backslash (\) abschliessen. In einem solchen Fall reagiert die DLL nämlich leicht verschnupft. Dies ist auch der Grund, weswegen im u.a. Code die etwas unsinnig wirkende Kombination von JUSTPATH und ADDBS Verwendung findet. Sie stellt letztlich sicher, dass grundsätzlich ein Backslash vorhanden ist, damit dieser problemlos entsorgt werden kann.

Noch eine Anmerkung: Der Einsatz von Wildcards (*) ist zwar von FSO-Seite möglich, wird im u.a. Beispielcode jedoch nicht berücksichtigt.


FUNCTION CopyFolder as Boolean
LPARAMETERS vSrcDir as String, vTgtDir as String
   LOCAL oFSO as Object, llOverwrite as Boolean, llReturn as Boolean
   llReturn = .F.
   * // Prüfen ob es das Quellverzeichnis gibt
   IF DIRECTORY(m.vSrcDir)
       * // Prüfen ob es da Ziellaufwerk gibt.
       * // (Ordner kann das FSO erzeugen, aber mit Laufwerken
       * // gibt es da schon noch das ein oder andere Problem) ;-)
       IF DIRECTORY(JUSTDRIVE(m.vTgtDir))
           m.vSrcDir    = JUSTPATH(ADDBS(m.vSrcDir))
           m.vTgtDir    = JUSTPATH(ADDBS(m.vTgtDir))
           llOverWrite    = .T.
           oFSO        = CREATEOBJECT([Scripting.FileSystemObject])
           oFSO.CopyFolder(m.vSrcDir, m.vTgtDir, llOverwrite)
       ENDIF
   ENDIF
   oFSO = []
   RELEASE oFSO
   IF DIRECTORY(m.vTgtDir)
       llReturn = .T.
   ENDIF
   RETURN llReturn
ENDFUNC

FUNCTION MoveFolder as Boolean
LPARAMETERS vSrcDir as String, vTgtDir as String
   LOCAL oFSO as Object, llReturn as Boolean
   llReturn = .F.
   * // Prüfen ob es das Quellverzeichnis gibt
   IF DIRECTORY(m.vSrcDir)
       * // Zum Einen prüfen ob es da Ziellaufwerk gibt.
       * // (Ordner kann das FSO erzeugen, aber mit Laufwerken
       * // gibt es da schon noch das ein oder andere Problem) ;-)
       * // zum Anderen sicherstellen, dass es das Zielverzeichnis
       * // noch nicht gibt. Andernfalls würde dessen Inhalt
       * // überschrieben werden...
       IF DIRECTORY(JUSTDRIVE(m.vTgtDir)) ;
       AND !DIRECTORY(m.vTgtDir)
           m.vSrcDir    = JUSTPATH(ADDBS(m.vSrcDir))
           m.vTgtDir    = JUSTPATH(ADDBS(m.vTgtDir))
           oFSO        = CREATEOBJECT([Scripting.FileSystemObject])
           oFSO.MoveFolder(m.vSrcDir, m.vTgtDir)
           IF DIRECTORY(m.vTgtDir)
               llReturn = .T.
           ENDIF
       ENDIF
   ENDIF
   oFSO = []
   RELEASE oFSO
   RETURN llReturn
ENDFUNC

FUNCTION DeleteFolder as Boolean
LPARAMETERS vTgtDir as String
   LOCAL oFSO as Object, llReturn as Boolean, llForceDel as Boolean
   llReturn = .T.
   * // Prüfen ob es das Verzeichnis gibt
   IF DIRECTORY(m.vTgtDir)
       m.vTgtDir    = JUSTPATH(ADDBS(m.vTgtDir))
       llForceDel    = .T.
       oFSO        = CREATEOBJECT([Scripting.FileSystemObject])
       oFSO.DeleteFolder(m.vTgtDir, llForceDel)
   ENDIF
   oFSO = []
   RELEASE oFSO
   IF DIRECTORY(m.vTgtDir)
       llReturn = .F.
   ENDIF
   RETURN llReturn
ENDFUNC

Keine Kommentare:

Kommentar veröffentlichen