NMHttp控件如何下载网站服务器上的一个目录中所有文件?(50分)

  • 主题发起人 主题发起人 菩提
  • 开始时间 开始时间

菩提

Unregistered / Unconfirmed
GUEST, unregistred user!
原来是用NMHttp控件来下载单独的文件,并且文件名和URL路径是已知的。
但是现在需要下载/temp/...目录下的所有文件,并且这些文件的名称是不
知道的,于是问题就来了,NMHttp控件能一次性下载一个目录中的所有内容
吗?如果不能实现,那针对我提到的情况该怎样解决?
 
你根本就不知道里面的文件名,那么无法下载。

否则的话,很多论坛的数据库不是可以被你轻易下载!
 
呵呵给分吧我刚写了一个东西把函数给你,不过我的东西有点乱,你看看上面的函数就知道了
function FindFiles(ftp:HINTERNET;searchfile:string;listvw:TListView;flist:Tstrings;total:Longint):boolean;//
var
FindData : TWin32FindData;
FindHandle : HInternet;
dirlist:Tstringlist;//文件夹列表
i:integer;
Found:Boolean;
Item: TListItem;
begin
Found:=false;
FindHandle := FtpFindFirstFile(ftp,pchar(searchfile), FindData, 0, 0);
if FindHandle = nil then
begin
Exit;
end;
dirlist:=Tstringlist.Create;
if IsValidDir(FindData) then
dirlist.Add(FindData.cFileName)
else
if (FindData.dwFileAttributes=128) then
if flist.IndexOf(searchfile)=-1 then begin
flist.Add(searchfile);
Item := listvw.Items.Add;
item.ImageIndex:=0;
item.Caption:=string(FindData.CFileName);
Item.SubItems.Add(format('%8.1f',[FindData.nFileSizeLow/1024])+'KB');
total:=total+FindData.nFileSizeLow;//总文件大小
end;
while InternetFindnextFile(FindHandle,@FindData) do begin
if IsValidDir(FindData) then
dirlist.Add(FindData.cFileName)
else
if (string(FindData.cFileName)<>'..') then begin
if flist.IndexOf(searchfile+'/'+string(FindData.CFileName))<>-1 then continue;
flist.Add(searchfile+'/'+string(FindData.CFileName));
Item := listvw.Items.Add;
item.ImageIndex:=0;
item.Caption:=string(FindData.CFileName);
Item.SubItems.Add(format('%8.1f',[FindData.nFileSizeLow/1024])+'KB');
total:=total+FindData.nFileSizeLow;//总文件大小
mytotalsize:=total;
end;
end;
InternetCloseHandle(Findhandle);
found:=true;
for i:=0 to dirlist.Count-1 do
found:=FindFiles(ftp,searchfile+'/'+dirlist.Strings,listvw,flist,total) or found;
dirlist.Free;
end;
 
to mystudy:
首先谢谢你给出的例子。
但是能否给出注释?
另外你给出的例子里面有些我看不懂,请解释一下:
“HINTERNET”、“FtpFindFirstFile”、“IsValidDir”等信息我在Delphi help
和Windows SDK中找不到相关的帮助。

用Ftp是可以下载互联网服务器上提供的文件目录里的全部文件,但是必须知道密码。
当密码改变的时候,不可能每次都告诉用户密码吧?所以提供Http服务可以避免密码
改动的情况。

我查了一下软件自动升级的方法,发现都是需要设计一个参照物,里面有升级文件详
细信息,这样升级过程中就可以对照得出升级信息了。还要什么其他好的方法?
 
http and ftp are different protocol
 
如果可以实现,那任何网站都没有任何秘密了
 
首先你要 uses WININET;

HINTERNET是WININET.PAS 中的一些函数返回的类的指针变量
ftpFindFirstFile, InternetFindNextFile您可以像调用 Delphi 函数 FindFirst、FindNext 一样调用这些函数。您使用函数 ftpFindFirstFile 来取得这个路径下的第一个函数。您可以不断地调用 InternetFindNextFile ,直到函数返回"False"为止.这些在WININET.PAS都有的.
IsValidDir 是我自己写的一个判断是否为文件夹的函数如下:
function IsValidDir(SearchRec:TWin32FindData):Boolean; //判断是否是文件夹
begin
if (SearchRec.dwFileAttributes=16) and
(string(SearchRec.cFileName)<>'.') and
(string(SearchRec.cFileName)<>'..') then
Result:=True
else
Result:=False;
end;
www.playicq.com 上有个升级程序的原码,应该对你有帮助的
 
多人接受答案了。
 
后退
顶部