FTP(50分)

  • 主题发起人 主题发起人 3h
  • 开始时间 开始时间
想结束吧,实在心有不甘,不想结束吧小王又没寄给我,
甚至没动静!王虎飞同志............
 
TO 王虎飞:
王虎飞同志,如果可以的话请寄一份给3h同志,
嘻嘻,我看他快疯了!
帮帮他吧!
同时希望您老能吧原理贴上来,
如果用了控件的话能给yysun寄一个吗!
<font color="red">好东东大家来享受嘛!</font>
 
在<a href="http://vcl.vclxx.com">http://vcl.vclxx.com</a>上
有几个带源码的例子,是做FTP的,你可以参考一下.
我那天把它们DOWN下来,也没仔细修改,能用倒是能用,已经发给你了.
我对DELPHI的FTP也很不满.. :-)
 
唉!好多天莲不到这里, 错过了捞分的机会, :)
3h, 还在吗?
 
我编了一个函数,不知可不可以解决,方法如下:
使用listitem事件中返回的字符串,格式我想大家可能心中有数,
是以unix的ls长格式显示信息返回的,中间用空格分开的,这样
将此由空格分开的字符串进行分解就可以得到一个个的词单,代
表每个部分。
有以下几个问题要解决:
1. 在返回的时间中,如果返回没有年份,就是说明此文件是当
天存的,年份应该与你的机器是一样的。
2. 将字符的月份转化成数值
3. 分割由空格分开的字符串
4. 如何判断是目录还是文件,就是第一个字母为'd'就是目录。
其它我认为是文件。
5. 忽略当然目录和父目录,以及'total'字符串

在这里我只处理了文件与目录,用户与组别不考虑(似乎用不上)
日期我用了字符串表示,'yyyy/mm/dd'

TFileAttr=(faDir,fafile);
PTFileInfo=^TFileInfo;
TFileInfo=record
FAttr:TFileAttr;
FLen:integer;
FFileName:string;
FDate:string;
end;

函数如下:
procedure SetListString(var n:TFileInfo;s:string);
var
tempstr,ps:string;

function getsubstr(var s:string):string;
var
k,l:integer;
begin
l:=length(s);
for k:=1 to l do
if s[k]<>' ' then break;
s:=copy(s,k,l-k+1);
l:=length(s);
for k:=1 to l do
begin
if s[k]=' ' then break;
end;
result:=copy(s,1,k-1);
s:=copy(s,k+1,l-k);
end;
begin
tempstr:=s;
with n do
begin
ps:=getsubstr(tempstr);
if ps='total' then exit;
if ps[1]='d' then FAttr:=faDir //目录
else Fattr:=fafile; //文件

ps:=getsubstr(tempstr);
ps:=getsubstr(tempstr);
ps:=getsubstr(tempstr);
FLen:=strtoint(getsubstr(tempstr));
FDate:=formatdatetime('yyyy',date);
ps:=getsubstr(tempstr);
FDate:=changemonth(ps);
ps:=getsubstr(tempstr);
FDate:=FDate+'/'+ps;
ps:=getsubstr(tempstr);
if pos(':',ps)>0 then
FDate:=formatdatetime('yyyy',date)+'/'+FDate
else
FDate:=ps+'/'+FDate;
FFileName:=getsubstr(tempstr);
end;
end;

//转换月份
function ChangeMonth(month:string):string;
begin
result:='';
month:=uppercase(month);
if month='JAN' then result:='01'
else if month='FEB' then result:='02'
else if month='MAR' then result:='03'
else if month='APR' then result:='04'
else if month='MAY' then result:='05'
else if month='JUN' then result:='06'
else if month='JUL' then result:='07'
else if month='AUG' then result:='08'
else if month='FEB' then result:='09'
else if month='OCT' then result:='10'
else if month='NOV' then result:='11'
else if month='DEC' then result:='12';
end;


//在ftplistitem事件中调用函数 在这里我使用的是TNMFTP控件
procedure TForm1.ftpListItem(Listing: String);
begin
addremotefile(listing);
end;

procedure TForm1.Addremotefile(f:string);
var
myfileinfo:PTFileInfo;
begin
new(myfileinfo);
with myfileinfo^ do
begin
setliststring(myfileinfo^,f);
if (Ffilename='.') or (ffilename='..') //忽略'.'与'..'目录
or (ffilename='') then
begin
dispose(myfileinfo);
exit;
end;
...
end;
 
好不容易上来。
木头朋友的钻研精神真足。:)
不过似乎这样兼容性似乎...
如果直接取的数据就更好了。不知WINSOCK里面是怎么样处理的?
 
3h,你好。
最近发现用NMFTP控件当出现异常情况时程序无法处理,后改为使用wininet.dll编程
关于wininet.dll编程的详情请见我的主页。wininet.dll是微软开发的专门用于解
决编写ftp,gopher,http客户端程序而开发的面向任务的动态链接库。
在我的主页网上文章上面有一篇关于wininet编程的文章。同时在软件下载处还有两
篇文章,一篇是微软的wininet.dll函数的详解,还有一篇是入门的介绍,都是英文
的可以下载。
我自编了一个主页上传软件就是用wininet.dll编写的,但还没有将源码公开。不过
过一阵就会公开,因为还有些小毛病,用wininet.dll就可以获得服务器文件信息,
结构同win32_find_data结构,有兴趣可以看一看。

主页地址:http://smallroom.126.com,http://smallroom.yeah.net
 
您的文章我会打印出来慢慢看的,谢谢。
如果发布源码希望能MAIL我一份。

另,您的主页真不错,虽然还有些地方未做好,例如留言本。:)
欢迎到<a href="http://glowing.yeah.net">我主页</a>看看。
 
木头朋友的主页上提供了我想要的一些东西,主要是那个 Microsoft Win32 Internet Functions
的文件,很详细。朋友们也可在我的主页上找到,全英文 WORD 格式。

所以结束问题了,谢谢大家热情的支持。

题外话:
1、NMFTP大家绝对不要用了,我在写一个简单的FTP控件,写好给大家用吧,
不过不要太希望什么,因为只是练功耳。:)
2、TO 木头朋友,您的那篇文章(主页上作介绍的)在文件名的地方处理不当。
 
后退
顶部