VisualBasic Befehl für mehrere Dateien ausführen

Gilrich

Cadet 4th Year
Registriert
Nov. 2009
Beiträge
96
Hallo

Ich möchte ein kleines Programm schreiben, dass bei mp3 dateien die Tags ausliest und die Lieder dementsprechend in Ordner sortiert. Ich habs jetzt geschafft dass es mit einer datei funktioniert. Aber wie mach ich das, dass alle Dateien im Ausgangs Ordner sortiert werden.
Muss ich alle Songs in ein Array speichern? Wenn ja, wie geht das?

Vielen Dank für die Hilfe

Gruss Gilrich
 
Welches VB? Ein .NET? Dann schau Dir mal das DirectoryInfo-Objekt an; damit machst Du eine Schleife über alle MP3 im gewünschten Ordner.
 
Super! Funktioniert perfekt. :daumen:

Vielen Dank

Hab aber noch ein anderes Problem.
Ich erstelle zuerst mit MkDir die passenden Ordner
und kopiere mit FileCopy die Datei hinein.
Danach möchte ich die Datei am Ursprungsort löschen.
Es kommt aber immer ein Fehler, dass die Datei in vshost.exe geöffnet ist und nicht gelöscht werden kann.
Was kann ich da machen?
 
Am besten den Stream / StreamReader, den du verwendest um die Tags der Datei auszulesen, mit Close() schließen sobald du ihn nicht mehr brauchst.

Anmerkung: Das bloße Verlassen der Methode (z.B. mit "return;") reicht nicht aus um verwendete Ressourcen wieder freizugeben. Gewöhn dir an, dass du Objekte, die in einer Methode erstellt wurden auch wieder sauber geschlossen werden, wenn sie nicht anderweitig gebraucht werden. D.h. falls diese Objekte ein Close() haben, dann auch Close() aufrufen, gleiches gilt für Objekte mit einer Dispose() Methode. Das führt zwar noch nicht dazu, das der GarbageCollector die Objekte unmittelbar aus dem Speicher entfernt, jedoch werden da externe Ressourcen, z.B. offene Dateihandles, geschlossen.
 
Zuletzt bearbeitet:
1.)
In VB.NET gibt es für solche Aufgaben mehrere ziemlich nützliche Funktionen:

My.Computer.Filesystem.GetFiles(Directory as String) liefert alle Dateien in einem Ordner. Als zusätzliche Parameter kannst du noch angeben, ob Subdirs auch durchsucht werden sollen und bei Bedarf kannst du auch gleich einen Wildcard angeben z.B. "*.mp3"
My.Computer.Filesystem.GetDirectories(Directory as String) lieft alle Unterverzeichnisse

My.Computer.Filesystem.CopyFile(Source as String, Destination as String) kopiert eine Datei
My.Computer.Filesystem.MoveFile(Source as STring, Destination as STring) verschiebt eine Datei. Das hat den Vorteil, dass es erstens auf der selben Partition sehr schnell geht und zweitens auch alle Attribute der Datei erhalten bleiben z.B. Zugriffsrechte
My.Computer.Filesystem.DeleteFile(File as String) löscht die Datei.

My.Computer.Filesystem.ReadAllBytes(File as String) liest den Inhalt eine Datei in den RAM. Das sollte man aber nur bei kleineren Dateien machen. Bei gewöhnlichen Songs ist das OK, bei DVD Images ist das eher eine schlechte Idee.
My.Computer.Filesystem.ReadAllText(File as String) liest den Inhalt einer Datei

Es gibt dazu auch noch die passenden Write Methoden:
My.Computer.FileSystem.WriteAllText bzw. WriteAllBytes.

My.Computer.Filesystem.CreateDiretory erzeugt einen neuen Ordner.

2.)
Einen Filestream brauchst du eigentlich nur dann, wenn die Datei so groß ist, dass sie auf einmal nicht in den RAM passt oder wenn du den Stream an irgendwelche Funktionen übergeben willst. Einen Stream musst du nach dem Benutzen immer schließen. Ein Stream wird zwar beim Beenden der .exe automatisch geschlossen, aber ich würde mich nicht so darauf verlassen.

3.) Projektname.vshost.exe ist der Name deines Programms beim Debuggen.
 
Hi noch eine Zusatzinfo zu Objekten mit Close() Methode

Ich habe mir angewöhnt anstatt Close() lieber die using directive zu verwenden. Das hat den Vorteil, dass beim Verlassen der Section automatisch geclosed sowie disposed wird, wenn das notwendig ist.

Hier ein beispiel für c#. Für VB.Net hab ichs grad net im Kopf

Lösung mit Close:
Code:
StreamReader sr = new StreamReader(@"c:\temp\bla.txt");

            while (!sr.EndOfStream)
            {
                string line = sr.ReadLine();
               
                if (line.Length == 0) return; 
                //Schlecht, man verlässt die Methode ohne die Ressource zu schliessen
                //FileHandle bleibt auf. 
            
            }

            sr.Close();

Lösung mit Using:
Code:
using (StreamReader sr = new StreamReader(@"c:\temp\bla.txt"))
            {
                while (!sr.EndOfStream)
                {
                    string line = sr.ReadLine();

                    if (line.Length == 0) return; 
                    //Ideale Lösung. Beim Verlassen der Using Section
                    //egal durch was, wird die Resource geschlossen

                }
            }

Bei VB.Net funzt das irgendwie mit
Using
End Using



Gruss Magic
 
Zurück
Oben