Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi CopyFile to Freigabe (https://www.delphipraxis.net/141231-copyfile-freigabe.html)

newuser01 5. Okt 2009 12:10


CopyFile to Freigabe
 
Hallo,


Ich möchte gerne eine Datei von einem Rechner zu einem anderen (Netzwerkfreigabe) kopieren.


Die Freigaben existieren und das Netzwerk ist auch ok, es kommt aber immer nur eine 0 byte große Datei an :gruebel:


[delphi]

//in slIPs befindet sich die IP-Adresse des Rechners wo die Freigabe (tto) ist

if OpenDialog1.Execute then
begin

CopyFile(PChar(OpenDialog1.Filename), PChar('\\' + slIPs.Strings[0] + '\tto\' + ExtractFileName(OpenDialog1.Filename)), true);

end;


vielleicht könnt ihr ja helfen :gruebel:

DeddyH 5. Okt 2009 12:24

Re: CopyFile to Freigabe
 
Lass Dir doch einmal eine Fehlermeldung ausgeben.
Delphi-Quellcode:
if not CopyFile(...) then
  ShowMessage(SysErrorMessage(GetLastError));

newuser01 5. Okt 2009 12:35

Re: CopyFile to Freigabe
 
Fehlermeldung: Netzwerkpfad wurde nicht gefunden :gruebel:


aber die IP und Freigabe stimmen :gruebel:

DeddyH 5. Okt 2009 12:44

Re: CopyFile to Freigabe
 
Ich habe das gerade hier einmal versucht und kann das nicht nachvollziehen. Klappt einwandfrei. Hast Du die Zieldatei auch vorher gelöscht?

newuser01 5. Okt 2009 12:51

Re: CopyFile to Freigabe
 
auch wenn sich noch keine Datei in der Freigabe befindet kopiertz er nicht es kommt die Fehlermeldung, Netzwerkpfad nicht gefunden und es wird eine leere Datei in der Freigabe abgelegt

DeddyH 5. Okt 2009 12:56

Re: CopyFile to Freigabe
 
Nur zur Sicherheit: über den Windows-Explorer lässt sich die Datei einwandfrei kopieren?

newuser01 5. Okt 2009 13:00

Re: CopyFile to Freigabe
 
ja das ist ja der witz, keine Ahnung woran es liegt :gruebel:

DeddyH 5. Okt 2009 13:02

Re: CopyFile to Freigabe
 
Tut mir leid, im Moment sind mir auch die Ideen ausgegangen :gruebel:

newuser01 5. Okt 2009 13:03

Re: CopyFile to Freigabe
 
macht doch nix, trotzdem danke für deine Hilfe

Luckie 5. Okt 2009 13:32

Re: CopyFile to Freigabe
 
Lass dir mal den Pfad ausgeben, den du dir da zusammen bastelst, der muss ja irgendwie falsch sein.

DeddyH 5. Okt 2009 13:42

Re: CopyFile to Freigabe
 
Jepp, vielleicht steht ja ein Leerzeichen hinter der IP oder etwas in der Art.

newuser01 5. Okt 2009 16:58

Re: CopyFile to Freigabe
 
Ja in der Tat, hinter dem IP Eintrag war ein Leerzeichen somit war der Netzwerkpfad falsch, Problem behoben :-D ich DUSSEL

ABER, ABER ein neues Problem ist aufgetaucht. Ich setze auf Rechner A die Freigabe mit meinem Client, dazu verwende ich folgenen Code hier aus dem Forum.


Delphi-Quellcode:
const
SType_DiskTree = 0;
Access_Read = 1;
Access_All = 127;
Nerr_Success = 0;

type
TShareInfo2ExW = record
shi2_NetName: PWideChar;
shi2_Type: Longword;
shi2_Remark: PWideChar;
shi2_Permissions: Longword;
shi2_Max_Uses: Longword;
shi2_Current_Uses: Longword;
shi2_Path: PWideChar;
shi2_Passwd: PWideChar;
end;

type
  NET_API_STATUS = DWORD;

TShareInfo2ExA= record
shi2_NetName: PAnsiChar;
shi2_Type: Longword;
shi2_Remark: PAnsiChar;
shi2_Permissions: Longword;
shi2_Max_Uses: Longword;
shi2_Current_Uses: Longword;
shi2_Path: PAnsiChar;
shi2_Passwd: PAnsiChar;
end;

type
TNetShareAddFunc = function (servername: PChar; level: Longword;
                             const buf: Pointer;
                             parm_err: PLongWord): LongWord; stdcall;


function NetShareDel(
  const servername : LPWSTR;
  const netname   : LPWSTR;
  const reserved  : DWORD) : NET_API_STATUS; stdcall; external 'netapi32.dll';

function ShareDirA(const ADir, AName, APassword: string; ReadOnly: Boolean): Boolean;
var
Info: TShareInfo2ExA;
Err: Longword;

Lib: THandle;
NetShareAddFunc: TNetShareAddFunc;
begin
Result:=False;
Lib:= LoadLibrary('Svrapi.dll');

if Lib <> 0 then
begin
  try
    @NetShareAddFunc:= GetProcAddress(Lib,'NetShareAdd');
    if @NetShareAddFunc <> nil then
    begin
       FillChar(Info, SizeOf(Info), 0);
       Info.shi2_netname := PAnsiChar(AName);
       Info.shi2_type := SType_DiskTree;
       Info.shi2_remark := nil;
       if ReadOnly then
         Info.shi2_permissions := Access_Read
       else
         Info.shi2_permissions := Access_All;
       Info.shi2_max_uses := LongWord(-1);
       Info.shi2_current_uses := 0;
       Info.shi2_path := PAnsiChar(ADir);
       Info.shi2_passwd := PAnsiChar(APassword);
       Result := NetShareAddFunc(nil, 2, @Info, @Err) = NERR_SUCCESS;
    end
    else
      RaiseLastOSError;
  finally
    FreeLibrary(Lib);
  end;
end;
end;

function ShareDirW(const ADir, AName, APassword: WideString; ReadOnly: Boolean): Boolean;
var
Info: TShareInfo2ExW;
Err: Longword;

Lib: THandle;
NetShareAddFunc: TNetShareAddFunc;
begin
Result:=False;
Lib:= LoadLibrary('Netapi32.dll');

if Lib <> 0 then
begin
  try
    @NetShareAddFunc:= GetProcAddress(Lib,'NetShareAdd');
    if @NetShareAddFunc <> nil then
    begin
     FillChar(Info, SizeOf(Info), 0);
     Info.shi2_netname := PWideChar(AName);
     Info.shi2_type := SType_DiskTree;
     Info.shi2_remark := nil;
     if ReadOnly then
       Info.shi2_permissions := Access_Read
     else
       Info.shi2_permissions := Access_All;
     Info.shi2_max_uses := LongWord(-1);
     Info.shi2_current_uses := 0;
     Info.shi2_path := PWideChar(ADir);
     Info.shi2_passwd := PWideChar(APassword);
     Result := NetShareAddFunc(nil, 2, @Info, @Err) = Nerr_Success;
    end
    else
      RaiseLastOSError;
  finally
    FreeLibrary(Lib);
  end;
end;
end;

function ShareDir(const ADir, AName, APassword: WideString; ReadOnly: Boolean): Boolean;
begin
if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then
  Result := ShareDirA(ADir, AName, APassword, ReadOnly)
else
  Result := ShareDirW(ADir, AName, APassword, ReadOnly);
end;


//Client-Verzeichnis freigeben
procedure Tfrm_main.FormCreate(Sender: TObject);
var
sPfad:String;
begin

sPfad := ExtractFileDir(Application.ExeName);

try
   ShareDir(sPfad, 'Testfreigabe', '', True);
except
//
end;

soweit alles ok, möchte ich aber von Rechner B eine Datei in das freigegebene Verzeichnis von Rechner A kopieren kommt immer die Fehlermeldung "kein Zugriff" obwohl die Freigabe gesetzt und ok ist.

Delphi-Quellcode:
if not CopyFile(PChar(OpenDialog1.Filename), PChar('\\' + slIps.Strings[0] + '\Testfreigabe\' + ExtractFileName(OpenDialog1.Filename)), true) then
ShowMessage(SysErrorMessage(GetLastError));
Das komische dabei, mach ich die Freigabe über Windows per Hand funktioniert auch das anschließende kopieren in das Verzeichnis.

:gruebel: :gruebel: :gruebel:

DeddyH 5. Okt 2009 17:01

Re: CopyFile to Freigabe
 
Du hast ja auch ReadOnly auf true gesetzt.

newuser01 7. Okt 2009 13:06

Re: CopyFile to Freigabe
 
:gruebel: Auch wenn ich

RedOnly auf false setze

Delphi-Quellcode:
ShareDir(sPfad, 'Testfreigabe', '', false);

kommt die Fehlermeldung kein Zugriff. Mach ich aber die Netzwerkfreigabe per Hand also Harken setzen bei ""Ordner im Netzwerk freigeben" und "Netzwerkbenutzer dürfen Dateien verändern" funktioniert das kopieren ohne Probleme.


:gruebel: :gruebel:

Errraddicator 8. Okt 2009 12:00

Re: CopyFile to Freigabe
 
Warum willst Du denn zwanghaft über ne Freigabe gehen um die Datei zu kopieren?
Nimm doch den kompletten UNC-Pfad und dann haste solche Probleme gar nicht erst.

Oder ist diese Alternative nicht möglich?

newuser01 8. Okt 2009 13:46

Re: CopyFile to Freigabe
 
Zitat:

Warum willst Du denn zwanghaft über ne Freigabe gehen um die Datei zu kopieren?
Nimm doch den kompletten UNC-Pfad und dann haste solche Probleme gar nicht erst.

Oder ist diese Alternative nicht möglich?

Die Freigaben werden vom Client Individuell gesetzt dann dem Server mitgeteilt und vom Server aus dann die Datei in die entsprechende Freigabe kopiert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:48 Uhr.

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