C# process.StartInfo.Arguments wird abgeschnitten?

Timon3

Team ModMii
Registriert
17 Juli 2013
Beiträge
499
Hallo,

ich arbeite momentan an einem GUI-Downloader für ein Projekt in C#.
Dabei sollen nicht nur Dateien heruntergeladen werden, sondern, da ich die veränderten Daten nicht verteilen darf, sollen die heruntergeladenen Dateien mittels Differenz-Dateien gepatcht werden. Ist ja eigentlich kein Problem, deshalb wollte ich dafür das Programm jptch mitliefern und dann aus meinem Programm heraus aufrufen. Dafür habe ich mir eine Funktion geschrieben:

Code:
Expand Collapse Copy
private void jptch(string arguments)
        {
            Process p = new Process();
            p.StartInfo.WorkingDirectory = Directory.GetCurrentDirectory();
            p.StartInfo.FileName = "jptch.exe";
            p.StartInfo.UseShellExecute = true;
            p.StartInfo.Arguments = arguments;
            p.Start();
            p.WaitForExit();
        }

Das ganze funktioniert auch super. Bis darauf, dass der Pfad, in dem das Programm liegt, nicht zu lang sein darf. Denn als Beispiel ist hier ein Funktionsaufruf:
Code:
Expand Collapse Copy
jptch(textBox1.Text + @"\wad\Schritt 1 - IOS\IOS37-v5663.wad " + CurrDir + @"\extract\rodries\ios223.dif " + textBox1.Text + @"\wad\Schritt 2 - cIOS\IOS223[37]-v5.1R.wad");

Wenn ich das Programm von einem Ordner, dessen Pfad nur recht kurz ist, aufrufe, ist das ganze kein Problem, es wird ordentlich gepatcht. Wenn ich aber einen längeren Pfad habe, z. B. "C:\Users\User\Documents\Visual Studio 2012\Projects\ModMii-Test\ModMii-Test\bin\Release" klappt das ganze nicht, obwohl es theoretisch gehen müsste - denn eigentlich sollte der Prozessaufruf laut bis zu 8192 Zeichen unterstützen. Tut er aber nicht.

Link schrieb:
If you are using the CMD.EXE command processor, then you are also subject to the 8192 character command line length limit imposed by CMD.EXE.

Jetzt ist die Frage: Warum ist das so? Kann mir da jemand auf die Sprünge helfen?
Wenn ihr mehr Code braucht, sagt Bescheid.

Vielen Dank im Voraus! :)
 
Ich weiß nicht, ob dir das weiter hilft.
Aber ich stand mal vor einem "ähnlichen Problem" (VisualStudio mit .NET4).

Wollte auch eine externe EXE über mein Projekt aufrufen lassen. Das führte aber dazu, dass sich meine Anwendung beendete und so auch die externe Anwendung nicht gestartet wurde.

Mag vielleicht "dreckig" sein, aber ich habe das ganze lösen können, in dem ich den Prozessaufruf als eigenen Thread gestartet habe.

Ich muss zugeben: Von einer Zeichenbeschränkung beim Pfad wusste ich damals noch nichts. Aber vielleicht kannst du das trotzdem mal ausprobieren.

Hoffe ich konnte dir helfen ;)
 
Kannst du mal schauen was nach Directory.GetCurrentDirectory() in p.StartInfo.WorkingDirectory steht? Außerdem im Debug Modus ist das aktuelle Directory das "bin\Debug" deines Projekts (sofern du es nicht änderst). Aber bei kurzen Pfad funktioniert es ja hast du gesagt.
 
Zuletzt bearbeitet:
Wenn ich das Programm von einem Ordner, dessen Pfad nur recht kurz ist, aufrufe, ist das ganze kein Problem, es wird ordentlich gepatcht. Wenn ich aber einen längeren Pfad habe, z. B. "C:\Users\User\Documents\Visual Studio 2012\Projects\ModMii-Test\ModMii-Test\bin\Release" klappt das ganze nicht, obwohl es theoretisch gehen müsste - denn eigentlich sollte der Prozessaufruf laut bis zu 8192 Zeichen unterstützen. Tut er aber nicht.

Länge der Argumente und die Länge des vollständigen Pfads dürfen zusammen nicht länger als 2080 sein.
 
  • Thread Starter Thread Starter
  • #5
@gerechtigkeit0: Hab ich gerade mal probiert, ändert aber leider überhaupt nichts. Aber Danke für den Vorschlag.

@Schinni999: Danach steht darin exakt derselbe Pfad wie der, in dem auch das Programm liegt. Daran liegt also nicht der Fehler. Und ich habe das auf Release stehen ;) aber auch dir Danke.

@KaPiTn: Ach so, ich habe gedacht, es gilt das, was da bei der CMD steht. Aber selbst, wenn ich den Pfad, in dem das Programm liegt, 5x übergeben würde (was ja bei weitem nicht gegeben ist, es wird nur 4x übergeben) komme ich gerade mal auf 528 Zeichen, was ja deutlich darunter liegt.

Ich habe mal den Standard-Output und den Standard-Error in eine Textbox umgeleitet, und da wurde der Pfad so abgeschnitten: "C:\Users\Timon\Documents\Visual "
Leider weiß ich nicht genau, ob das vom ersten oder zweiten Argument stammt, da jptch das nicht ausgibt.
 
Das Leerzeichen dürfte das Problem sein, weil dadurch umgebrochen und ein neue Parameter erwartet wird. Der Pfad muß in Anführungszeichen stehen. Da Du WerbatimString (@) benutzt, müstest Du diese dann mit doppeltem "" escapen.
 
  • Thread Starter Thread Starter
  • #7
Stimmt, das wird das Problem sein. Vielen Dank! :) Aber ich habe mich jetzt dazu entschieden, einfach einen etwas besseren Algorithmus direkt in den Code zu integrieren.
 
Zurück
Oben