線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:4690
推到 Plurk!
推到 Facebook!

IdFtp List問題

缺席
chhy515
一般會員


發表:3
回覆:9
積分:2
註冊:2008-08-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-09-17 20:02:38 IP:221.224.xxx.xxx 訂閱
IdFtp List時過不去,具體情況如下:
我用IdFtp控件寫了一個服務放在一臺電腦(甲)上,另外兩臺電腦(乙、丙)各建了一個FTP服務器,然後用程式分別去連電腦乙、丙,結果發現連電腦乙時,當程式走到IdFtp.list(nil,'*.*',true)時出現錯誤,而連電腦丙時就可以正常運行。
程式里我用了兩個IdFtp控件,分別對應電腦乙和丙,兩個控件屬性完全一樣,passive屬性為true,Ftp服務器用的是windows2003 server自帶IIS建立的!!
附加檔案:48d0f1de529bc_Unit1.pas
編輯記錄
chhy515 重新編輯於 2008-09-17 20:04:09, 註解 無‧
chhy515 重新編輯於 2008-09-17 20:07:11, 註解 無‧
chhy515 重新編輯於 2008-09-17 20:07:12, 註解 無‧
chhy515 重新編輯於 2008-09-17 20:07:12, 註解 無‧
chhy515 重新編輯於 2008-09-17 20:53:34, 註解 無‧
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-09-17 20:43:11 IP:61.60.xxx.xxx 訂閱
(1)List Method 的原型如下

[code delphi]
procedure List(ADest: TStrings; const ASpecifier: string; const ADetails: boolean);
[/code]

(2)建議你 Create 一個 TStringList 放在第一個參數(你原本第一個參數是設成 nil),然後再試試
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
chhy515
一般會員


發表:3
回覆:9
積分:2
註冊:2008-08-27

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-09-17 20:51:08 IP:221.224.xxx.xxx 訂閱
謝謝您的回覆!
試過您說的方法,還是不可以!
下面是修改后部分代碼:
try
testdebug('LogonPath1: ' LogonPath1 #13#10);
IdFTP.ChangeDir(LogonPath1);
sleep(500);
try
testdebug('FtpList...'#13#10);
dest:=TStringlist.Create;
idftp.List(dest,'*.*',true);
if dest.Count >0 then
begin
testdebug('ftplist:'#13#10);
for i:=0 to dest.Count-1 do
begin
testdebug(#9 dest.Strings[i] #13#10);
end;
end;
dest.Free;
//IdFtp.List(nil, '*.*', True);
testdebug('FtpListOK!'#13#10);
sleep(100);
//testdebug('FtpTransferType!'#13#10);
idftp.TransferType:=ftbinary;
testdebug('before GetFiles!'#13#10);
GetFiles(idftp,host1);
testdebug('after GetFiles!'#13#10);
IdFTP.Disconnect;
except
testdebug('ErrorOccur in checkFTP!'#13#10);
end;//list
except
testdebug('ChangeDir Error!'#13#10);
end; //change dir
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-09-17 22:06:17 IP:59.126.xxx.xxx 訂閱
hi,關於 List 你可以不必要這樣子寫
可以直接

1、
var tsTmp: TStrings;

tsTmp := TStringList.Create;
IdFTP1.List(tsTmp);

處理完後 FreeAndNil(tsTmp);


2、
var tsTmp: TStrings;

IdFTP1.List;
tsTmp := IdFTP1.ListResult;

處理完後【 不可以 Free tsTmp 】

要注意一下:
1、List 中間的參數不須下 *.* 這樣【只會列出檔案】目錄不會列出!!
2、Windows 2003 的 ftp 不支援 Passive !! 所以你的 Client 有開沒開 Passive 是沒有關係的

另外,在

ChangeDir 與 List 的後面不用加 Sleep 的指令

===================引 用 chhy515 文 章===================
謝謝您的回覆!
試過您說的方法,還是不可以!
下面是修改后部分代碼:
try
testdebug('LogonPath1: ' LogonPath1 #13#10);
IdFTP.ChangeDir(LogonPath1);
sleep(500); // 其實這句是可以不必的
try
testdebug('FtpList...'#13#10);
dest:=TStringlist.Create;
idftp.List(dest,'*.*',true);
if dest.Count >0 then
begin
testdebug('ftplist:'#13#10);
for i:=0 to dest.Count-1 do
begin
testdebug(#9 dest.Strings[i] #13#10);
end;
end;
dest.Free;
//IdFtp.List(nil, '*.*', True);
testdebug('FtpListOK!'#13#10);
sleep(100);
//testdebug('FtpTransferType!'#13#10);
idftp.TransferType:=ftbinary;
testdebug('before GetFiles!'#13#10);
GetFiles(idftp,host1);
testdebug('after GetFiles!'#13#10);
IdFTP.Disconnect;
except
testdebug('ErrorOccur in checkFTP!'#13#10);
end;//list
except
testdebug('ChangeDir Error!'#13#10);
end; //change dir
------
價值的展現,來自於你用哪一個角度來看待它!!
chhy515
一般會員


發表:3
回覆:9
積分:2
註冊:2008-08-27

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-09-18 08:43:52 IP:221.224.xxx.xxx 訂閱
謝謝您的回覆!我將再試下!
changdir的目錄中只有文件沒有目錄的,所以list的第二個參數是不是*.*應該無所謂的!
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-09-18 09:17:57 IP:218.210.xxx.xxx 訂閱
哦哦~~,明白,不過只是提醒您,直接在程式加些判斷,會比較好些 (因為通常需求會變的),突然加個資料夾時...

===================引 用 chhy515 文 章===================
謝謝您的回覆!我將再試下!
changdir的目錄中只有文件沒有目錄的,所以list的第二個參數是不是*.*應該無所謂的!
------
價值的展現,來自於你用哪一個角度來看待它!!
chhy515
一般會員


發表:3
回覆:9
積分:2
註冊:2008-08-27

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-09-18 09:52:47 IP:221.224.xxx.xxx 訂閱
再請教下:
list中的第一個參數直接可以使用nil吧,那么給定TStrings變量和nil有何分別,用DirectoryListing都可以列出文件和目錄吧!謝謝!

您回覆的第二個方法好像有點問題,下面紅色這句編譯過不去!
2、
var tsTmp: TStrings;

IdFTP1.List;
tsTmp := IdFTP1.ListResult;

處理完後【 不可以 Free tsTmp 】
編輯記錄
chhy515 重新編輯於 2008-09-18 10:01:04, 註解 無‧
chhy515 重新編輯於 2008-09-18 10:01:04, 註解 無‧
chhy515 重新編輯於 2008-09-18 10:01:05, 註解 無‧
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-09-18 10:28:05 IP:218.210.xxx.xxx 訂閱
哦,不好意思,我是用 indy10 的,所以照你說的,你應該是用 indy 9 的

那第二種就不用理他,使用第一個方法就行
而第一個方法

直接放 TString 或 nil 當然沒差別囉,你有放變數,他就回傳給你,你沒放當然你想改用 DirectoryListing 也是可以的
只是其實在 List 時,他就把 List 的結果已經下載下來了,只是看你是需要用 TStrings 的方式去解譯,或是用 IdFTP 內
的 DirectoryListing 解讀成你需要的格式而已,不過 【當第二個參數是使用 '*.*' 時,DirectoryListing 還是列不出目錄哦!!】
因為你下指令給 FTP Server 時,因為 *.* 就不會把目錄的資料傳回了!!

===================引 用 chhy515 文 章===================
再請教下:
list中的第一個參數直接可以使用nil吧,那么給定TStrings變量和nil有何分別,用DirectoryListing都可以列出文件和目錄吧!謝謝!

您回覆的第二個方法好像有點問題,下面紅色這句編譯過不去!
2、
var tsTmp: TStrings;

IdFTP1.List;
tsTmp := IdFTP1.ListResult;

處理完後【 不可以 Free tsTmp 】
------
價值的展現,來自於你用哪一個角度來看待它!!
chhy515
一般會員


發表:3
回覆:9
積分:2
註冊:2008-08-27

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-09-19 10:17:05 IP:221.224.xxx.xxx 訂閱
謝謝回覆!
我使用的確實是Indy9。
請問不知道ftp list失敗是否跟服務器設定有關,我用windows server2003自己設定了一臺ftp服務器,無論list第一個參數是TStrings變量還是nil都可以正常運行,而到了服務器上就出現問題了,所以現在在想是不是服務器哪個地方設定有誤導致list失敗!
系統時間:2017-12-12 4:58:36
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!