Benutzer mit den meisten Antworten
Den Pfad einer Datei umbenennen und diese dorthin kopieren

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 fr 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
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
-
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
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
-
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
-
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 -
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 -
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
-
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
'Prfen 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 -
Hallo Stefan,
schön, das es geklappt hat!
Kleine Anmerkung zu Deinem Code.
Das von mir verwendete
Directory.CreateDirectory(Path.GetDirectoryName(zielDatei))
anstattIf 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