Autor Beitrag
lilalaunebaer
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 04.11.02 21:39 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 133


D3 Prof, D7 PE
BeitragVerfasst: Di 05.11.02 00:06 
Hast Du daran gedacht die Strings (pFrom und pTo) mit einem doppeltem Nullzeichen zu beenden?

ausblenden Quelltext
1:
Dateiname := 'File.dat'+#0+#0;					


Probier es mal aus.
LCS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: 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

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...
lilalaunebaer
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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.

ausblenden volle Höhe 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 !
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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.
ausblenden Quelltext
1:
2:
3:
4:
5:
{ ... }
s.pTo := PChar(NewDir + #0#0);
s.pFrom := PChar(bp + #0#0);

{ ... }