Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Shell-Funktion zum Kopieren hat einen Fehler (https://www.delphipraxis.net/93030-shell-funktion-zum-kopieren-hat-einen-fehler.html)

moperswings 30. Mai 2007 15:13


Shell-Funktion zum Kopieren hat einen Fehler
 
Hallo,

ich habe dieses Beispiel-Programm um Dateien zu kopieren.
Das Kopieren funktioniert aber nur einmal, bei jedem weiteren Versuch kommt immer diese Fehlermeldung:
Delphi-Quellcode:
Datei kann nicht kopiert werden: Die QuellDatei oder vom Quelldatenträger kann nicht gelesen werden.
Weiss jemand, wo da der Fehler ist und kann mir helfen?
Delphi-Quellcode:
uses shellapi;
{$R *.dfm}

var shellinfo : TSHFILEOPSTRUCT ;

type
TSHFILEOPSTRUCTA = record
        Wnd: HWND;
        Wfunc: uint;
        pfrom: pansichar;
        flags: fileop_flags;
        fanyoperationsaborted: bool;
        hnamemappings: pointer;
        lpszprogresstitle: pansichar;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
        i: integer;
        files: string;
begin
        files := '';
        for i := 0 to fileListBox1.Items.Count - 1 do
          if FileListBox1.Selected[i] then files := files + FileListbox1.Items[i] + #0;
        files := files + #0;

        fillchar(shellinfo, sizeof(shellinfo),0);
        with shellinfo do begin
          wnd := handle;
          wfunc := FO_COPY;
          pFrom := PCHAR(files);
          pTo := PChar(directoryListBox2.Directory);
        end;

        SHFileOperation(shellinfo);

        FileListBox1.Update;
        FileListBox2.Update;
end;
Viele Grüsse, moperswings

Hawkeye219 30. Mai 2007 18:47

Re: Shell-Funktion zum Kopieren hat einen Fehler
 
Hallo,

Zitat:

Zitat von moperswings
Das Kopieren funktioniert aber nur einmal

Dann war das aktuelle Verzeichnis zufälligerweise auch das Quellverzeichnis für die Kopieraktion. Die FileListBox enthält nur die Dateinamen, den Pfad mußt du noch ergänzen:

Delphi-Quellcode:
var
  path : string;
  files : string;
  i    : Integer;
begin
  path := IncludeTrailingPathDelimiter(FileListBox1.Directory);
  files := '';
  for i := 0 to FileListBox1.Items.Count - 1 do
    if FileListBox1.Selected[i] then
      files := files + path + FileListbox1.Items[i] + #0;
  files := files + #0;
[...]
Die lokale Typdefinition TSHFILEOPSTRUCTA solltest du entfernen. Sie wird nicht benötigt und sie ist zudem falsch (fehlendes Feld pTo und fehlendes PACKED).

Gruß Hawkeye

moperswings 31. Mai 2007 08:10

Re: Shell-Funktion zum Kopieren hat einen Fehler
 
Vielen Dank Hawkeye,

jetzt funktionierts!

Mit bestem Gruss

moperswings

moperswings 31. Mai 2007 08:18

Re: Shell-Funktion zum Kopieren hat einen Fehler
 
NACHGEFRAGT:

1. Jetzt habe ich die TSHFILEOPSTRUCTA mal auskommentiert, aber was mache ich dann mit der ShellInfo, denn ohne die passiert nichts?

2. Die ganzen Variablen
Delphi-Quellcode:
  Wfunc: uint;
  pfrom: pansichar;
  flags: fileop_flags;
  fanyoperationsaborted: bool;
  hnamemappings: pointer;
  lpszprogresstitle: pansichar;
brauche ich nicht mehr zu deklarieren! Warum?

DeddyH 31. Mai 2007 08:43

Re: Shell-Funktion zum Kopieren hat einen Fehler
 
Du hast doch ShellAPI eingebunden, da steht alles drin :zwinker:

moperswings 31. Mai 2007 09:11

Re: Shell-Funktion zum Kopieren hat einen Fehler
 
Aber nicht die ShellInfo!

DeddyH 31. Mai 2007 09:21

Re: Shell-Funktion zum Kopieren hat einen Fehler
 
Auszug aus der ShellAPI.pas (Delphi 5):
Delphi-Quellcode:
TSHFileOpStructA = _SHFILEOPSTRUCTA;
TSHFileOpStructW = _SHFILEOPSTRUCTW;
TSHFileOpStruct = TSHFileOpStructA;

moperswings 31. Mai 2007 09:35

Re: Shell-Funktion zum Kopieren hat einen Fehler
 
Vielen Dank ersteinmal, Deddy, dass Du versuchst, mir den Kram zu erklären!

Mir ist immer noch nicht klar, was ich mit der ShellInfo machen soll, wenn ich - nach Hawkeye - die TSHFILEOPSTRUCT entfernen soll?
Delphi-Quellcode:
var shellinfo : TSHFILEOPSTRUCT ;

DeddyH 31. Mai 2007 09:42

Re: Shell-Funktion zum Kopieren hat einen Fehler
 
Du sollst nicht die Variablendeklaration entfernen, sondern die Typdeklaration.
Delphi-Quellcode:
type
TSHFILEOPSTRUCTA = record
        Wnd: HWND;
        Wfunc: uint;
        pfrom: pansichar;
        flags: fileop_flags;
        fanyoperationsaborted: bool;
        hnamemappings: pointer;
        lpszprogresstitle: pansichar;
end;
Überflüssig, da bereits in ShellAPI vorhanden.

moperswings 31. Mai 2007 10:04

Re: Shell-Funktion zum Kopieren hat einen Fehler
 
Ah, Sorry - das habe ich natürlich schon gemacht!
Ich weiss es halt nicht besser ... :wall:

Vielen Dank und viele Grüsse, moperswings


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:51 Uhr.

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