Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Shellfileoperation (Datei kann nicht kopiert werden) (https://www.delphipraxis.net/109790-shellfileoperation-datei-kann-nicht-kopiert-werden.html)

freeriders 7. Mär 2008 16:00


Shellfileoperation (Datei kann nicht kopiert werden)
 
Hi!
Ja ich habe ein Problem bei Dateienkopieren mit Shellfileoperation.
Mein Programm sagt mir immer: "Datei kann nicht kopiert werden: Die Quelldatei oder vom Quelldatenträger kann nicht gelesen werden."

Also mein Code zum kopieren sieht so aus:
Delphi-Quellcode:
procedure ShellFileOperation(fromFile: string; toFile: string; Flags: Integer);
var
  shellinfo: TSHFileOpStructA;
begin
  with shellinfo do
  begin
    wnd   := Application.Handle;
    wFunc := Flags;
    fFlags := FOF_NOCONFIRMATION;
    pFrom := PChar(fromFile);
    pTo   := PChar(toFile);
  end;
  SHFileOperation(shellinfo);
end;
Und mein Code vom Button der die Aktion auslöst sieht so aus.
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);

var s: string;
var Ini: TIniFile;

begin
  try
    Ini:=TIniFile.Create(GetCurrentDir+'\Pfad.ini');
    Ini.WriteString('Section','FIFA Pfad',Label1.Caption);
  finally
    Ini.Free;
end;

begin

 if RadioButton1.Checked then
   begin
   ShellFileOperation(GetCurrentDir+'\ORG_Daten\fifa.db', Label1.Caption+'\data\cmn', FO_COPY);
   ShellFileOperation(GetCurrentDir+'\ORG_Daten\ger.db', Label1.Caption+'\data\cmn\fe', FO_COPY);
   end;

 if RadioButton2.Checked then
   begin
   ShellFileOperation(GetCurrentDir+'\WSL_Daten\fifa.db', Label1.Caption+'\data\cmn', FO_COPY);
   ShellFileOperation(GetCurrentDir+'\WSL_Daten\ger.db', Label1.Caption+'\data\cmn\fe', FO_COPY);
   end;

end;
end;
Das seltsame an dem Problem ist, dass es nur manchaml geht.
Manchmal macht er auch nur bei einem File Probleme.
Die Ordner WSL_Daten und ORG_Daten existieren auch in meinem Areitsverzeichnis und die Dateien dortdrin auch.
Deswegen verstehe ich das Problem nicht so recht.

Wäre über Hilfestellungen sehr dankbar=)

LG

David Geis

DeddyH 7. Mär 2008 16:02

Re: Shellfileoperation (Datei kann nicht kopiert werden)
 
Und wenn Du an die Verzeichnisnamen mal ein "\*" anhängst?

freeriders 7. Mär 2008 16:18

Re: Shellfileoperation (Datei kann nicht kopiert werden)
 
Zitat:

Zitat von DeddyH
Und wenn Du an die Verzeichnisnamen mal ein "\*" anhängst?

Meinst du an die Zielverzeichnisse?
Weil die zwei Dateien sollen ja in unterschiedliche Ordner kopiert werden.
Und er hat ja anscheinend ein Problem mit der Quelldatei.

Oder wie meinst du das?

DeddyH 7. Mär 2008 16:38

Re: Shellfileoperation (Datei kann nicht kopiert werden)
 
Sry, hatte gar nicht gesehen, dass es sich um Dateien handelt.

[edit] Du könntest aber auch CopyFile benutzen. [/edit]

freeriders 7. Mär 2008 17:45

Re: Shellfileoperation (Datei kann nicht kopiert werden)
 
Mit Copyfile macht er sich leider erst gar nicht die Mühe zu kopieren.
Vermute aber, dass es daran liegt, dass ich mit einem Klick auf den Button auch noch die Ini schreibe.
Ich denke die Variablen behaken sich, denn er lädt jetzt auch das Ini File nicht mehr, was ja auch durch eine Variable getätigt wird.
Nur habe ich leider keine Ahnung wie ich das ändere

Mein Variablen:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);

var s: string;
var Ini: TIniFile;
var
von, nach: string;
Und mein Copyfile Code:
Delphi-Quellcode:
begin

 if RadioButton1.Checked then

  begin
  von := GetCurrentDir+'\ORG_Daten\fifa.db';
    nach := Label1.Caption+'data\cmn\fifa.db';
    Copyfile(PChar(von),PChar(nach), false);
  end;

DeddyH 7. Mär 2008 17:59

Re: Shellfileoperation (Datei kann nicht kopiert werden)
 
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var s: string;
    Ini: TIniFile;
    von, nach: string;
begin
  //irgendwas mit der Ini machen
  if RadioButton1.Checked then
  begin
    von := IncludeTrailingPathDelimiter(GetCurrentDir) + 'ORG_Daten\fifa.db';
    nach := IncludeTrailingPathDelimiter(Label1.Caption) + 'data\cmn\fifa.db';
    if not Copyfile(PChar(von),PChar(nach), false) then
      MessageBox(Handle,PChar(SysErrorMessage(GetLastError)),'Fehler',MB_OK or MB_ICONERROR);
  end;
end;
Versuch es mal so (aus dem Kopf und ungetestet).

Hawkeye219 7. Mär 2008 18:28

Re: Shellfileoperation (Datei kann nicht kopiert werden)
 
Hallo David,

in der Dokumentation von Microsoft steht unter anderem folgendes zu den Feldern pFrom und pTo:

Zitat:

Although this member is declared as a single null-terminated string, it is actually a buffer that can hold multiple null-delimited file names. Each file name is terminated by a single NULL character. The last file name is terminated with a double NULL character ("\0\0") to indicate the end of the buffer.
Versuche es einmal so:

Delphi-Quellcode:
pFrom := PChar(fromFile + #0);
pTo   := PChar(toFile + #0);
Gruß Hawkeye

Larsi 7. Mär 2008 18:44

Re: Shellfileoperation (Datei kann nicht kopiert werden)
 
Ich würde dir auch CopyFile empfehlen, dass ist meiner Meinung nach sagor einfacher^^

freeriders 7. Mär 2008 20:53

Re: Shellfileoperation (Datei kann nicht kopiert werden)
 
Oh man ich komm hier nicht mehr klar-.-
Also ich fang mal an zu erzählen^^
Habe mein Programm fertiggestellt und dann kompiliert.
Dann habe ich ne Setuproutine erstellt und dann hab ich die mal zum Testen aufm Rechner installiert.
Alles schön und gut klappt auch einwandfrei.
Nunja dann hab ich über den Desktopshortcut mein Programm geöffnet.
Dann der Schock: Beim kopieren zeigt er mir nen Fehler, von wegen er könnte die Datei nicht finden.
Nunja ich dachte schon ich könnte wieder alles in die Pfanne kloppen.
Dann habe ich das programm über die *.exe im Programme Ordner geöffnet. Und siehe da alles funktioniert.
Also ich dann wieder über den Desktop probiert und es geht wieder nicht.

Meine Schlussfolgerung war, dass er vielleicht (weil ich ja den Befehl "GetCurrentDir" zum kopieren benutze) den aktuellen Ordner der Verknüpfung auf dem Desktop nimmt.
Naja jetzt wo ich gerade diese Antwort schreibe will ich nochmal per Shortcut kopieren, damit er mir den Fehler nochmal anzeigt, um ihn abtippen zu können.
Und siehe da es geht!
Ich verstehe nur nicht warum, denn ich habe nichts geändert.
Das ist wirklich sehr seltsam, denn so kann ich das Programm ja nicht veröffentlichen, wenn es manchmal geht und manchmal nicht.
Nunja vielleicht könnt ihr mir ja helfen.

Mein Kopiervorgang sieht wie folgt aus:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);

var
von1, nach1: string;
von2, nach2: string;
von3, nach3: string;
von4, nach4: string;

begin

 if RadioButton1.Checked then

  begin
    von1 := GetCurrentDir+'\ORG_Daten\fifa.db';
    nach1 := Label1.Caption+'data\cmn\fifa.db';
    Copyfile(PChar(von1),PChar(nach1), false);

  if not Copyfile(PChar(von1),PChar(nach1), false) then
      MessageBox(Handle,PChar(SysErrorMessage(GetLastError)),'Fehler',MB_OK);

      von2 := GetCurrentDir+'\ORG_Daten\ger.db';
    nach2 := Label1.Caption+'data\cmn\fe\ger.db';
    Copyfile(PChar(von2),PChar(nach2), false);

  if not Copyfile(PChar(von2),PChar(nach2), false) then
      MessageBox(Handle,PChar(SysErrorMessage(GetLastError)),'Fehler',MB_OK);

  end;

 if RadioButton2.Checked then
   begin
    von3 := GetCurrentDir+'\WSL_Daten\fifa.db';
    nach3 := Label1.Caption+'data\cmn\fifa.db';
    Copyfile(PChar(von3),PChar(nach3), false);

 if not Copyfile(PChar(von3),PChar(nach3), false) then
      MessageBox(Handle,PChar(SysErrorMessage(GetLastError)),'Fehler',MB_OK);

    von4 := GetCurrentDir+'\WSL_Daten\ger.db';
    nach4 := Label1.Caption+'data\cmn\fe\ger.db';
    Copyfile(PChar(von4),PChar(nach4), false);

 if not Copyfile(PChar(von4),PChar(nach4), false) then
      MessageBox(Handle,PChar(SysErrorMessage(GetLastError)),'Fehler',MB_OK);

   end;

end;
Ich vermute mal es ist mal wieder ziemlich shclecht geschrieben, wie immer bei mir.

Achso sry auch für den Roman den ich geschrieben habe und danke schonmal für die Antworten die gekommen sind un kommen werden, so wie ich euch einschätze=)

LG

David Geis

DeddyH 7. Mär 2008 21:06

Re: Shellfileoperation (Datei kann nicht kopiert werden)
 
Bist Du Dir auch sicher, dass GetCurrentDir auf das richtige Verzeichnis verweist?


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:46 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz