怎样取得共享文件中打开的文件列表?(100分)

  • 主题发起人 主题发起人 silicon
  • 开始时间 开始时间
S

silicon

Unregistered / Unconfirmed
GUEST, unregistred user!
我要写一个程序,程序中用到要得到局域网内每台机器上有哪里共享文件被打开?

先出100分!
 
我用以下方法可以得到某一工作组内的所有主机或某一主机内的所有共享文件夹名
procedure TSearchFileThread.Execute;//线程
Var
; EnumHandle ; ; ; ; ; ; ; ;: THandle;
; FileRS ; ; ; ; ; ; ; ; ; ; : TNetResource;
; Buf ; ; ; ; ; ; ; ; ; ; ; : Array[1..500] of TNetResource;
; BufSize ; ; ; ; ; ; ; ; ; : DWord;
; Entries ; ; ; ; ; ; ; ; ; : DWord;
; Result ; ; ; ; ; ; ; ; ; ;: Integer;
begin
; mydir := mydir + #0;//mydir为工作组名时可以得到组内所有主机名
; ; ; ; ; ; ; ; ; ; ; //mydir为主机名时可以得到机内所有共享文件夹名
; FillChar(FileRS, SizeOf(FileRS) , 0);
; With FileRS do begin
; ; dwScope := 2;
; ; dwType := 3;
; ; dwDisplayType := 1;
; ; dwUsage := 2;
; ; lpRemoteName := @mydir[1];
; end;
; WNetOpenEnum( RESOURCE_GLOBALNET,
; ; ; ; ; ; ; ; RESOURCETYPE_ANY,
; ; ; ; ; ; ; ; 0,
; ; ; ; ; ; ; ; @FileRS,
; ; ; ; ; ; ; ; EnumHandle );
; Repeat
; ; Entries := 1;
; ; BufSize := SizeOf(Buf);
; ;Result := WNetEnumResource( EnumHandle,Entries,@Buf,BufSize );
; ;If (Result = NO_ERROR) and (Entries = 1) then
; ;begin
; ; ; s:= StrPas(Buf[1].lpRemoteName); //得到网上资源名,主机或文件夹
; ; ; Synchronize(AddFile); //Form1.ListBox1.Items.Add(s);
; ; end ;
; Until (Entries <> 1) or (Result <> NO_ERROR);
; WNetCloseEnum( EnumHandle );
end;
如令mydir 为WorkGroup则可得到WorkGroup内所有计算机名
如令mydir 为//201 则可得到主机//201内所有共享文件夹名
现在的问题是 如令mydir 为//201/share (已知share为//201内一共享文件夹),则
ListBox1内没有显示,即得不到 //201/share 内的共享文件夹名和文件名。
不知何故,请教各位。

这个问题我自己解决了!
可以用以下方法获得已知共享文件夹中的文件。
; ; Found := FindFirst(mydir+'/*.*', $0000003F , searchrec);
; ; while Found = 0 do
; ; begin
; ; ; listBox1.items.Add(searchrec.name);
; ; ; Found := FindNext(SearchRec);
; ; end;
; ; FindClose(SearchRec);
换一个问题吧。怎样才能让程序知道一个共享文件夹打开时需要密码?

用WNetAddConnection2, 然后看返回值是否为ERROR_INVALID_PASSWORD
 
To:TYZhang,
看了你的方法,你的方法是得到共享目录中的所有文件列表,但我只想知道共享目录中哪
些文件是打开的。就像Win2000“管理工具”中的“计算机管理”中的“共享文件夹”下的
"打开文件"中得到的列表一样
 
NetFileEnum() API
 
To:Kingron
用NetFileEnum(),有现成的例子吗?
 
对照看一下吧。
你可以到WWW.GOOGLE.COM搜索
[red][h1]void PrintNetFiles(LPWSTR server)
{

;resumeh = 0;
;do
;{
; buff = NULL;

; rc=NetFileEnum(
; ;(char *) server,
; ;NULL,
; ;NULL,
; ;3,
; ; ; (BYTE**)&buff,
; ;2048,
; ;&read,
; ;&total,
; ;&resumeh );


; if ( rc != ERROR_MORE_DATA && rc != ERROR_SUCCESS )
; ;break;


; for ( i = 0, curf = buff; i < read; ++ i, ++ curf )
; {
; ;printf( "%-12S %-15S ;/n",
; ; curf->fi3_username, curf->fi3_pathname
; ; );

; }
; if ( buff != NULL )
; NetApiBufferFree( buff );

;} while ( rc == ERROR_MORE_DATA );

; if ( rc != ERROR_SUCCESS ) PrintError( rc );

}
//-------------------------------------------------------[/h1][/red]
 
没有满意的。
 
你的名堂真多! [:D]
 
给分给我吧,晚上睡觉的时候告诉你。
 
就这样完了?真没意思!
 
多人接受答案了。
 
后退
顶部