• beyond tellerrand – play. Register Now!
Zurück   Flashforum > Flex und AIR > Adobe AIR

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 26-08-2010, 15:21   #1 (permalink)
Neuer User
 
Registriert seit: Aug 2010
Beiträge: 5
Post Ordner und Unterordner durchsuchen

Hallo,
seit kurzem wage ich mich an Flash bzw Air ran und versuche zum einstieg einen kleinen Mp3-Player zu basteln. Habe bisher eigentlich keine Schwierigkeiten, doch bin ich nun auf ein Problem gestoßen, welches ich nicht lösen kann.
Ich benutze einen Button um durch die Ordnerauswahl Lieder zur Playlist hinzuzufügen. Da ich nicht ganz so neu im Gebiet der Programmierung bin, habe ich es auch geschafft, dass die Unterordner mit einbezogen werden.
Nachdem ich aber z.B. "eigene Musik" ausgewählt habe und der ganze Ordner durchsucht worden ist, so wurdr nur ein Bruchteil der Musik geladen
(so ca 330 Titel - manchmal ein bis zwei mehr oder weniger). Jetzt stellt sich für mich die Frage, wieso das so ist. Die Funktionen funktionieren ja eigentlich - durchlaufen nur nicht vollständig die Ordner?!
Hier mal ein bischen code:
Code:
			private function addFolder():void
			{
				dir.browseForDirectory("");
				dir.addEventListener(Event.SELECT,search);
			}
			private function search(event:Event):void
			{
				dir=event.target as File;
				getFiles(dir);
			}			
			private function getFiles(dir:File):void
			{
				var files:Array=dir.getDirectoryListing();
				for(var i:uint=0;i<files.length;i++)
				{ 
					var file:File=files[i];
					if (file.isDirectory) getFiles(file);
					else if (file.extension=="mp3"||file.extension=="wma"||file.extension=="MP3")
					{
						var song:Sound=new Sound();
						song.load(new URLRequest(file.url));
						song.addEventListener(Event.ID3,onID3);
					}
					
				}
			}
			private function onID3(event:Event):void
			{
				var id3:ID3Info=new ID3Info;
				id3=event.target.id3;
				playlist.addItem({col1:id3.artist,col2:id3.songName,col3:playlist.length,col4:event.target.url});
				event.target.removeEventListener(Event.ID3,onID3);
				event.target.close()
				label1.text=playlist.length.toString();
			}
Ich würde mich über eure Hilfe freuen.
mfG Daniel
mrgrimmig ist offline   Mit Zitat antworten
Alt 26-08-2010, 20:39   #2 (permalink)
Neuer User
 
Registriert seit: Sep 2007
Beiträge: 9
Habe das ganze nur überflogen und da nicht alle Funktionen vorhanden sind und ich mit air keine erfahrung habe rate ich mal:

Grundsätzlich gefällt mir nicht wie die function getFiles sich immer wieder selber aufruft.
Schöner würde ich es finden wenn du zuerst alle Verzeichnisse in ein Array abspeicherst und danach in jedem Verzeichnis nach den Musikdateien suchst.

muss hier nicht zusätzlich wie in php abgefragt werden ob es sich wirklich um ein Unterverzeichnis handelt:
Statt: if (file.isDirectory) getFiles(file);
php: if (file.isDirectory && file!="." && file!="..") getFiles(file);


wird hier jeder Song geladen bevor er in die Playliste kommt?
song.load(new URLRequest(file.url));

auch wenn die var song nur lokale Gültigkeit besitzt wird sie womöglich mehrmals neu instanziert bevor sie den Event abfeuern kann.

Werden in die Playlist auch Dateien abgelegt die keinen ID3 Eintrag haben?

Liebe Grüsse Dregi
dregi ist offline   Mit Zitat antworten
Alt 27-08-2010, 10:52   #3 (permalink)
Neuer User
 
Registriert seit: Oct 2007
Beiträge: 434
Zitat:
Zitat von dregi Beitrag anzeigen
Grundsätzlich gefällt mir nicht wie die function getFiles sich immer wieder selber aufruft.
Schöner würde ich es finden wenn du zuerst alle Verzeichnisse in ein Array abspeicherst
Bei unbekannten, belibig verzweigten Strukturen sind rekursive Funktionen numal das Mittel der Wahl, auch wenn es dir nicht gefällt

Erst in nem Array speichern und dann auslesen ist in jedem Fall die weniger elegante Lösung.

Allerdings würde ich mir tatsächlich überlegen, ob du nicht zunächst die Dateinamen ausließt und in einem Array speicherst, und dann erst die Dateien nacheinander lädst.

Momentan sieht es so aus, als ob du sämtliche mp3s des gewählten Ordners in den Arbeitsspeicher holst, da kann schonmal bei 330 Titeln (ca. 1-2GB ) Schluß sein.
Lukas78 ist offline   Mit Zitat antworten
Alt 27-08-2010, 11:08   #4 (permalink)
Neuer User
 
Registriert seit: Aug 2010
Beiträge: 5
Ich versuche nun ersteinmal die erste Lösung.
Hatte es auch erst mit einem Timer "gelöst", aber gefiel mir nicht, da die Titel dann alle nacheinander erst ins Datagrid "rein rutschten".
Erst hängte sich auch alles auf, aber nachdem in dann den eventListener entferne und die soundDatei wieder schließe funktioniert es ja halbwegs..

Anders bekomm ich halt nicht direkt die ID3-Tags, was ich aber schon gerne so hätte.
Mit 'nem Filestream die Daten einzulesen habe ich bereits auch getestet, aber war auch nicht die beste Lösung.
Ich versuch es nun erstmal so oder benutz noch mal den Timer. Danke schonmal für eure Antworten.
mrgrimmig ist offline   Mit Zitat antworten
Alt 27-08-2010, 11:25   #5 (permalink)
Neuer User
 
Registriert seit: Oct 2007
Beiträge: 434
Von nem Timer redet ja keiner

Du erstellst halt immer neue Soundobjekte und das werden irgendwann zu viele, müsstest du eigentlich ganz gut im Profiler nachvollziehen können.

Daher wenn du von einer Datei die ID3 Daten hast, im gleichen Soundobjekt die nächste Datei laden. Vorher siehst du dann auch schon in dem gespeicherten Array, ob du alle Dateinamen hast.
Lukas78 ist offline   Mit Zitat antworten
Alt 27-08-2010, 12:15   #6 (permalink)
Neuer User
 
Registriert seit: Aug 2010
Beiträge: 5
Habs verstanden. Aber nun hab ich hier den Wurm drin. Ich hoffe ihr verzeiht (bin wie gesagt blutiger Anfänger).
Habe also nun ein Array mit allen Dateien drin.
Ein Soundobjekt wird vorher schon erstellt und die erste Datei wird geladen.

onID3 hab ich etwas geändert:
Code:
private function onID3(event:Event):void
			{
				var id3:ID3Info=new ID3Info;
				id3=event.target.id3;
				playlist.addItem({col1:id3.artist,col2:id3.songName,col3:playlist.length,col4:event.target.url});
				label1.text=playlist.length.toString();
				if (count<temp.length)
				{
					count++;
					song.load(new URLRequest(temp[count].url));
				}
			}
So funktionierts aber nicht. ->"Functions called in incorrect sequence, or earlier call was unsuccessful.Functions called in incorrect sequence, or earlier call was unsuccessful."
mrgrimmig ist offline   Mit Zitat antworten
Alt 27-08-2010, 12:38   #7 (permalink)
Neuer User
 
Registriert seit: Oct 2007
Beiträge: 434
Würd mal sagen, dass da ein song.close() vor dem song.load(...) fehlt.
Lukas78 ist offline   Mit Zitat antworten
Alt 27-08-2010, 12:43   #8 (permalink)
Neuer User
 
Registriert seit: Aug 2010
Beiträge: 5
Das hab ich noch beim schreiben rausgelöscht. Liegt auf jeden Fall nicht daran. Kommt der gleiche Fehler

edit: aus einem anderen Forum:"I'm not entirely sure, but I don't think you can load a new sound into a Sound instance once it has already loaded a sound. I'm pretty sure you must create a new Sound instance."
Wenn ich das so machen klappt wieder alles, aber obiges Problem. Es wird nicht alles geladen. Es muss noch irgendeine Möglichkeit geben...

Geändert von mrgrimmig (27-08-2010 um 12:55 Uhr)
mrgrimmig ist offline   Mit Zitat antworten
Alt 27-08-2010, 14:41   #9 (permalink)
Neuer User
 
Registriert seit: Oct 2007
Beiträge: 434
Aber in deinem Array sind alle Dateien drin, nur das laden klappt nicht?
Lukas78 ist offline   Mit Zitat antworten
Alt 27-08-2010, 15:12   #10 (permalink)
Neuer User
 
Registriert seit: Aug 2010
Beiträge: 5
Ja alles drin.
Hab das nun doch nochmal mit nem Timer statt ner For-Schleife probiert (deswegen vorhin auch die Anmerkung).
"delete song" funktioniert nicht - somit alle Soundobjekte in ein anderes, neuangelegtes Objekt rein und dann mit delete sofort wieder entfernt.
Eine total hässliche Lösung, aber immerhin funktioniert es so mehr oder weniger, wie es soll.. Sind nun nur noch 20 Dateien die nicht geladen werden, aber da hab ich bestimmt einfach irgendwo einen Fehler reingehauen, den ich wohl noch finden werde. Ich hoffe dennoch, dass noch iwer ne gescheite Lösung hat an sonstens lass ich es erstmal so.
Kann später den Code reineditieren, damit die "Lösung" für alle zugänglich ist.

edit:
Code:
private function getFiles(dir:File):void
			{
				var files:Array=dir.getDirectoryListing();
				for(var i:int=0;i<files.length;i++)
				{ 
					var file:File=files[i];
					if (file.isDirectory) getFiles(file);
					else if (file.extension=="mp3"||file.extension=="wma"||file.extension=="MP3")
					{
						temp.addItem(file);
					}
				}				
			}
			private function onTick(event:Event):void
			{	
				delete obj.song;
				obj.song=new Sound();
				obj.song.load(new URLRequest(temp[timer.currentCount-1].url));
				obj.song.addEventListener(Event.ID3,onID3);				
			}
			private function onClick():void
			{
				timer.delay=.5;
				timer.repeatCount=temp.length;
				timer.addEventListener(TimerEvent.TIMER,onTick);
				timer.start();
			}
			private function onID3(event:Event):void
			{
				var id3:ID3Info=new ID3Info;
				id3=event.target.id3;
				playlist.addItem({col1:id3.artist,col2:id3.songName,col3:playlist.length,col4:event.target.url});
				label1.text=playlist.length.toString();
				event.target.close();
			}
onClick wird erstmal ausgeführt, wenn ich auf einen weiteren Button klicke (nur zu Testzwecken)

Geändert von mrgrimmig (27-08-2010 um 15:49 Uhr)
mrgrimmig ist offline   Mit Zitat antworten
Alt 27-08-2010, 17:31   #11 (permalink)
Neuer User
 
Registriert seit: Dec 2005
Ort: Oldenburg
Beiträge: 2.271
Hab jetzt nicht alles durchgelesen, aber wie wäre es denn mit einer for each schleife?

For each file (vom Typ mp3) usw... ?
__________________
Mein Blog
Freue mich über jeden Besucher. :)
Nico B. ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Ordner durchsuchen mit AS3 hoppe_burkhard ActionScript 3 3 09-11-2009 14:19
ordner durchsuchen und xml erstellen Quentin-B Flash mit XML und Webservices 5 28-01-2007 06:00
Ordner nach bestimmter Datei durchsuchen... inkvc17 PHP und MySQL 5 06-09-2006 18:33
textdatei in selben Ordner geht aber in anderem Ordner nicht.. illon PHP und MySQL 8 05-02-2004 17:23
Ordner auf fremdem Server durchsuchen? moneyman Flash und Datenbanken 3 15-05-2002 21:36


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:42 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele