我正在使用此函数从ftp连接中获取文件,
function GetFileFromFTP(server, username, password, localfile, remotefile: string; port: word = 21): boolean;
var
hopen, hconnect: HINTERNET;
good:boolean;
begin
hopen := InternetOpen('myagent', INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0);
hconnect := InternetConnect(hopen, pchar(server), port, pchar(username), pchar(password), INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
good := FtpGetFile(hconnect, pchar(remotefile), pchar(localfile), false, 0, FTP_TRANSFER_TYPE_UNKNOWN or INTERNET_FLAG_DONT_CACHE, 0);
InternetCloseHandle(hconnect);
Result := good;
end;
问题是当我使用这样的服务器字符串时:
var server:string;
server := 'ftp://192.168.1.1/XDIRECTORY/'; //IT CANT GET THE FILE
server := 'localhost'; //GETS THE FILE
procedure TForm1.btn1Click(Sender: TObject);
begin
if GetFileFromFTP(server, '', '', 'upx2.exe', 'upx.exe') then
begin
Caption := 'Install succesfull';
end
else
begin
Caption := 'Install NOT succesfull';
end;
我不明白为什么ftp服务器无法获取文件,文件是否在文件夹中,或者是否使用服务器IP地址。
只有将服务器设置为localhost
才会有用答案 0 :(得分:0)
因为服务器是服务器而不是URI。 URI是URI而不是服务器。您应该根据您选择使用的函数来分离URI的组件。
阅读https://www.google.ru/search?client=opera&q=MSDN+FtpGetFile&sourceid=opera并确定在哪个变量中预期的内容。
阅读http://en.wikipedia.org/wiki/URI_scheme#Generic_syntax如何解析URL并将服务器名称和远程文件名提取到不同的变量中。
在字符串ftp://user:password@192.168.1.1:21/XDIRECTORY/YDIRECTORY/ZDIRECTORY/filename
中,只有192.168.1.1
是“服务器” - 其余部分都是不同的部分而不是“服务器”。您应该将这些部分提取到适当的单独变量中,并将它们传递给MSDN上记录的函数。
GetFileFromFTP(server, '', '', 'upx2.exe', 'upx.exe')
- 我认为最后两个参数是错误的 - 它们都应该是完全限定的名称,包括路径。
奖金:重新制定
procedure TForm1.btn1Click(Sender: TObject);
begin
if GetFileFromFTP(server, '', '', 'upx2.exe', 'upx.exe') then
begin
Caption := 'Install succesfull';
end
else
begin
Caption := 'Install NOT succesfull';
end;
是
procedure TForm1.btn1Click(Sender: TObject);
begin
Caption := 'Install was ' +
IfThen(
not GetFileFromFTP(server, '', '', 'upx2.exe', 'upx.exe'),
'NOT ')
+ 'succesfull.';
end;