C# Problem mit Process und vielen argumenten



  • Hallo,

    ich bin neu in C# und habe da eine frage, ich habe folgeden code wenn ich auf ein button klicke:

    FilePath = openFileDialog1.FileName;
    
                        var lines = File.ReadAllLines(FilePath);
                        string path = Application.StartupPath + "\\Mount\\Temp";
    
                        foreach (var line in lines)
                        {
                            cmdProcess("/C Tools\\SetACL.exe -on \"" + path + line + "\" -ot file -actn setowner -ownr \"n:S-1-5-32-544\" -rec cont_obj", "cmd.exe", false);
                        }
                        foreach (var line in lines)
                        {
                            cmdProcess("/C Tools\\SetACL.exe -on \"" + path + line + "\" -ot file -actn ace -ace \"n:S-1-5-32-544;p:full\" -ace \"n:S-1-5-32-545;p:full\" -rec cont_obj", "cmd.exe", false);
                        }
    

    ich lese eine textdatei ein die viele pfade beinhaltet und nutze die datei SetACL um Rechte zu vergeben. Pro Ordner/Datei muss ich beide comands ausführen und nutze dazu eine funktion cmdProcess

    hier die funktion:

    public void cmdProcess(string comand, string FileName, bool wait)
            {
                string scmd4 = comand;
                Process sproc4 = new Process();
                sproc4.StartInfo.FileName = FileName;
                sproc4.StartInfo.Arguments = scmd4;
                sproc4.StartInfo.UseShellExecute = false;
                //sproc4.StartInfo.RedirectStandardOutput = true;
    
                //sproc4.StartInfo.CreateNoWindow = true;
                //sproc4.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                sproc4.Start();
    
                if (wait == true)
                {
                    sproc4.WaitForExit();
                }
            }
    

    das Ganze funktioniert auch wunderbar, jedoch:

    1. hängt meine GUI und ich weis nicht wie ich das "beheben" kann mit zB einem Thread
    2. bei zB 2000 zeilen (Dateien und Ordner Pfaden) haengt der ganze PC eine weile bis alles erledigt ist. Es werden eine menge CMD fenster geoeffnet, wahrscheinlich werden alle befehlt fast gleichzeigt bearbeitet?
    3. wie kann ich das ganze beschleunigen, zB
    -Erster Pfad wird gelesen, beide CMD comands werden ausgeführt in nur einem Prozess und nicht zwei wie jetzt (das muesste doch den "stress" um 50% senken oder nicht ?)

    vielen Dank schonmal

    EDIT: bei 10000 Pfaden stürtzt die SetAcl.exe sogar ab



  • KrX schrieb:

    1. hängt meine GUI und ich weis nicht wie ich das "beheben" kann mit zB einem Thread

    Je nach eingesetzter .NET Version gibt es mehrere Möglichkeiten. Bei .NET 4 oder kleiner ist der BackgroundWorker oder ein eigener Thread das Mittel der Wahl. Mit dem BackgroundWorker geht es etwas simpler.
    Ab .NET 4.5 kann man das über async/await lösen, was die komfortabelste Möglichkeit darstellt.

    Was die Performance angeht: Du kannst natürlich die beiden Schleifen zusammenlegen, nur wird das wahrscheinlich nicht viel bzw. nichts bringen, weil du ja zwei Operationen auf eine Datei ausführen willst. D.h. die SetACL-Aufrufe müssen für Datei x eh sequentiell ablaufen.
    Ach ja, hängen dürfte dein Programm bei 2000 Zeilen eigentlich nicht. Das ist nicht viel und du wartest ja auch nie auf die Beendigung des Shell Aufrufs.



  • hallo,

    danke fuer die Antwort.

    Ach ja, hängen dürfte dein Programm bei 2000 Zeilen eigentlich nicht. Das ist nicht viel und du wartest ja auch nie auf die Beendigung des Shell Aufrufs.

    also bei 2000 bzw 10000 Zeilen haengt eher windows, da so viele cmd fenster aufgerufen werden



  • Wäre es nicht besser, wenn du aus den ganzen Befehlen eine Batchdatei erzeugst und diese dann ausführen läßt?



  • ich denke das ginge schon, jedoch ist das nicht die schoenste loesung 😉



  • KrX schrieb:

    ich denke das ginge schon, jedoch ist das nicht die schoenste loesung 😉

    Also aus meiner Sicht wäre das die schönste Lösung, wenn du das in einer Batch-Datei abfrühstückst.



  • ok, werde es mal heute Abend mit 10000 Zeile ausprobieren. Dachte es wuerde auch so gehen


Anmelden zum Antworten