2011-04-05 86 views
0

我一直在嘗試一段時間來建立一個通過C#與我們的大型機的FTP連接。到目前爲止,我已經能夠連接並上傳一個文件到大型機,這很棒,但文件的記錄長度錯誤,並且設置爲變量,而不是固定的記錄長度。經過相當多的研究後,我得出了與大多數人相同的結論,即ftpwebresponse函數不允許將「qoute SITE」命令發佈到大型機。如果我錯了,請不要猶豫,指正,繼承人的代碼我使用:C#與命令行FTP幫助

private void ftpButton_Click(object sender, EventArgs e) 
{ 
    string ftphost = "ftpSite"; 
    string user = "myUser"; 
    string pwd= "myPass"; 
    string ftpfileName = "test.file2"; 
    string inputfilePath="d:\\documents and settings\\gheff\\My Documents\\Visual Studio 2005\\Projects\\biWeeklyJob\\BiWeekly\\bin\\Debug\\file2.TXT"; 

    string ftpfullpath = String.Format("ftp://{0}//'{1}'", ftphost,ftpfileName);    

    try 
    {     
     FtpWebRequest ftp = (FtpWebRequest)FtpWebRequest.Create(ftpfullpath); 
     ftp.Credentials = new NetworkCredential(user,pwd);     

     ftp.KeepAlive = true; 
     ftp.UseBinary = false; //Use ascii. 

     ftp.Method = WebRequestMethods.Ftp.UploadFile; 

     FileStream fs = File.OpenRead(inputfilePath); 
     byte[] buffer = new byte[fs.Length]; 
     fs.Read(buffer, 0, buffer.Length); 
     fs.Close(); 

     Stream ftpstream = ftp.GetRequestStream(); 
     ftpstream.Write(buffer, 0, buffer.Length); 
     ftpstream.Close(); 

    } 
    catch (WebException ex) 
    { 
     String status = ((FtpWebResponse)ex.Response).StatusDescription; 
     throw new Exception(status); 
    } 
} 

所以偏向虎山行,我試圖想的另一種方法,我已經成功地使用命令行來上傳文件,更改文件屬性並更改文件類型,以便我可以將JCL作業發送到大型機。我現在正在努力將其實現到我現有的c#應用程序中,但證明比我想象的要困難。

我絕不是c#的專家,但可以使用答案然後去做更多的研究,以獲得更好的理解。

我已經看到這段代碼C# cmd excute commands,但環顧四周,似乎只有一條命令可以由此發出。

所以我的問題是,我知道需要一段時間才能到達那裏,是否有可能在命令提示符下運行下面的命令而不使用批處理文件,因爲我在過程運行時查看一些反饋?

open "cmd.exe" 
type "ftp" 
type "FTPserver" 
Type "USERNAME" 
type "PASSWORD" 

然後,一旦連接已經建立

然後運行預先定義的命令,即上傳文件,上傳和運行JCL作業。 我想我正在尋找的東西會寫文本到cmd.exe,但保持會話?

我希望這是有道理的。

任何幫助將不勝感激。

感謝

回答

1

因此,這裏是你所要求的代碼不過我懷疑它解決您的問題。

var cmd= new Process(); 

cmd.StartInfo.FileName = "cmd.exe"; 
cmd.StartInfo.UseShellExecute = false; 
cmd.StartInfo.RedirectStandardInput = true; 

cmd.Start(); 

using (var stdin = cmd.StandardInput) 
{ 
    stdin.WriteLine("ftp"); 
    stdin.WriteLine("FTPserver"); 
    stdin.WriteLine("USERNAME"); 
    stdin.WriteLine("PASSWORD"); 
} 

cmd.WaitForExit(); 
cmd.Close(); 
+0

我試着實現你的代碼,但無法這樣做。 Visual Studio不喜歡var,它說它沒有名稱空間?其中writeline不起作用,它說它不能將system.diagnostics轉換爲system.io。有什麼建議麼? – John 2011-04-06 17:32:27

+0

@John:'var'是c#3關鍵字。只需用'Process'替換第一個'var'並用'StreamWriter'替換第二個'var' – 2011-04-07 07:34:27

0

幾年前,我使用這個CodeProject project爲一個簡單的應用程序,需要發送一些文件。可以幫助你的是它使用套接字與其他服務器通信。您可以發送原始的FTP命令,這些命令應避開您使用FtpWebRequest對象時遇到的問題,而不必「掏空」並使用ftp命令行程序。

+0

我需要對套接字進行一些研究,因爲我從未實現過它們。謝謝 – John 2011-04-06 17:33:37

0

你可以嘗試的另一種方法是提交一個jcl作業來分配你的過程需要的記錄長度,塊大小等數據集。

一旦該作業完成,將數據「放入」剛剛分配的數據集中。 z/OS ftp服務器應該從現有數據集中提取屬性。

0

您是否考慮過使用支持COM接口的商用FTP客戶端,並且能夠發送原始協議命令?如果您正在編寫重新分發軟件,這可能並不經濟,但如果您只是試圖爲內部IT項目自動執行重複任務,那麼就您作爲開發人員的時間而言,它肯定會值得。 Robo-FTP可能是連接到大型機的不錯選擇,因爲它已經內置了ASCII到EBCDIC的翻譯。

1

試試這個CMD:

FTP -s:ftpcommandfilename url 

感追隨模式只能一個命令來運行,你可以寫的FTP cmd在一個文件,並使用此CMD執行它們。

WriteLine("FTP -s:ftpcommandfilename url"); 

順便說一句,我也找到了多ftp-cmd-line-in-code模式,如果你有,共享?