Entwickler-Ecke
Dateizugriff - Fehler bei Kopieren mit SHFileOperation
Delete - Mo 04.11.02 21:39
Titel: Fehler bei Kopieren mit SHFileOperation
Hallo!
Ich versuche, in einem DatenbankProgramm ein Backup zu machen. D.h. ich kopiere einfach nur Ordner durch die Gegend.
So, das geht soweit auch, aber wenn ich versuche den DatenbankOrdner zu kopieren, kommt eine Fehlermeldung:
Zitat: |
Datei existiert nicht... |
(oder so ähnlich)
Der Pfad ist 100%ig richtig. Es liegt also daran, dass ich Datenbankdateien kopiere.
Aber wenn ich das Programm starte und dann mit dem Explorer den besagten Ordner kopiere, dann geht alles glatt. Jo, warum geht das so, aber im Programm nicht? Ich benutze schließlich auch die Windows-Funktion...
Jau, falls es einer verstanden haben sollte, und diese Person meint, er müsse mir helfen, dann wäre ich
sehr dankbar, wenn er genau dies täte.
Aloha
Michael Stenzel - Di 05.11.02 00:06
Hast Du daran gedacht die Strings (pFrom und pTo) mit einem doppeltem Nullzeichen zu beenden?
Quelltext
1:
| Dateiname := 'File.dat'+#0+#0; |
Probier es mal aus.
LCS - Di 05.11.02 15:06
Hi
bis jetzt bin ich bei SHFileOperation noch nie auf ein Problem gestossen. Vielleicht postet du mal den entsprechenden Code-Abschnitt.
Gruss Lothar
Delete - Di 05.11.02 17:51
Hallo !
Zuerst zu Michael :
Ich versuche den ganzen Ordner zu kopieren, und nicht einzelne Dateinen, deswegen weis ich nicht ob es funzt,aber ich werde es mal probieren.
Was sollen denn die beiden #0 bewirken ? ich kenne bisher nur #13#10 bzw Chr(13) für Zeilenumbruch.
LCS:
Ok, ich poste hier mal den ganzen Code mit Kommentaren, die ich fürs verständnis für notwendig halte.
Es gibt 2 Sachen (Ordner) zu backuppen, "Belegungen" und "DB", die "TCopyModes" dafür sind cmBel und cmDB. (type TCopyMode= (cmBel,cmDB);
Ich will die Ordner in einen Oberordner mit dem aktuellen Datum packen, also soll bei der Option beide zu backuppen folgendes passieren:
Dateien aus "\Datenbanken" in Verzeichnis \Backup\<Datum>\DB\*.* und
"\Belegungen" in Verzeichnis \Backup\<Datum>\Bel\*.*
ALLE PFADANGABEN SIND OHNE BACKSLASH AM ENDE, falls das eine Bedeutung hat.
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67:
| procedure TfrmBackup.CopyFiles(NewDir: String; cmMode:TCopyMode); var from:String; s : SHFileOpStruct; begin case cmMode of cmBel: begin NewDir := NewDir{+SubPathBel}+'\'; // Config ist ein record, in dem der Pfad für die Belegungen steht // (soll variable sein, mehr nicht) from := config.Belegungenpath; end; cmDB: begin NewDir := NewDir{+SubPathDB}+'\'; from := 'Datenbanken'; end; end;
// Einstellungen fürs kopieren s.Wnd := handle; s.wFunc := FO_COPY; s.pTo := PChar(NewDir); s.pFrom := PChar(bp); // test showmessage(s.pFrom + chr(13)+'-->'+chr(13)+s.pTo);
s.fFlags := FOF_NOCONFIRMATION; s.fAnyOperationsAborted := false; s.hNameMappings := nil; s.lpszProgressTitle := nil;
// Vorgang starten if Succeeded(SHFileOperation(s)) then ShowMessage('Backup erfolgreich durchgeführt'); end;
procedure TfrmBackup.btnCreateClick(Sender: TObject); var Datum:String; begin
// Backupdir standardmäßig "Backup" // Aktuelles Datum holen und anhängen Datum := Backupdir+'\'+DateToStr(Date);
if Directoryexists(Datum) then begin // Falls das Backup schon existiert if MessageDlg('Es existiert schon ein Backup von heute, überschreiben ?',mtWarning,[mbYes,mbNo],0) = mrNo then exit; end else ForceDirectories(Datum);
// Nur optionen, ob nur Bel oder DB oder beides gesichert werden soll Case RGSave.ItemIndex of 0: CopyFiles(Datum,cmDB); 1: CopyFiles(Datum,cmBel); 2: begin CopyFiles(Datum,cmBel); CopyFiles(Datum,cmDB); end; end; // Aktuelles Backupdatum eintragen Config.Backupdate := Date; end; |
Tja, wenn einer was weis, vielen dank !
Delete - Di 05.11.02 18:51
lilalaunebaer hat folgendes geschrieben: |
Was sollen denn die beiden #0 bewirken ? |
Die beiden Nullen sind sozusagen die "Ende"-Marke. Du kannst nämlich in einem Aufwasch auch mehrere Dateien kopieren; dazu gibst du ihre Namen hintereinander an, jeweils durch #0 voneinander getrennt. Und den Abschluss bildet dann #0#0.
Zitat: |
Ok, ich poste hier mal den ganzen Code mit Kommentaren, die ich fürs verständnis für notwendig halte. |
Der Code zu "SHFileOperation" hätte gereicht.
Quelltext
1: 2: 3: 4: 5:
| { ... } s.pTo := PChar(NewDir + #0#0); s.pFrom := PChar(bp + #0#0);
{ ... } |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!