Entwickler-Ecke

Dateizugriff - copyfile() macht nichts...


Grappa's Hammer - So 31.07.05 15:25
Titel: copyfile() macht nichts...
===> ACHTUNG: N00b postet <===

Hallo!

Ich bin gerade dabei, mein erstes Delphi-Programm zu schreiben, dass etwas über das "Hello World"-Niveau hinausgeht. Es soll ein Programm werden, dass mit WinRAR eine Setup.exe für Elder Scrolls-Plugins erstellen soll.

Ich habe nun folgendes Problem:
Der Ersteller des Setups soll benutzerdefiniert bis zu 4 Bilder einfügen können. Der Pfad jeder einzelnen wird in einem solchen array gespeichert:


Delphi-Quelltext
1:
PictureURI:Array[1..4of string;                    


Klickt man aber einmal auf einen Button mit folgender Prozedur


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TMainForm.SetStyleSelectPicture1_ButtonClick(Sender: TObject);
var
  fx:string;
begin

  if OpenPicture_Dialog.Execute=true then begin
    fx:=OpenPicture_Dialog.FileName;
    if fileexists(fx) then
      PictureURI[1]:=fx
    else begin
      Application.MessageBox('The file you selected could not be loaded!','File Error!',32);
      exit;
    end;
  end;


end;


kopiert die Anwendung später mit copyfile() einfach keine Dateien mehr. Folgende Befehle aus einer ganz anderen Prozedur werden schlichtweg nicht ausgeführt, alles andere, das nichts mit copyfile() zu tun hat, dagegen schon:


Delphi-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:
procedure TMainForm.SummaryCompile_ButtonClick(Sender: TObject);
var
  i,_i:integer;
  f:textfile;
  fn:string;
begin

  ...
  SummaryStatus_ChecklistBox.Items.Add();

  if fileexists('rarsfxfile.exe'then deletefile('rarsfxfile.exe');

        copyfile('.\..\rar\rar.exe',pchar(mw_dir+'\rar.exe'),true);
        copyfile('.\..\rar\rarsfxfile.exe',pchar(mw_dir+'\rarsfxfile.exe'),false);
        copyfile('.\..\rar\test.file',pchar(mw_dir+'\_test.file'),false);

  if not fileexists(mw_dir+'\rar.exe'do begin
                showmessage('dateien wurden einfach nicht kopiert.
    application.terminate;
  end;

  ...

end;
end.


Könnt Ihr mir hier helfen? Ich habe nicht die geringste Ahnung, warum die 3 Dateien mit copyfile() überhaupt nicht kopiert werden, wenn man auf den SetStyleSelectPicture1_Button klickt (nur dann. Andernfalls schon!).

mfg,
jens

Moderiert von user profile iconAXMD: Code- durch Delphi-Tags ersetzt.


SMO - So 31.07.05 15:50

Hallo!

Dein Code lässt sich vereinfachen, wenn du mit dem Objektinspektor in deinem OpenDialog die Options ofPathMustExist und ofFileMustExist auf True setzt. Dann kann der OpenDialog nämlich keine Dateien zurückgeben, die es nicht gibt.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TMainForm.SetStyleSelectPicture1_ButtonClick(Sender: TObject);
begin
  if OpenPicture_Dialog.Execute then
  begin
    PictureURI[1] := OpenPicture_Dialog.FileName;
  end;
end;


So, jetzt zu deinem Problem. Du benutzt relative Pfade (z.B. '.\..\rar\rar.exe'), sie beziehen sich auf das gegenwärtige Arbeitsverzeichnis deines Programms. Und dieses kann durch Aufruf des OpenDialogs verändert werden. Deshalb solltest du vor den Dateioperationen immer das aktuelle Verzeichnis mit ChDir setzen (und zwar als absoluten Pfad), damit du absolut sicher bist, auf welche Basis sich nun die relativen Pfadangaben beziehen.


Grappa's Hammer - So 31.07.05 17:44
Titel: fileopen_dialog ändert chdir...
ok vielen dank.

ist ja tatsächlich so. :?

ok nochma vielen dank. da hab ich echt ne ganz schöne weile dran gesessen und war trotzdem zu dumm für.

mfg,
jens