Entwickler-Ecke

Dateizugriff - Datei im Netzwerk kopieren unter D3P


Nogo - Do 01.02.07 11:07
Titel: Datei im Netzwerk kopieren unter D3P
Ich möchte eine Datei von einem lokalen Laufwerk in ein Netzlaufwerk kopieren.
Dabei habe ich unterschiedliche Ansätze probiert:

CopyFile aus den Delphi-eigenen Unit FMXUtils
CopyFile aus den RX-Tools 2.75
CopyFile mit BlockRead und Blockwrite
CopyFile mit MemoryStream

Lesen des lokalen Laufwerkes geht, schreiben geht aber nur auf einem lokalen Laufwerk, im Netzwerk geht es nicht. Dabei ist es egal, ob mit UNC-Pfad oder gemappten Laufwerk.

Dabei wird jedesmal der Fehler "... kann nicht erstellt werden" erzeugt (SFCreateError)

Kann Delphi 3 nicht mit Netzlaufwerken umgehen (sieht ja so aus) und wie kann ich das umgehen?


Delete - Do 01.02.07 11:13

Hast du denn Schreibzugriff auf das Netzlaufwerk?


Nogo - Do 01.02.07 11:26

Die gleiche Operation mit dem Explorer funktioniert.
Ich habe alle Rechte auf diesem Laufwerk/Ordner.


Delete - Do 01.02.07 11:32

Und was macht die API-Funktion CopyFile?


Nogo - Do 01.02.07 12:54

Die API Funktion macht bei lokalen Verzeichnissen das was Sie soll, bei Kopie ins Netzwerk meldet sie keine Fehler, kopiert aber nichts.

Grüße

Nogo


Delete - Do 01.02.07 13:01

Woher weißt du, dass sie keinen Fehler zurückgibt? Zeig mal den Code.


Nogo - Do 01.02.07 13:16

Es kommt keine Fehlermeldung, der Fehlercode ist 0. (Ich habe einen andere Fehler provoziert, hier wurde der Code ausgegeben.)

Folgende Funtion verwende ich (Von Delphi-Praxis mit Dank entnommen):

Zitat:

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:
function DoFileWork(aOperation: FILEOP_FLAGS; aFrom, aTo: AnsiString;
    Flags: FILEOP_FLAGS): Integer;
var
  FromPath, ToPath: AnsiString;
  SHFileOpStruct: TSHFileOpStruct;
begin
  FromPath := aFrom + #0#0;
  ToPath := aTo + #0#0;
  with SHFileOpStruct do
  begin
    Wnd := 0;
    wFunc := aOperation;
    pFrom := PAnsiChar(FromPath);
    if ToPath <> '' then
    begin
      pTo := PAnsiChar(ToPath)
    end else begin // target available
      pTo := nil;
    end// target not available
    fFlags := Flags;
  end// structure
  Result := SHFileOperationA(SHFileOpStruct);
end;


Aufgerufen mit:


Delphi-Quelltext
1:
messagedlg(inttostr(doFileWork(FO_COPY, 'D:\Programme\aquinto\Archive\data\images\Original\2007010003\0701A00351.JPG''\\wzcp24\d\temp\etst.jpg', FOF_ALLOWUNDO )), mtInformation, [mbOk], 0);                    


Grüße

Nogo


Delete - Do 01.02.07 13:52

Geht wunderbar:

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:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
uses
  ShellAPI;

function DoFileWork(aOperation: FILEOP_FLAGS; aFrom, aTo: AnsiString;
    Flags: FILEOP_FLAGS): Integer;
var
  FromPath, ToPath: AnsiString;
  SHFileOpStruct: TSHFileOpStruct;
begin
  FromPath := aFrom + #0#0;
  ToPath := aTo + #0#0;
  with SHFileOpStruct do
  begin
    Wnd := 0;
    wFunc := aOperation;
    pFrom := PAnsiChar(FromPath);
    if ToPath <> '' then
    begin
      pTo := PAnsiChar(ToPath)
    end else begin // target available
      pTo := nil;
    end// target not available
    fFlags := Flags;
  end// structure
  Result := SHFileOperationA(SHFileOpStruct);
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  res: Integer;
begin
  res := DoFileWork(FO_COPY, 'd:\Test.pdf''\\Nestor\~ressourcen'0);
  if res <> 0 then
    ShowMessage(SysErrorMessage(GetLastError));
end;


Nogo - Do 01.02.07 14:07

DANKE!

Da hab ich vergessen, daß ich vor einem Jahr mein Delphi so eingerichtet habe, daß es als lokaler Admin startet und somit keine Netzwerkrechte hat, das gilt natürlich auch für alle Programme die aus der IDE gestartet werden.
Komischerweise gibt (neben allen meinen Versuchen) auch Dein Quelltext keine Fehlernummer heraus. Das ist mir unverständlich, aber egal, Problem gelöst, vielen Dank.

Grüße

Nogo