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);

{ ... }