DirectoryInfo.GetFiles() richtig sortieren

Nil18

Erfahrenes Mitglied
Hallo liebe Helfer :)

Ich hab hier ein Problem mit der Sortierung bei der Methode DirectoryInfo.GetFiles().
Und zwar lese ich alle Dateien eines Ordners ein und ändere deren Namen (Nummeriert).

Das Problem dabei ist, dass die Methode DirectoryInfo.GetFiles() anscheinend falsch sortiert.

Angenommen ich habe einen Mp3 Player auf dem das Lied "Foo" vor dem Lied "Bar" spielen soll. Mein Mp3 Player sortiert die Lieder blöderweise aber immer nach Alphabet. Nun wollte ich ein Programm schreiben welches die Lieder einfach Nummeriert, also bekommt Lied "Foo" Die Nummer 01 und Lied "Bar" die Nummer "02", damit würde es der Mp3 Player richtig ordnen.

Das Problem dabei ist eben, dass DirectoryInfo.GetFiles() selbst nach Alphabet ordnet, wie bekomme ich es also hin, dass die Dateien in der Reihenfolge "eingelesen" werden, wie sie tatsächlich im Ordner aufgelistet liegen?

Hier mal mein Code:
Code:
public string performRename()
{
    //Gibt's das Verzeichnis überhaupt?
    if (!_dir.Exists)
       return "Das Verzeichnis existiert nicht!";

    int tracknumber = 0;

    try
    {
          //Jede Datei im ausgewählten Verzeichnis
          foreach (FileInfo curFile in _dir.GetFiles())
          {
                //Wenn es eine Mp3 oder WMA Datei ist
                if(curFile.Extension.Equals(".mp3") || curFile.Extension.Equals(".wma"))
                {
                     //Wie soll der Name aussehen?
                     if (_option)
                         //Ordner + \ + nummer + name. Bspw: C:\Musik\01 foobar.mp3
                         curFile.MoveTo(_dir + "\\" + String.Format("{0:d2}",tracknumber) + " " + curFile.Name);
                     else
                         //Ordner + \ + nummer + endung. Bspw: C:\Musik\01.mp3
                         curFile.MoveTo(_dir + "\\" + String.Format("{0:d2}", tracknumber) + curFile.Extension);

                      tracknumber++;
                }
          }
    }
    catch
    {
         return "Fehler während des Umbenennens!";
    }

     return "Alle Dateien erfolgreich umbenannt!";
}

Programmiert wird in C# 2.0

In der MSDN steht:
The order of the returned file names is not guaranteed; use the Sort method if a specific sort order is required.

Okay, nur wo soll ich sortieren? Wie aus dem Code zu erkennen ist gehe ich mit foreach drüber.

Bitte um Hilfe :(
Danke im Voraus!

PS: Wie kann man denn hier so schön färbige Code Snippets posten wie sie Cosmo immer macht?

//edit:

Habe mittlerweile etwas gefunden:
http://dotnet.mvps.org/dotnet/code/filesystem/#SortFiles

Nuuuuur, wie sortiert man in der Reihenfolge in der die Dateien im Verzeichnis liegen?
 
Zuletzt bearbeitet:
Okay, nur wo soll ich sortieren? Wie aus dem Code zu erkennen ist gehe ich mit foreach drüber.

Habe mittlerweile etwas gefunden:
http://dotnet.mvps.org/dotnet/code/filesystem/#SortFiles

Nuuuuur, wie sortiert man in der Reihenfolge in der die Dateien im Verzeichnis liegen?
Also die Dateien liegen nicht sortiert im Dateisystem. Der Explorer sortiert die Dateien standardmäßig in alphabetischer Reihenfolge und beachtet zusätzlich die Nummerierung. Der einzige Unterschied dabei ist, dass die Nummern exakt in aufsteigender Reihenfolge sortiert werden.
Es gäbe hier meines Erachtens 2 Möglichkeiten:
  1. Du sortierst die String Objekte mithilfe eines IComparer Interfaces, ähnlich wie es in deinem Artikel beschrieben ist. Wie Du die Einträge alphanumerisch sortieren kannst, ist in diesem Artikel beschrieben: Numeric String Sort in C# - TheCodeProject
  2. Du sortierst die Ordnerstrings mithilfe des ICompareable Interface. Dafür bildest die Dateinamen in Objekten ab und erstellst eine Objektsammlung. Dafür brauchst hier lediglich Objekte definieren, die deine Dateien repräsentieren und definierst eine generische Liste, ähnlich wie in diesem [thread=232634]Array "Sortieren" - Thread[/thread]. Mit RegEx splittest den Dateinamen auf und stellst jedes Informationssegment des Strings als Property bereit. Damit kann auch im nachhinein noch bequemer mit den einzelnen Dateinen arbeiten. Um die Elemente nun zu sortieren, implementierst das ICompareable interface und verwendest den Comparer aus dem TheCodeProject Beispiel.
Wie kann man denn hier so schön färbige Code Snippets posten wie sie Cosmo immer macht?
Das sind alle CodeTags die verfügbar sind.
http://www.tutorials.de/forum/interne-news/235108-tagebuch-zur-tutorials-de-v-6-entwicklung.html hat gesagt.:
actionscript, ada, apache, asm, asp, bash, c, c_mac, caddcl, cadlisp, cpp, csharp, css, d, delphi, diff, div, eiffel, gml, html4strict, java, javascript, lisp, lua, matlab, mpasm, nsis, objc, oobas, oracle8, pascal, perl, php-brief, python, qbasic, smarty, sql, vb, vbnet, vhdl, visualfoxpro, xml
 
Wow, danke cosmo ... den CodeTag muss ich gleich mal testen:
C#:
public class Renamer
    {
        //Fields
        private DirectoryInfo _dir;
        private bool _option = false;

        /// <summary>
        /// Konstruktor
        /// </summary>
        /// <param name="yPfad">Der Ordner indem die umzubenennenden Dateien liegen</param>
        /// <param name="yOption">True: 01 foobar.mp3 | False: 01.mp3</param>
        public Renamer(string yPfad, bool yOption)
        {
            _dir = new DirectoryInfo(yPfad);
            _option = yOption;
        }

Das andere hab ich allerdings kaum verstanden.
Wenn ich im Explorer Datei "zulu" vor/über Datei "alpha" schiebe und den ordner erneut öffne, ist die Dateienreihenfolge noch genauso.
Also irgendwo muss das doch gespeichert sein.
Ich will nämlich keine Alphabetische Sortierung, sondern eben meine eigene. Ganz genau so, wie ich sie mir im Explorer zurechschiebe, sollen die Titel nachher nummeriert werden.

Wie funktioniert das?
Falls das mit der zweiten von dir genannten Methode funktioniert, könntest du die noch etwas "einfacher" beschreiben, damit sie auch ein Anfänger versteht? Danke :)

//edit: Sieht hübsch aus der Tag :)
 
Die erste Methode ist viel einfacher zu verwenden. Da sortierst von außen her. Probier das als erstes mal aus.

Bei der zweiten Methode sortieren sich die Elemente in dem Array selber, bzw. bestimmen sie quasi selber, wie sie sortiert werden. Da hast den Vorteil das Du bestimmte Informationen aus den Dateinamen als Eigenschaften in einem Objekt zur Verfügung stellen kannst, um im nachhinein bequemer damit arbeiten zu können und vor allem die Sortierung noch dynamischer gestalten zu können...

Kommt nun darauf an welchen Aufwand Du betreiben willst, bzw. was an Funktionalitäten gefordert ist.
Reicht das alphanumerische sortieren nicht aus, solltest die 2. Variante verwenden.
 
Das würde ich gerne ... wenn ich wüsste was genau damit gemeint ist.
(Ich bin Anfänger)
Das Programm soll die Dateien einfach genauso durchnummerieren wie sie im ausgewählten Ordner vorliegen.
Also:
beta.mp3
alpha.mp3
zulu.mp3
romeo.mp3
delta.mp3
soll so nummeriert werden:
01 beta.mp3
02 alpha.mp3
03 zulu.mp3
04 romeo.mp3
05 delta.mp3

Das Problem ist nun, dass wenn ich es mit der von mir im ersten Post geschriebenen Mehtode mache, er es alphabetisch ordnet, was zur Folge hätte das ich gleich gar keine Nummierung zu machen brauche:

so macht es GetFiles() hat gesagt.:
01 alpha.mp3
02 beta.mp3
03 delta.mp3
04 romeo.mp3
05 zulu.mp3

Die Frage ist nun WOHER bekomme ich die richtige Reihenfolge?
Dass ich es mittels Comparer oder ICompare vergleiche oder mit Sort sortiere, das ist gar nicht das Problem, nur woher bekomme ich die REIHENFOLGE wie sie im Explorer dargestellt ist?
 
Die Frage ist nun WOHER bekomme ich die richtige Reihenfolge?
Dass ich es mittels Comparer oder ICompare vergleiche oder mit Sort sortiere, das ist gar nicht das Problem, nur woher bekomme ich die REIHENFOLGE wie sie im Explorer dargestellt ist?
Wenn sie wie in deinem ersten Zitat sortiert sind, musst im Explorer nach etwas anderm als dem Namen sortieren. Was ist da eingestellt Größe, Typ, Geändert am oder was anderes?
Btw. [thread=258982]Integer Wert 00000001 nur wie? - Thread[/thread]

Wenn ich heute Abend Zeit finde, mach Dir eine Demo, ok. Im Moment habe ich keine Zeit dafür.
 
Hello...

Vielen Dank, das mit der 0 vor den Zahlen 1-9 hab ich bereits dank String.Format geschafft.

Das ist eben das seltsame, es gibt keine Sortierung.
Ich sortiere mir die Lieder auf dem Mp3 Player so wie ich will.
Wenn ich nach Lied "foo" das Lied "bar" haben will, weil sichs gut anhört, es aber in keiner weise mit irgendwelchen Sortierungen möglich ist die Lieder so anzuordnen, verschiebe ich mir die Dateien eben selber so.
Und genau das ist eben das Problem, weil der Mp3 Player dann nach Alphabet sortiert, ich aber meine EIGENE Sortierung haben will...

Tut mir wirklich leid, ich weiss nicht wie ich mich noch ausdrücken soll :/
Vielleicht veranschaulicht das nochmal was ich will:
foobarjf3.jpg

Eigene Sortierung. In rot sieht man die Nummerierung wie sie nachher sein soll...

PS:
cosmo hat gesagt.:
Wenn sie wie in deinem ersten Zitat sortiert sind, musst im Explorer nach etwas anderm als dem Namen sortieren. Was ist da eingestellt Größe, Typ, Geändert am oder was anderes?
Das will ich aber nicht ... die Mp3s sollen ja genau so sortiert sein, weil genau DAS die Abspielreihenfolge werden soll ...

cosmo hat gesagt.:
Wenn ich heute Abend Zeit finde, mach Dir eine Demo, ok. Im Moment habe ich keine Zeit dafür.
DAS wäre sehr nett ... und total super!
 
Zuletzt bearbeitet:
Gut, Du willst also eine eigene Sortierung mithilfe von Nummern in den Dateinamen quasi erzwingen? Dann musst sie Titel in einer Liste (Control) so sortieren, wie Du sie haben willst und arbeitest dann die Liste von oben nach unten ab. Ich hoffe ich hab dein Problem jetzt richtig verstanden.

Ach Mist, gestern habe ich keine Zeit mehr gefunden. Und heute weiss ich auch noch nicht ob ich heut noch dafür Zeit haben werde. Wir vollenden im Moment was auf den letzten Drücker und wollen es zum Jahreswechsel veröffentlichen. Probier das Beispielprogramm aus dem [thread=232634]Array "Sortieren" - Thread[/thread] mal aus. Daran siehst sehr gut wie der zweite Variante funktioniert.
 
Das könnte funktionieren ...
Ich gebe den Ordner an, das Programm importiert alle Mp3 und WMA Dateien in eine List, der Benutzer muss es sich dort, anstelle vom anderen Ordner sortieren und dann rattere ich einfach die Indexe des Controls durch und nummiere....

So eine Idee hatte ein Kumpel von mir auch, allerdings wäre da eine Drag and Drop Lösung mit Ausgabeordner fast NOCH schöner :p
Also Dateien einfach in die Liste ziehen, Reihenfolge bestimmen, Ausgabe Ordner angeben und "execute" ...

Danke für die Hilfe, diesen Weg werde ich mal probieren :)
Schade dass es hier kein Renommee gibt ;)

PS: Das "Umbedingt-zu-Jahresende-eine-neue-Version-auliefern-muss-Syndrom" gibts in unserer Firma auch ;)
Aber davon Distanziere ich mich und Code lieber MP3-Player-Lieder-Sortierer ;)
 
Zuletzt bearbeitet:
Hello...

Ich melde mich nochmal bezüglich meinem Problem zu Wort...

Hast du vielleicht bereits ein kleines Beispiel für mich cosmo?

Es gibt meines Wissens nach nämlich kein Control welches die Items verschieben lässt.
Wie würdest du das angehen cosmo?

Also wenn ich ein paar Items in einer ListBox habe, diese zu verschieben...
 

Neue Beiträge

Zurück