2015-11-17 143 views
0

我們目前有* .BAT文件,其中包含一些FTP命令,用於從AS400下載文件並保存爲TEXT文件。 BAT工作正常,文本文件將顯示下載文件中的記錄。C#從FTP下載文件AS400

現在,我們想擺脫這個* .BAT文件,並使用C#爲我們下載文件並保存到文本文件中。現在的問題是我們得到的文件包含一行字符串中的所有記錄!他們不再列在對方之下。

這裏的代碼中,我們使用的是:

tpWebRequest request = default(FtpWebRequest); 
     FtpWebResponse response = default(FtpWebResponse); 
     StreamWriter writer = default(StreamWriter); 

     request = WebRequest.Create("*******URL******") as FtpWebRequest; 

     request.Credentials = new NetworkCredential("user", "pass"); 

     request.Method = WebRequestMethods.Ftp.DownloadFile; 
     request.UseBinary = true; 

     response = request.GetResponse() as FtpWebResponse; 

     writer = new StreamWriter(Server.MapPath("/filename.txt")); 

     using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding(37))) //37 for IBM encoding 
     { 
      writer.WriteLine(reader.ReadToEnd()); 
     } 

     writer.Close(); 

     response.Close(); 

任何想法,爲什麼我們得到這個?爲什麼簡單的DOS FTP命令比我們的代碼更好?

非常感謝! :)

+2

我想你應該使用調試器啓動並檢查()''通過返回reader.ReadToEnd的價值。該函數保留新的行字符(可能只是原始文件中的LF或CR),而當以ASCII模式傳輸時,「ftp」將它們轉換爲CRLF。 – wOxxOm

+2

使用十六進制編輯器查看實際輸出。它可能有CR,但沒有LF或類似的。你可能需要做一些字符串替換來介紹它們。 IBM編碼將修正小/大端的不匹配,但我不確定CR/LF對。 –

+1

確保它在文件中寫入換行符。如果不是,請嘗試手動添加換行符。另外,記事本有時不顯示換行符。嘗試寫字板或其他編輯器。 –

回答

2

當下載物理文件時,ASCII模式將添加記錄分隔符。這是大多數ftp客戶端的默認傳輸模式。

request.UseBinary = false; 

Specifying false causes the FtpWebRequest to send a "Type A" command to the server.

Data Transfer Methods

Transferring QSYS.LIB files

+0

男人!你是最棒的!工作! :) 我將UseBinary設置爲false。此外,我將StreamReader的編碼更改爲ASCII,並且文件剛剛完美下載。我也想感謝所有嘗試過幫助的人,我非常感謝。 – Yousi

0

問題可能很簡單:您一次讀取整個文檔。您需要分別讀取每一行:

using(StreamReader sr = new StreamReader(fs)) 
{ 
    while(!sr.EndOfStream) 
    { 
     Console.WriteLine(sr.ReadLine()); 
    } 
} 
+0

我試過你的代碼,我一直得到下面的錯誤: System.ObjectDisposedException:無法訪問一個處置對象。 對象名稱:'System.Net.Sockets.NetworkStream'。 – Yousi

+0

在sr.ReadLine()行? – FKutsche