none
Den Pfad einer Datei umbenennen und diese dorthin kopieren RRS feed

  • Frage

  • Hallo,

    mein Programm greift auf verscheidene Textdokumente zu die verändert werden können und unter neuem Namen abgespeichert werden können.
    Nun passiert es, dass die Datei fälschlicherweise einfach nur gespeichert wird (nicht speichern unter ...)
    Ich habe daher mein Programm dahingehend modifiziert, dass man eine so veränderte Vorlage durch das Original, dass als Sicherung auf dem lokalen Rechner an anderer Stelle hinterlegt ist, wiederherstellen kann.
    Das funktioniert auch prima.

    Normal muss nun der Anwender die falsch gespeicherte Datei erst unter einem richtigen Namen abspeichern, bevor die Wiederherstellung die Datei überschreibt. Ich schreibe aber das Programm für unsere interne Anwendung in der Firma und kenne meine Pappenheimer.
    Daher möchte ich noch einen Schritt weiter gehen und folgendes machen.

    Die Datei, die ausgewählt wurde und wiederhergestellt werden soll ist bekannt. Das Verzeichnis in das diese kopiert werden soll bevor sie durch das Original überschrieben wird auch. Das lege ich ja selbst fest.

    Mir ist es bsi hierher gelungen, Quelle und Ziel zu ermitteln. Eigentlich müsste ich nun nur noch FileCopy machen und das Proble wäre gelöst.

    Hier ist mein Problem:

    Dim

     

    QMFSAR As String = PersonenVerzeichnis & "\QMFSAR\Sicherungsdatei\" & LoginShowName & "\" & Date.Today & "\"

     

    'Hier wird getauscht

     

    Dim EingabeSave As String 'Das ist die ausgew„hlte Datei

     

    Dim SuchenSave As String 'Das ist der NetSource

     

    Dim ErsetzeSave = QMFSAR 'ich suche den 1. Teil der Eingabe und ersetze ihn durch diesen

     

    Dim AnzeigeSave As String 'Kontrollanzeige der neu erzeugten Datei

    EingabeSave = eingabe

    'die ausgew„hlte Datei bleibt identisch

    SuchenSave = suchen

    ' auch diese Angebe ist identisch zur Wiederherstellung

    ErsetzeSave = QMFSAR

    'das ist das oben neu erzeugte Verzeichnis fr die Siecherungskopier

    AnzeigeSave = EingabeSave.Replace(SuchenSave, ErsetzeSave)

    'Hier wird der vorder Teil des Pfades getauscht

    MsgBox(

    "Die Datei: " & EingabeSave & " wird umbenannt in: " & AnzeigeSave) 'suchen muss hierdurch ersetzt werden

     

    'MsgBox("Datei " & suchen)

     

    'MsgBox("Datei " & anzeige)

     

    If Not Directory.Exists(AnzeigeSave) Then

    MkDir(AnzeigeSave)

    'Es wird das Verzeichnis zur Sicherung der f„lschlicherweise ver„nderten Datei angelegt

     

    Else

    Ich möchte also eine Datei in das PersonenVerzeichnis  (C:\Dokumenten und Einstellungen\Anwendername\QMFSAV\ ...) kopieren, wobei noch der Anwender (LoginShowName) und das Datum Bestandteil des Verzeichnisses sein sollen damit man besser danach suchen kann wer wann was gemacht hat.
    Mein Problem ist nun, dass nach dem Umbenennen der Datei mit Pfad am Ende natürlich eine Datei steht.
    Mir fehlt also das richtige Verzeichnis.
    Wenn ich also einen Pfad habe C:\Dokumente und Einstellungen\QMFSAV\Sicherungsdatei\Stefan\09.09.2009\Test.txt muss ich ja erst prüfen, ob C:\Dokumente und Einstellungen\QMFSAV\Sicherungsdatei\Stefan\09.09.2009\ existiert, das Verzeichnis ggf. erzeugen und erst dann die Datei in das Verzeichnis kopieren.
    Wie komme ich an den vorderen Teil?
    Ich weiß zwar, wie ich nur an den Dateinamen ohen Extension komme, das TXT oder doc etc. fehlt mir ja aber dann an anderer Stelle.
    Kann mir dabei jemand helfen?
    Liebe Grüße Stefan
    Mittwoch, 9. September 2009 21:41

Antworten

  • Hallo giftzwockel,

    sog ganz habe ich deine Frage nicht verstanden, jedoch glaube ich das du nur den Pfad ermitteln möchtest. wenn ja, frag die Position des letzten \ ab von hinten ab.
    Das geht mit IntStrREv

    Imports

     

    Microsoft.VisualBasic    ' ich galube der muss rein

    Dim

     

     Slash As Integer = InStrRev(Pfad, "\")                   ' Position des letzten Slash  aus dem kompletten Pfad und Dateiname  (C:\MeinVerz\Test\Text.txt)
                                                                               ' (Slash = 17te Position)
    Dim PfadName As String = Left(Pfad, Slash )                ' wenn du den Pfad brauchst
    Dim PfadName As String = Left(Pfad, Slash  - 1)           ' wenn du den Pfad ohne den letzten Slash brauchst

    Ich weis nicht ob es eine Funktion oder einen Befehl dafür gibt. Ist aber egal es funktioniert ja auch so.
    Somit kannst du dir von hinten die Position des letzten Slash ermitteln und dann weiter verarbeiten.

    wenn das nicht gemeint war, dann erklär nochmal anders.

    Bernd

    • Als Antwort markiert Giftzwockel Samstag, 12. September 2009 09:30
    Donnerstag, 10. September 2009 14:43
  • Hallo Stefan,

    kurz und schmerzlos und vollkommen ohne Karos:

        Dim quellDatei As String = "C:\MeinVerz\Test\Text.txt"
        Dim  zielDatei As String = "C:\MeinVerz\Kopie\Test\Text.txt"
    
        If File.Exists(quellDatei) Then
            If File.Exists(zielDatei) Then
                File.Delete(zielDatei)
            Else
                Directory.CreateDirectory(Path.GetDirectoryName(zielDatei))
            End If
            File.Copy(quellDatei, zielDatei)
        End If
    

    denn um die restliche Prüfung kümmert sich schon Directory.CreateDirectory

    Gruß Elmar
    • Als Antwort markiert Giftzwockel Sonntag, 13. September 2009 11:47
    Samstag, 12. September 2009 15:45
    Beantworter

Alle Antworten

  • Hallo giftzwockel,

    sog ganz habe ich deine Frage nicht verstanden, jedoch glaube ich das du nur den Pfad ermitteln möchtest. wenn ja, frag die Position des letzten \ ab von hinten ab.
    Das geht mit IntStrREv

    Imports

     

    Microsoft.VisualBasic    ' ich galube der muss rein

    Dim

     

     Slash As Integer = InStrRev(Pfad, "\")                   ' Position des letzten Slash  aus dem kompletten Pfad und Dateiname  (C:\MeinVerz\Test\Text.txt)
                                                                               ' (Slash = 17te Position)
    Dim PfadName As String = Left(Pfad, Slash )                ' wenn du den Pfad brauchst
    Dim PfadName As String = Left(Pfad, Slash  - 1)           ' wenn du den Pfad ohne den letzten Slash brauchst

    Ich weis nicht ob es eine Funktion oder einen Befehl dafür gibt. Ist aber egal es funktioniert ja auch so.
    Somit kannst du dir von hinten die Position des letzten Slash ermitteln und dann weiter verarbeiten.

    wenn das nicht gemeint war, dann erklär nochmal anders.

    Bernd

    • Als Antwort markiert Giftzwockel Samstag, 12. September 2009 09:30
    Donnerstag, 10. September 2009 14:43
  • Hallo Stefan,

    das hattest Du schon mal ;-)

    Die Path Klasse enthält alles, was Du dazu brauchst.
    Ein Beispiel kann ich aber anhand Deines Codes nicht erstellen, da fehlt zu vieles.

    Etwas wie
    QMFSAR As String = PersonenVerzeichnis & "\QMFSAR\Sicherungsdatei\" & LoginShowName & "\" & Date.Today & "\"
    solltest Du grundsätzlich vermeiden und ausschließlich via Path.Combine arbeiten.
    Und Date.Today ist zudem von der Benutzersprache abhängig, jemand der englisch
    oder französisch verwendet, bekommt ein andere Datums Zeichenkette heraus.

    Gruß Elmar

    Donnerstag, 10. September 2009 21:59
    Beantworter
  • Hallo Elmar,

    ich denke scheinbar doch zu "kleinkariert". Da ich mein Programm für die eigene Firma bastel, kommen solche globalen Überlegungen einfach zu kurz.
    Ich werde mal versuchen, so an die Sache heranzugehen als wollte ich ein Programm schreiben, dass die ganze Welt braucht ;-).


    Liebe Grüße Stefan
    Samstag, 12. September 2009 09:23
  • Hallo Bernd,

    ich glaube, das wars. Ich versuchs erst mal aus. Danke
    Liebe Grüße Stefan
    Samstag, 12. September 2009 09:30
  • Hallo Bernd,

    ich sitze auf dem Schlauch. Dabei sollte ich wirklich in der Lage sein das Problem selbst zu lösen.

    Ich habe eine Datei z.B. C:\MeinVerz\Test\Text.txt
    Diese Datei Text.txt möchte ich in ein Verzeichnis kopieren, das es noch nicht gibt. Dieses verzeichnis soll z.B. C:\MeinVerz\Kopie\Test\Text.txt heißen.
    In meinem Programm habe ich folgende Vorabeit gelöst:

    1. Name und Pfad der Datei die ich kopieren möchte ermittelt C:\MeinVerz\Test\Text.txt
    2. Name und Pfad für das Ziel ermittelt C:\MeinVerz\Kopie\Test\Text.txt

    Wenn ich nun schreibe FileCopy (Quelle,Ziel) bekomme ich eine Fehlermeldung, weil das Zielverzeichnis noch nicht besteht.
    Ich kann also über If Not Directory.Exist .. prüfen ob das Verzeichnis besteht und dieses ggf. erzeugen.
    Soweit zur Theorie.

    Mein Problem ist, dass das Zielverzeichnis C:\MeinVerz\Kopie\Test\ erst angelegt werden muss und ich nicht weiss, wie man aus
    C:\MeinVerz\Kopie\Test\Text.txt  ein  C:\MeinVerz\Kopie\Test\  macht. Also den eigentlichen Dateinamen entfernt.

    Wenn ich das habe, sollte folgendes zum Ziel führen:

    If Not Directory.Exist (Zielverzeichnis) Then
    MkDir (Zielverzeichnis)
    FileCopy (Quelle, Ziel)
    Else
    FileCopy (Quelle,Ziel)
    End If

    Für die MkDir-Methode kann ich ja nicht das Ziel an Sich angeben weil ich sonst ein Verzeichnis mit dem Dateinamen anlege. Das ist es aber nicht was ich erreichen möchte.



    Liebe Grüße Stefan
    Samstag, 12. September 2009 10:38
  • Hallo Stefan,

    kurz und schmerzlos und vollkommen ohne Karos:

        Dim quellDatei As String = "C:\MeinVerz\Test\Text.txt"
        Dim  zielDatei As String = "C:\MeinVerz\Kopie\Test\Text.txt"
    
        If File.Exists(quellDatei) Then
            If File.Exists(zielDatei) Then
                File.Delete(zielDatei)
            Else
                Directory.CreateDirectory(Path.GetDirectoryName(zielDatei))
            End If
            File.Copy(quellDatei, zielDatei)
        End If
    

    denn um die restliche Prüfung kümmert sich schon Directory.CreateDirectory

    Gruß Elmar
    • Als Antwort markiert Giftzwockel Sonntag, 13. September 2009 11:47
    Samstag, 12. September 2009 15:45
    Beantworter
  • Hallo giftzwockel,
    sorry war bisher verhindert.
    haber hat dir die antwort von Elmar geholfen ?
    ansonsten helfe ich weiter.
    dann währe es aber einfacher mit einem beispiel.

    danke
    bernd
    Samstag, 12. September 2009 17:24
  • Hallo Elmar,

    das hatt wir tatsächlich schon. Vielleicht sollte ich mir solche Dinge besser aufschreiben, wenn ich sie mir nicht merken kann ;-(

    Ich habe das echt lange auf die verrückteste Art und weise versucht, dabei ist die Löung recht simpel.

    Tatsächlich bin ich heute dann auf diese Lösung gekommen:

    Dim

     

    ErzeugeSaveDir As String

    ErzeugeSaveDir = Path.GetDirectoryName(AnzeigeSave)

    'Weist der Variablen ErzeugeSaveDir den Verzeichnisnamen aus AnzeigeSave zu

     

    'MsgBox("Verzeichnisname: " & ErzeugeSaveDir) 'Gibt zu Kontrolle Verzeichnisnamen aus

     

     

    'Prfen und kopieren

     

    'Wenn das Verzeichnis nicht existiert, wird es angelegt

     

    If Not Directory.Exists(ErzeugeSaveDir) Then

    MkDir(ErzeugeSaveDir)

    'Verzeichnis wird angelegt

    FileCopy(EingabeSave, AnzeigeSave)

    'Ausgew„hlte Quelldatei wird ins Zielverzeichnis kopiert

    WritePrivateProfileString(

    "RESCUE", "Sicherung der Datei: " & EingabeSave & " unter: ", AnzeigeSave, myIniFile) 'Eintrag der in der Ini vorgenommen wird

     

    Else 'Wenne Verzeichnis besteht, wird direkt kopiert

    FileCopy(EingabeSave, AnzeigeSave)

    'Ausgew„hlte Quelldatei wird ins Zielverzeichnis kopiert

    WritePrivateProfileString(

    "RESCUE", "Sicherung der Datei: " & EingabeSave & " unter: ", AnzeigeSave, myIniFile) 'Eintrag der in der Ini vorgenommen wird

     

    End If

    Die vorhandene Datei löschen möchte ich gar nicht, weil die für was anderes gebraucht wird, aber ich habe bei dieser Gelegenheit gleich die File.Delet-Methode und Create.Directory kennenlernen dürfen.

     

     

     



    Beide werde ich mir speichern.
    Noch mal vielen Dank


    Liebe Grüße Stefan
    Sonntag, 13. September 2009 11:56
  • Hallo Bernd,

    danke, die Hilfe von Elmar war super und hat mein Problem gelöst. Aber trotzem nett, dass du noch mal deine Hilfe angeboten hast.
    Liebe Grüße Stefan
    Sonntag, 13. September 2009 11:57
  • Hallo Stefan,

    schön, das es geklappt hat!

    Kleine Anmerkung zu Deinem Code.
    Das von mir verwendete
    Directory.CreateDirectory(Path.GetDirectoryName(zielDatei))

    anstatt
    If Not Directory.Exists(ErzeugeSaveDir) Then
       MkDir(ErzeugeSaveDir)
    
    hat den Vorteil das man gar nicht prüfen muß.
    Denn MkDir ruft auch CreateDirectory auf nur "meckert" es, wenn das Verzeichnis
    bereits existiert. CreateDirectory hält stille und tut einfach nichts.

    Und was das Löschen angeht:
    Visual Basic's FileCopy verwendet intern (aus dem Windows API) ein FileCopy(quelle, ziel, true)
    und überschreibt die Datei, was am Ende (fast) das Gleiche ist.
    Ich habe den Weg des vorherigen Löschens gewählt, um ein Problem wie z. B.
    eine geöffnete Datei, kein Zugriff direkter erkennen zu können -
    falls das mal nötig sein sollte.

    Für den Fall der Fälle solltest Du einen Try... Catch Block um das Ganze haben.

    Gruß Elmar
    Sonntag, 13. September 2009 12:58
    Beantworter