Standardausgabe Readtoend Waitforexit


WinSCP Free SFTP, SCP und FTP Client für Windows SFTP Dateiübertragungen in Techniken, die von diesem Artikel gezeigt werden, sind für Sie in der WinSCP-Assembly implementiert. Mit der Montage wird empfohlen Ansatz über die Umsetzung dieser Techniken auf eigene Faust. In diesem Handbuch wird beschrieben, wie die SFTP-Übertragung in der Anwendung mit WinSCP implementiert wird. WinSCP ist SFTP-Client mit Scripting-Schnittstelle, die Sie verwenden können, um viele Operationen zu automatisieren, die es unterstützt, einschließlich Dateiübertragungen, Synchronisation und andere. So ist WinSCP selbst keine Bibliothek (z. B. Montage), die man direkt anrufen kann. Obwohl diese Führer zeigt Ihnen, wie man es nahtlos aus dem Code verwenden. Vor dem Start Vor dem Start sollten Sie: Verwenden von WinSCP aus Code laufen WinSCP-Prozess Zum Ausführen von winscp verwenden Sie System. Diagnostics. Process. Diese Klasse ermöglicht das Ausführen einer ausführbaren Datei, möglicherweise Umleitung ihrer Standard-Eingabe und Ausgabe in einen Stream aus Code zugänglich. Code unten erwartet, dass winscp (ProcessStartInfo. FileName) im aktuellen Arbeitsverzeichnis oder im Suchpfad gefunden werden kann. Sie müssen den vollständigen Weg ansonsten anbieten. Führen von Scripting-Befehlen mit Standard-Eingabe Sie können die Standard-Eingangsumleitung (ProcessStartInfo. RedirectStandardInput) verwenden, um Scripting-Befehle zu übermitteln. Spare Notwendigkeit, temporäre Skriptdatei zu versorgen.1) Zum Führen von Befehlen zur Standard-Eingabe verwenden Process. StandardInput Stream: Erfassen von Ausgängen des WinSCP-Prozesses Während Sie die Standardausgabe des WinSCP-Prozesses umleiten können, ist es eigentlich nicht sehr nützlich, da die Ausgabe von WinSCP nicht erfolgt Haben eine vordefinierte Form (kann nicht analysiert werden). Obwohl es nützlich sein kann, es zu erfassen, falls Sie es einem Benutzer in Ihrer GUI oder zu Diagnosezwecken zeigen möchten. Wenn Sie die Ausgabe sammeln möchten, leiten Sie die Standardausgabe vor dem Start von WinSCP (ProcessStartInfo. RedirectStandardOutput) um und lesen Sie vom Ausgabestream (Process. StandardOutput). Sie müssen die Ausgabe kontinuierlich sammeln, während das Skript läuft. Der Ausgangsstrom hat eine begrenzte Kapazität. Sobald es gefüllt ist, hängt WinSCP auf freien Speicherplatz, niemals beenden. Das heißt, Sie können Process. WaitForExit nicht alleine verwenden, um zu warten, bis das Skript beendet ist. Bequeme Alternative ist StreamReader. ReadToEnd. Verwenden der Protokolldatei Um die Ergebnisse des Skripts zu erfassen, können Sie die XML-Protokollierung verwenden. Dazu müssen Sie WinSCP anweisen, die Protokolldatei mit dem Befehlszeilenparameter xmllog (ProcessStartInfo. Arguments) zu speichern. Beachten Sie, dass Sie vor dem Lesen und Analysieren der XML-Protokolldatei mit dem baumbasierten Parser (wie zB XmlDocument oder XPathDocument) auf WinSCP warten können. Siehe Beispiel unten. Wenn Sie die Protokolldatei kontinuierlich lesen müssen, müssen Sie Stream-basierten Parser (wie XmlReader) verwenden. Siehe Beispiel. Im Folgenden wird gezeigt, wie die Verwendung von tree-based Parsing mit XPathDocument verwendet wird. Im Fehlerfall können Sie nach Nachrichtenelementen prüfen, um eventuelle Fehlermeldungen zu erfassen: Im Falle eines Erfolges können Sie z. B. Extrahieren Verzeichnisauflistung generiert durch ls Befehl innerhalb ls Element: Warten auf Skript zu vervollständigen Verwenden Sie Process. WaitForExit zu warten, bis WinSCP-Prozess zu beenden. Wenn du Ausgabestream umgeleitet hast, musst du zuerst den Ausgabestream zum Ende lesen. Eine gute Praxis ist es, den Eingabestrom zu schließen, wenn man ihn umgeleitet hat. Überprüfen des Exit-Codes Sobald WinSCP-Skript beendet ist, überprüfen Sie den Exit-Code (Process. ExitCode) des Prozesses: Elina: Danke für Ihre Antwort. Es gibt einige Notizen am unteren Rand dieses MSDN-Dokuments (msdn. microsoften-uslibraryhellip), die über potenzielle Deadlocks warnen, wenn Sie bis zum Ende der beiden umgeleiteten Stdout - und Stderr-Ströme synchron lesen. Es ist schwer zu sagen, ob Ihre Lösung anfällig für dieses Problem ist. Außerdem scheint es, dass du die process39 stdoutstderr Ausgabe direkt als Eingang sendest. Warum. ) Ndash Matthew Piatt Sep 26 16 at 4:42 Dies ist eine modernere, aufwartende, Task Parallel Library (TPL) basierte Lösung für 4.5 und höher. Usage Beispiel Implementierung beantwortet 5. Oktober 16 um 10:54 Ich Ding, dass dies ist einfach und besser Ansatz (wir brauchen nicht AutoResetEvent) Antwort # 2 am: Mai 18, 2010, 07:13:13 am »True, aber shouldn39t Sie tun. FileName Pfad quotggsci. exequot quot lt Obeycommand. txtquot, um Ihren Code zu vereinfachen oder vielleicht etwas gleichbedeutend mit quotecho Befehl path quotggsci. exequot wenn Sie wirklich don39t wollen eine separate obeycommand. txt Datei verwenden. Ndash Amit Naidu Jun 3 13 at 22:03 Deine Lösung braucht nicht AutoResetEvent, aber du zählst. Wenn du anstelle von Event-Event (wenn sie verfügbar sind), dann sind Sie mit CPU ohne Grund und das deuten darauf hin, dass Sie ein schlechter Programmierer sind. Ihre Lösung ist wirklich schlecht, wenn mit dem anderen mit AutoResetEvent verglichen. (Aber ich habe dir nicht gegeben, weil du versucht hast zu helfen). Ndash Eric Ouellet Nov 7 14 at 18:38 Ich hatte das gleiche Problem, aber der Grund war anders. Es würde aber unter Windows 8 passieren, aber nicht unter Windows 7. Die folgende Zeile scheint das Problem verursacht zu haben. Die Lösung bestand darin, UseShellExecute NICHT zu deaktivieren. Ich habe jetzt ein Shell Popup-Fenster, das ist unerwünscht, aber viel besser als das Programm wartet auf nichts Besonderes passieren. So fügte ich das folgende Work-around hinzu: Jetzt das einzige, was mich stört, ist, warum dies geschieht unter Windows 8 an erster Stelle. Antwortete 13. Januar 15 um 10:35 Ich habe versucht, eine Klasse zu machen, die dein Problem mit asynchronem Stream lösen würde, indem du in Berücksichtigung von Mark Byers, Rob, stevejay antwortet. So erkannte ich, dass es einen Fehler gibt, der mit dem asynchronen Prozessausgangsstrom verknüpft ist. Du kannst das nicht tun: Du erhältst System. InvalidOperationException. StandardOut wurde nicht umgeleitet oder der Prozess hat noch nicht begonnen. Dann müssen Sie die asynchrone Ausgabe starten, nachdem der Prozess gestartet wurde: So machen Sie eine Racebedingung, da der Ausgabestream Daten empfangen kann, bevor Sie ihn auf asynchron einstellen: Dann könnten einige Leute sagen, dass Sie nur den Stream vor Ihnen lesen müssen Setze es asynchron an. Aber das gleiche Problem tritt auf. Es wird eine Race-Bedingung zwischen dem synchronen Lesen und setzen den Stream in den asynchronen Modus. Es gibt keinen Weg, um sicheres asynchrones Lesen eines Ausgabestreams eines Prozesses in der tatsächlichen Weise zu bewirken, dass Process und ProcessStartInfo entworfen wurden. Sie sind wahrscheinlich besser mit asynchronen lesen wie vorgeschlagen von anderen Benutzern für Ihren Fall. Aber Sie sollten sich bewusst sein, dass Sie aufgrund der Rennbedingung einige Informationen verpassen könnten.

Comments

Popular posts from this blog

Master Forex Vs Instaforex Nigeria

Zayla Forex

Kuasa Forex Nasir Yacob