2010-03-29 3 views
6

मैं एक C# System.Diagnostics.Process प्रकार के माध्यम से ftp.exe cmd निष्पादित करता हूं। और प्रोग्रामेटिक रूप से "सहायता" कमांड दर्ज करने के बाद मैं "ftp.exe" आउटपुट प्राप्त करने के लिए निम्न कोड का उपयोग करता हूं। लेकिन मैं केवल परिणाम की पहली पंक्ति प्राप्त कर सकता हूं। और मैं कभी भी "अंत" आउटपुट भाग तक नहीं पहुंचता। पूरा कार्यक्रम अवरुद्ध लगता है।मुझे कोड द्वारा ftp.exe का आउटपुट क्यों नहीं मिल सकता है?

Process p = new Process(); 
    p.StartInfo.FileName = @"C:\Windows\System32\ftp.exe"; 
    p.StartInfo.CreateNoWindow = true; 
    p.StartInfo.RedirectStandardInput = true; 
    p.StartInfo.RedirectStandardOutput = true; 
    p.StartInfo.RedirectStandardError = true; 

    p.StartInfo.UseShellExecute = false; 
    p.Start(); 

    p.StandardInput.WriteLine("help"); 

    Int32 c_int = p.StandardOutput.Read(); 
    while (c_int != -1) 
    { 
     Char c = (Char)c_int; 
     Console.Write(c); 
     c_int = p.StandardOutput.Read(); 
    } 

    Console.WriteLine("end"); 

हालांकि, मैं एक साधारण प्रोग्राम है जो केवल Console.WriteLine() का उपयोग अपनी stdout धारा के लिए कुछ उत्पादन लिखने के लिए लिखें। और मैं इसे उपरोक्त कोड के साथ परीक्षण करता हूं। यह बढ़िया काम करता है। मैं बस यह नहीं समझ सकता कि उपरोक्त कोड ftp.exe के साथ क्यों काम नहीं कर सकता है? मेरे SimpleConsoleOutput प्रोग्राम और "ftp.exe" के बीच एकमात्र अंतर यह है कि ftp.exe का अपना इंटरैक्टिव कमांड प्रॉम्प्ट है।

(--------------- नई प्रगति -----------------)

Here're की कुछ प्रगति मेरी व्यक्तिगत जांच

2 धागे stdin के लिए लिख सकते हैं और "ftp.exe" की stdout से पढ़ने के लिए लिखते हैं, और उत्पादन इस तरह है:

Commands may be abbreviated. Commands are: 

Commands may be abbreviated. Commands are: 

Commands may be abbreviated. Commands are: 
....(exactly 16 times of above lines and then exactly 16 times of the following cmds list) 
!    delete   literal   prompt   send 
?    debug   ls    put    status 
append   dir    mdelete   pwd    trace 
... 

और पिछले आदेशों सूची भी पूरा नहीं हुआ है।

ऐसा लगता है कि सहायता कमांड आउटपुट दो भागों में बांटा गया है।

1 हिस्सा है:

Commands may be abbreviated. Commands are: 

2 हिस्सा है:

!    delete   literal   prompt   send 
?    debug   ls    put    status 
append   dir    mdelete   pwd    trace 
... 

और यह सब 1 भागों सभी 2 भागों से पहले "ftp.exe" की stdout धारा को wrtten कर रहे हैं । यह कैसे गड़बड़ है ?? आपकी टिप्पणियों के लिए आभार।

मैं "ftp.exe" के अन्य आदेश के साथ परीक्षण किया है, और यह "सहायता" आदेश

+0

कि आपको ऐसा क्यों ftp.exe अगर आप इसे प्रयोग पर इरादा नहीं है के उत्पादन में रुचि रखते हैं? – CResults

+1

हाय, CResults। मैं कंसोल अनुप्रयोगों के मानक स्ट्रीम के बारे में कुछ शोध कर रहा हूं। और ftp.exe मेरे प्रयोग लक्ष्यों में से एक है। – smwikipedia

उत्तर

5

कर कारण काम नहीं करता मानक इनपुट लिए 'help', लिख रहे हैं क्यों आप इनपुट और आउटपुट के ftp.exe क्योंकि है नहीं मिल सकता है माइक्रोसॉफ्ट विंडोज 2000/एक्सपी/विस्टा से अंतर्निहित ftp.exe Console Input/Output का उपयोग करता है।

यह केवल एफटीपी प्रोग्राम का मामला नहीं है जो अपने बफर को फ्लश नहीं करता है।

यदि आप cmd.exe जैसे कुछ के साथ ftp.exe के अपने आमंत्रण को प्रतिस्थापित करते हैं, तो आप देखेंगे कि यह ठीक काम करता है। समस्या यह है कि आप आउटपुट पढ़ने की कोशिश कर रहे हैं जहां एफ़टीपी इसे नहीं भेज रहा है।
आप बच्चे ftp.exe को पढ़ने और लिखने के लिए नियमित दृष्टिकोण का उपयोग नहीं कर सकते हैं। यह उस विशेष ftp.exe ऐप के कार्यान्वयन का एक परिणाम है।


आप वास्तव में स्वचालित करने के लिए की जरूरत है निर्मित विंडोज एफ़टीपी प्रोग्राम, आप PInvoke और ReadConsoleOutput Win32 समारोह का सहारा की जरूरत होगी।

आपका विकल्प हैं:

  • उपयोग एक अलग एफ़टीपी कार्यक्रम। संभावना है कि वे कंसोल I/O दृष्टिकोण का सहारा नहीं लेते हैं कि एमएस अंतर्निहित प्रोग्राम
  • FTP FTP का उपयोग करता है, जैसे FtpWebRequest।
  • यदि यह उचित या संभव नहीं है, तो FTP के लिए निम्न स्तर नेटवर्क सॉकेट इंटरफ़ेस का उपयोग करें।

यह भी देखें: http://discuss.joelonsoftware.com/default.asp?design.4.332503.5

बस ब्याज से बाहर
+2

बहुत धन्यवाद, चीसो। मैं सोच रहा हूं कि ftp.exe वास्तव में कहां भेजता है? एक तथ्य है जिसे अनदेखा नहीं किया जा सकता है, मुझे StdOut से "मदद" कमांड का आउटपुट मिलता है, हालांकि कुछ "विलंबता" के बाद ... – smwikipedia

+0

हाय, चीसो, आशा है कि आप मुझे मेरी आखिरी चिंता के बारे में कुछ और टिप्पणियां दे सकते हैं। .. धन्यवाद। – smwikipedia

+0

मैं वास्तव में नहीं जानता; लेकिन आप क्या करने की कोशिश कर रहे हैं? यदि आप एफ़टीपी संचालन करना चाहते हैं तो इसे पूरा करने के अन्य तरीके हैं। क्यों बाध्यता है कि आप ftp.exe का उपयोग करना चाहिए, जब स्वचालित रूप से यह स्पष्ट रूप से अव्यवहारिक है? – Cheeso

2

मुझे लगता है कि समस्या यह है कि उत्पादन बफर अभी तक प्लावित नहीं है और इसलिए तुम नहीं को छोड़कर सामान्य लगता है ftp कमांड से पूरा आउटपुट प्राप्त करें।

जब आप "छोड़ें" कमांड को छोड़ देते हैं तो आपको सहायता कमांड का आउटपुट देखना चाहिए।

मेरे पास अभी तक कोई समाधान नहीं है, लेकिन अगर मुझे कुछ मदद मिलती है तो मैं बाद में वापस आऊंगा।

+0

धन्यवाद, 0xA3। एक "छोड़ें" कमांड एक कामकाज हो सकता है। लेकिन मैं सिर्फ ftp.exe और my SimpleConsoleOutput.exe के बीच का अंतर जानना चाहता हूं। क्यों उत्तरार्द्ध चिकनाई से चला सकता है? – smwikipedia

+0

@smwikipedia: मेरा मानना ​​है कि 0xA3 ने पहले ही समझाया है कि उत्तर में काफी अच्छा है -> "आउटपुट बफर अभी तक फ्लश नहीं किया गया है" –

0

अनुभव से (मैंने कमांड लाइन एफ़टीपी कई बार पहले इस्तेमाल किया है) आप एक एफ़टीपी प्लगइन का उपयोग करना बहुत बेहतर होगा जैसे कि यह Enterprise DT FTP

इस तरह आप अपने एफ़टीपी सत्र पर पूर्ण नियंत्रण रखेंगे, अपने उपयोगकर्ता को बेहतर प्रतिक्रिया देने और उचित तरीके से त्रुटियों का सामना करने में सक्षम होंगे।

अंतिम बिंदु, एफ़टीपी से निपटने में त्रुटि प्रबंधन बहुत महत्वपूर्ण है।

+0

मैंने सोचा, और वास्तव में, ftp.exe/help STDERR को आउटपुट करेगा। इंटरैक्टिव मोड में हालांकि, आउटपुट STDOUT पर जाता है। –

+0

आह ठीक है, आप रोज़ाना कुछ सीखते हैं! - मैं अपना जवाब संपादित करूंगा लेकिन मुझे अभी भी विश्वास है कि बाहरी प्रक्रिया के रूप में ftp.exe चलाना एफ़टीपी को संभालने का एक बुरा तरीका है। ऐसी कई चीजें हैं जो इसे बाहरी कोड में छोड़ने के लिए गलत हो सकती हैं। – CResults

+2

हां, एक एफ़टीपी लाइब्रेरी या 'FtpWebRequest' वर्ग का उपयोग करने के लिए बेहतर है। –

2

ftp.exe बस चल रहा है। जब आप सहायता कमांड जारी करते हैं तो ftp.exe समाप्त नहीं होता है, इसलिए आप 'end' भाग नहीं प्राप्त करेंगे, यह एक प्रॉम्प्ट प्रस्तुत करता है और किसी अन्य कमांड की प्रतीक्षा करता है।

यदि आप कमांड की प्रतिक्रिया पढ़ना चाहते हैं, तो आपको प्रतिक्रिया को पार्स करने और एक नए प्रॉम्प्ट की तलाश करने की आवश्यकता है।यही है, जब आप ftp> जैसी लाइन देखते हैं तो आपको पूरी प्रतिक्रिया मिलती है।

+0

धन्यवाद, नहीं। लेकिन अगर मैं 'एंड' भाग तक नहीं पहुंचूंगा, तो मेरा प्रोग्राम "मदद" कमांड आउटपुट की पहली पंक्ति के ठीक बाद क्यों बंद हो जाता है? आपके उत्तर के लिए – smwikipedia

0

आप Read के बजाय ReadLine की कोशिश की पुनः निर्देशित उत्पादन से पढ़ने के लिए (जब तक आप ftp.exe उपयोग करने के लिए बहुत, बहुत अच्छे कारणों के लिए है, FtpWebRequest वर्ग बल्कि का उपयोग करें)?

+0

Thansk। हां, मैंने रीडलाइन(), ReadToEnd() की कोशिश की है ... उनमें से कोई भी आउटपुट ठीक से प्राप्त नहीं कर सकता है। – smwikipedia

0

लिटिल चिंतित हैं कि आप ठीक ढंग से प्रक्रिया को बंद नहीं कर रहे हैं, एक प्रक्रिया से उत्पादन पढ़ने कुछ ऐसा दिखाई देगा के लिए अपने कोड:

process.Start(); 

output = process.StandardOutput.ReadToEnd(); // read the output here... 

process.WaitForExit(); // ...then wait for exit, as after exit, it can't read the output 

returnCode = process.ExitCode; 

process.Close(); // once we have read the exit code, can close the process 

सुनिश्चित नहीं हैं कि इस विशिष्ट समस्या हालांकि हल होगा।

इसके अलावा

, क्यों आप इसे अगर आप

process.Arguments = "help"; 
+0

आपके उत्तर के लिए धन्यवाद। मैं StdIn को "help" कमांड लिखता हूं क्योंकि मैं "ftp.exe" के इंटरैक्टिव कमांड प्रॉम्प्ट का अनुकरण करना चाहता हूं। – smwikipedia

+0

आह मैं देखता हूँ। क्या आपने '> ftp' ​​के लिए stdout की जांच करने की कोशिश की है, और फिर stdin को "अलविदा" भेज रहा है? फिर इसे अधिक इनपुट की प्रतीक्षा करने के बजाय WaitForExit कॉल पर जाना चाहिए। –

संबंधित मुद्दे