C# GetDirectories sortiern

matte

Cadet 2nd Year
Registriert
Feb. 2014
Beiträge
27
Hello, muss euch wieder etwas fragen.

Habe ein Programm das in einem Verzeichnis jeden Ordner durchgeht und darin eine bestimmte Datei druckt.
Funktioniert auch.

Ordner Struktur sieht etwas so aus:
Kunde12
Kunde16
Kunde100
Kunde108

Der Explorer ordnet diese "richtig" GetDirectories beginnt aber auch mit Kunde100 dann Kunde 108 und dann erst Kunde 12.
Sollte aber genau so sein wie im Explorer. Sind hunderte Seiten.


Code:
String strDir = (@"C:\Users\Public\Documents\" + _cbxMonatAusw.Text);
            try
            {
                Process proc = new Process();
                proc.StartInfo.CreateNoWindow = false;
                proc.StartInfo.Verb = "print";

                foreach (String strSubDir in Directory.GetDirectories(strDir))
                {
                    if (_rbVorhinein.Checked)
                    { 
                     proc.StartInfo.FileName = strSubDir + "\\akvor\\" + DruckDatei;
                        if (File.Exists(proc.StartInfo.FileName))
                        {
                            proc.Start();
                            proc.WaitForExit(10000);
                        }
                    } 
                }
                proc.CloseMainWindow();
                proc.Close();
            }
            catch
            {
                
            }
 
Du müsstest vielleicht mal eine gescheite Frage stellen. Aus der aktuellen Situation wird glaube ich kaum einer schlau. Grundsätzlich bieten in C# "Listen" die Methode Sort an um den Inhalt zu sortieren. Allerdings führt der leere Aufruf dazu, dass die Zeichenketten "alphabetisch" sortiert werden. Und Kunde100 ist vor Kunde18, da die erste 0 bei 100 niedriger ist als die 8 bei 18.

#Edit: Hatte ursprünglich angenommen, dass auch Arrays über eine Sort-Methode verfügen, das ist aber nicht der Fall.
 
Zuletzt bearbeitet:
Meine Frage ist. Wie kann ich die Ordner so einlesen wie sie auch im Explorer angezeigt werden?

Im Moment beginnt er mit Kunde 100 er sollte aber mit Kunde 12 beginnen.

Also hier
Code:
foreach (String strSubDir in Directory.GetDirectories(strDir))
kommt zuerst der Ordner Kunde100.
 
Du musst dir einfach nen eigenen Sortieralgorithmus schreiben der so sortiert wie du es möchtest.
Sortieren ist eigentlich immer als eine Funktion ausgeführt die zwei Parameter annimmt und als Resultat einen Integer zurückgibt.

Rückgabewert -1 = Erster Wert ist kleiner als zweiter Wert
Rückgabewert 0 = Beide Werte sind gleich
Rückgabewert 1 = Erster Wert ist größer als zweiter Wert

Ist ja bei Stackoverflow auch ziemlich genau so beschrieben.
 
Ok DANKE - werder versuchen mich einzulesen - im Moment habe ich NULL Ahnung :D
 
Gebe matias recht, linq ist recht elegant :). Aber hier wird linq alleine nicht reichen, man braucht auch die Entsprechende Klasse dazu. Aber es wurde alles gepostet was man benötigt um das Problem zu lösen. Am Ende steht es dann mit linq wie folg im Code:
Code:
dirs.Sort((x, y) => StringLogicalComparer.StrCmpLogicalW(x,y));

Wie man bis dahin kommt, findest du in den vorigen Posts :)
 
Zuletzt bearbeitet: (Satzbau)
Danke für die schnellen Antworten.

Bin absoluter Neuling bin froh schon so weit gekommen zu sein - muss mir das alles durchlesen.
 
wie wäre es einfach mit

var folder = Directory.GetDirectories(strDir);

folder beinhaltet strings die nach dem Alphabet schon sortiert sind ;)

Also

String strDir = (@"C:\Users\Public\Documents\" + _cbxMonatAusw.Text);

var test = Directory.GetDirectories(strDir);
try
{
Process proc = new Process();
proc.StartInfo.CreateNoWindow = false;
proc.StartInfo.Verb = "print";

foreach (String strSubDir in test)
{
if (_rbVorhinein.Checked)
{
proc.StartInfo.FileName = strSubDir + "\\akvor\\" + DruckDatei;
if (File.Exists(proc.StartInfo.FileName))
{
proc.Start();
proc.WaitForExit(10000);
}
}
}
proc.CloseMainWindow();
proc.Close();
}
catch
{

}
 
Zuletzt bearbeitet: (Code hinzugefügt)
@matias: Das ist doch jetzt genau das gleiche wie im Eröffnungspost nur das eine Zeile zusätzlich verwendet wird. Denn richtig ist, dass er das ganze Alphabetisch sortiert, aber nicht logisch. D.h. 100 steht klar vor 40, da 1 vor 4 steht (alphabetisch gesehen). PS.: Bitte verwende den
Code:
-Bereich, macht das ganze übersichtlicher :).

Ich muss mich allerdings auch korrigieren, ging eigentlich davon aus, dass auch Arrays über eine Sort-Methode verfügen, dass tuen sie allerdings nicht. Lösbar wird das aber mit einer extra Zeile:
[CODE]
List<string> dir = Directory.GetDirectories(strDir).ToList();
dir.Sort((x, y) => StringLogicalComparer.StrCmpLogicalW(x, y));
foreach (string strSubDir in dir)
{
    // do something
}

#Edit "zum neuen Post von matias": Ich würde aufpassen, so wie ich matte nach 14 Posts einschätze könnte er auf die Idee kommen diese Lösung zu kopieren ;). Du sagst ja selbst das die Lösung nicht gerade "schön" ist. Wenn ein Änfänger auf diese Lösung kommt finde ich das voll in Ordnung und Lobenswert. Aber ich halte es nicht für sinnvoll Anfängern so etwas zu präsentieren, auch wenn es Ihr Problem löst. Das ist nicht böse gemeint. Denke da eher an matte, der entweder selbst zu so einer Lösung geführt werden oder aber eben direkt eine Gescheite präsentiert bekommen sollte.
 
Zuletzt bearbeitet:
Guten morgen
Ja..stimmt. Lesen hätte gut getan :D
ich hätte hier aber als Lösung eher einen Hack :D
Es funktioniert,ist aber nicht schön.

Die "returnedList" enthält dann eine liste von strings.

Code:
String strDir = (@"C:\XXXX");
            string ordnerName = "Kunde";
            try
            {

                var test = Directory.GetDirectories(strDir);

                var list = new List<int>();

                foreach (var strSubDir in test)
                {
                    if (strSubDir.Contains(ordnerName))
                    {
                        list.Add(Convert.ToInt32(strSubDir.Split('e').Last()));
                        Console.WriteLine(strSubDir);
                    }
                }

                list.Sort();
                var returnedList = new List<string>();

                foreach (var rList in list)
                {
                    returnedList.Add(ordnerName + rList);
                    Console.WriteLine(ordnerName + rList);
                }

                Console.ReadLine();
            }
            catch
            {

            }
 
Zuletzt bearbeitet: (Erklärung hinzugefügt, Code gesäubert.)
So war im Urlaub und danach mit etwas anderen beschäftigt.

Habe es so gelöst:

Code:
         //Anzahl der Ordner ermitteln 
                int OrdnerAnzahl = System.IO.Directory.GetDirectories(strDir).Length;
                int i = -1;
                string Sortiernamen;
                decimal[] MeinArray = new decimal[OrdnerAnzahl];
                string pattern = "[0-9]";
                Regex myRegex = new Regex(pattern);

                //Ordnerzahlen in Array schreiben
                foreach (String strSubDir in Directory.GetDirectories(strDir))
                {
                    i = i + 1;
                    Sortiernamen = strSubDir.Substring(strSubDir.Length - 4);
                    MatchCollection mc = myRegex.Matches(Sortiernamen);
                    string retVal = string.Empty;
                    for (int s = 0; s < mc.Count; s++)
                    { retVal += mc[s].Value; }
                    //return retVal;
                    MeinArray[i] = decimal.Parse(retVal);
                }
                Array.Sort(MeinArray);

                Process proc = new Process();
                proc.StartInfo.CreateNoWindow = false;
                proc.StartInfo.Verb = "print";

                //Array durchgehen und Datei drucken
                foreach (int element in MeinArray)
                {
                    proc.StartInfo.FileName = strDir + "\\Man"+ element + "\\akvor\\" + DruckDatei;
                    if (File.Exists(proc.StartInfo.FileName))
                    {
                        proc.Start();
                        //proc.WaitForExit(10000);
                    }
                    proc.CloseMainWindow();
                    proc.Close();
                }
 
Zurück
Oben