Thema: Delphi CopyFile to Freigabe

Einzelnen Beitrag anzeigen

newuser01

Registriert seit: 31. Aug 2006
248 Beiträge
 
Delphi 7 Professional
 
#12

Re: CopyFile to Freigabe

  Alt 5. Okt 2009, 17:58
Ja in der Tat, hinter dem IP Eintrag war ein Leerzeichen somit war der Netzwerkpfad falsch, Problem behoben 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.

Gruß: Holger

[Hobby-Programmierer]
  Mit Zitat antworten Zitat