ftp文件打开的问题 (50分)

  • 主题发起人 主题发起人 dylb
  • 开始时间 开始时间
D

dylb

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大虾:
如何用Delphi远程打开ftp站点上text文件,并进行读取和写入,我觉得把文件先
下载,再改再上传的方式太麻烦了点,如何在线进行读取和写入呢?

补充:
在网络上找到一段C++的代码,可以实现读写,哪位大虾帮忙翻译为Delphi,谢谢!

DWORD FtpWriteRead(char * cFtpHost,char * cFile,DWORD dwLen,char * buf,char cFlag)
{
HINTERNET hInternet,hHost,hFile;
DWORD dwLength,dwError;
hInternet=InternetOpen(“FZYXB",LOCAL_INTERNET_ACCESS,NULL,0,0);
hHost=InternetConnect(hInternet,cFtpHost,INTERNET_INVALID_PORT_NUMBER,
“fzxucm",“abc505",INTERNET_SERVICE_FTP,INTERNET_FLAG_PASSIVE,0);
if ( cFlag == 0 ) // 写
hFile=FtpOpenFile(hHost,cFile,GENERIC_WRITE,FTP_TRANSFER_TYPE_BINARY,0);
else
hFile=FtpOpenFile(hHost,cFile,GENERIC_READ,FTP_TRANSFER_TYPE_BINARY,0);
if( !hFile)
{
if ( (dwError=GetLastError()) == 12003 )
ShowMsg(hWin,“ 文 件 不 存 在");
InternetCloseHandle(hHost);
InternetCloseHandle(hInternet);return 0L;
}
if ( cFlag == 0 )
InternetWriteFile(hFile,buf,dwLen, &dwLength);
else
InternetReadFile(hFile,buf,dwLen, &dwLength);
InternetCloseHandle(hFile);InternetCloseHandle(hHost);
InternetCloseHandle(hInternet);
return dwLength;
}
 
做一个程序完成这样的功能可以实现这样的功能,
不过在程序里,还是得下载和上传。
只不过让用户感觉不到而已。
 
真的没有更好的答案吗?
 
除非ftp协议支持直接修改文件,可惜不是
 
i agree nunimao! Ftp only can do file transmission
 
Wininet 中 有两个函数 internertreadfile 和 internetwritefile 好像可以对远程
ftp文件进行读写,但是我不太清楚如何使用,请大虾们帮忙!
 
我同意yhaochuan的说法,如果有好的解决方法,请能告诉我
 
Wininet 中 的两个函数 internertreadfile 和 internetwritefile
只是对socket函数的封装。能否直接修改文件只是与ftp协议有关,
在我的印象中,ftp协议不支持直接修改文件。
 
ftp协议不是支持继传的吗?我们只把修改的部分重新上传到对应的位置就可以啦。
 
多谢各位了:
问题已经解决了!代码如下:
procedure TMainForm.ToolButton11Click(Sender: TObject);
const
buffersize=1000;
var
ftpsite:string;
buffer,fhandle:pointer;
numread:cardinal;
filestream:tfilestream;
serverIPstr:string;
begin
hinternet:=internetopen(Pchar('application'),internet_open_type_direct,nil,nil,internet_flag_no_cache_write);
if (hinternet <> nil ) then
begin
ftpsite:='www.test.com';
hconnect:=internetconnect(hinternet,Pchar(ftpsite),21,'username','password',internet_service_ftp,internet_flag_existing_connect or internet_flag_passive,$0);
if (hconnect<> nil) then
begin
fhandle:=ftpopenfile(hconnect,pchar('test.txt'),generic_read,ftp_transfer_type_ASCII,0);
if fhandle<> nil then
begin
getmem(buffer,buffersize);
repeat
internetreadfile(fhandle,buffer,buffersize,numread);
until numread< buffersize;
ServerIPStr:=pchar(buffer);
showmessage(ServerIPStr);
end;
end;
end;
end;
 
多人接受答案了。
 
后退
顶部