Montag, 21. April 2008

Arbeiten mit Verzeichnissen und Dateinamen (Teil 3) / Working with directories and filenames (Part 3)

Die beiden vorangegangenen Teile handelten von den Funktionen GETDIR() und ADDBS() sowie GETFILE(), CHDIR und CURDIR(). In diesem Eintrag geht es nun um die Zerlegung der einzelnen Bereiche eines Dateinamens inklusive vorgelagertem Pfadnamen.

Wenn wir mit Hilfe von GETFILE() eine Datei selektiert und die Auswahl überprüft haben,

cFile = GETFILE()
IF FILE(cFile)
    ...
ENDIF

kommt es immer wieder vor, dass wir nur einen Teil des in 'cFile' stehenden Wertes verarbeiten möchten.

Gehen wir einmal davon aus, dass in cFile der folgende Wert enthalten ist:

C:\Dokumente und Einstellungen\Benutzername\Lokale Einstellungen\Temp\Demodatei.doc
 
so stellt uns Visual Foxpro nun u.a. sieben Funktionen bereit, diesen String zu zerlegen.
Die Funktion JUSTDRIVE() liefert uns als Ergebnis den Laufwerksbuchstaben:

C:\Dokumente und Einstellungen\Benutzername\Lokale Einstellungen\Temp\Demodatei.doc
 
cFile = [C:\Dokumente und Einstellungen\Benutzername\Lokale Einstellungen\Temp\Demodatei.doc]
?JUSTDRIVE(cFile)

Die Funktion JUSTPATH() liefert uns als Ergebnis den Laufwerksbuchstaben inklusive des kompletten Pfades, jedoch ohne Backslash am Ende:

C:\Dokumente und Einstellungen\Benutzername\Lokale Einstellungen\Temp\Demodatei.doc
 
cFile = [C:\Dokumente und Einstellungen\Benutzername\Lokale Einstellungen\Temp\Demodatei.doc]
?JUSTPATH(cFile)

Die Funktion JUSTSTEM() liefert uns als Ergebnis den Dateinamen ohne Suffix:

C:\Dokumente und Einstellungen\Benutzername\Lokale Einstellungen\Temp\Demodatei.doc
 
cFile = [C:\Dokumente und Einstellungen\Benutzername\Lokale Einstellungen\Temp\Demodatei.doc]
?JUSTSTEM(cFile)

Die Funktion JUSTFNAME() liefert uns als Ergebnis den Dateinamen mitsamt dem Suffix:

C:\Dokumente und Einstellungen\Benutzername\Lokale Einstellungen\Temp\Demodatei.doc
 
cFile = [C:\Dokumente und Einstellungen\Benutzername\Lokale Einstellungen\Temp\Demodatei.doc]
?JUSTFNAME(cFile)

Die Funktion JUSTEXT() liefert uns als Ergebnis nur das Suffix:

C:\Dokumente und Einstellungen\Benutzername\Lokale Einstellungen\Temp\Demodatei.doc
 
cFile = [C:\Dokumente und Einstellungen\Benutzername\Lokale Einstellungen\Temp\Demodatei.doc]
?JUSTEXT(cFile)

Mit Hilfe dieser Funktionen können wir den Datei- bzw. Verzeichnisnamen in 5 Segemente zerlegen und ggf. durch neue Teile ersetzen. Wollen wir nun bspw. eine Backup-Datei von Demodatei.doc im selben Verzeichnis anlegen, dann greift die Funktion FORCEEXT(). Mit ihrer Hilfe wird aus Demodatei.doc der String Demodatei.bak Hierbei steht es uns frei, den kompletten Verzeichnisnamen oder nur den reinen Dateinamen mitzugeben.

cFile = [C:\Dokumente und Einstellungen\Benutzername\Lokale Einstellungen\Temp\Demodatei.doc]
?FORCEEXT(cFile,[bak])
?FORCEEXT(JUSTSTEM(cFile),[bak])
?FORCEEXT(JUSTFNAME(cFile),[bak])


Soll die Backup-Datei in einem Unter- oder Parallelordner abgelegt werden, so könnte die Funktion FORCEPATH() zum Zuge kommen.

Für den Unterordner 'Backups':

C:\Dokumente und Einstellungen\Benutzername\Lokale Einstellungen\Temp\Backups\Demodatei.doc
 
cFile = [C:\Dokumente und Einstellungen\Benutzername\Lokale Einstellungen\Temp\Demodatei.doc]
?FORCEPATH(cFile,ADDBS(JUSTPATH(cFile)) + [Backups])

Im Parallelordner 'Backups':

C:\Dokumente und Einstellungen\Benutzername\Lokale Einstellungen\Backups\Demodatei.doc
 
cFile = [C:\Dokumente und Einstellungen\Benutzername\Lokale Einstellungen\Temp\Demodatei.doc]
?FORCEPATH(cFile,ADDBS(JUSTPATH(JUSTPATH(cFile))) + [Backups])

Im Verbund mit der Funktion FORCEEXT() ergeben sich daraus nun bspw. die folgenden Funktionen:

LOCAL    lcBackupExt as String, lcBackupPath as String, ;
    cFile as String, cFNew as String, cSubDir as String, cParall as String
       
lcBackupExt     = [bak]
lcBackupPath    = [Backups]
cFile           = GETFILE()
cFNew           = FORCEEXT(JUSTSTEM(cFile),lcBackupExt)
cSubdir         = GetSubdirectory(JUSTPATH(cFile),lcBackupPath,.T.)
cParall         = GetParallelDirectory(JUSTPATH(cFile),lcBackupPath,.T.)

CLEAR

=CreateBackupFile(cFile,cSubDir + cFNew)
=CreateBackupFile(cFile,cParall + cFNew)

FUNCTION CreateBackupFile
LPARAMETERS vSourceFile as String, vTargetFile as String

    LOCAL llReturn as Boolean
   
    ?[kopiere ] + vSourceFile
    ?[nach    ] + vTargetFile
    TRY
        COPY FILE (m.vSourceFile) TO (m.vTargetFile)
        ?[Kopiervorgang erfolgreich durchgeführt]
        llReturn = .T.
    CATCH
        ?[Kopiervorgang ist fehlgeschlagen]
    ENDTRY

    RETURN llReturn
   
ENDFUNC

FUNCTION GetSubdirectory
LPARAMETERS vPath as String, vSubDir as String, vCreate as Boolean

    LOCAL lcPath as String
    m.vPath    = ADDBS(m.vPath)
    lcPath     = FORCEPATH(m.vPath,m.vPath + m.vSubDir)
   
    IF m.vCreate = .T. AND !DIRECTORY(lcPath)
        MKDIR (lcPath)
    ENDIF
   
    RETURN lcPath
   
ENDFUNC

FUNCTION GetParallelDirectory
LPARAMETERS vPath as String, vSubDir as String, vCreate as Boolean

    LOCAL lcPath as String
    lcPath    = ADDBS(ADDBS(JUSTPATH(JUSTPATH(ADDBS(m.vPath)))) + m.vSubDir)

    IF m.vCreate = .T. AND !DIRECTORY(lcPath)
        MKDIR (lcPath)
    ENDIF

    RETURN lcPath
   
ENDFUNC

Keine Kommentare:

Kommentar veröffentlichen