Array mit filenamen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Array mit filenamen

    Folks, wie ihr seht, bin ich bˆs am Anfang meiner ObjC-Karriere.

    Hier die Frage:

    wie f¸lle ich einen NSArray mit Filenamen eines bestimmten Ordners, z.B. des Picture-Ordners, wobei ich bereits vorsortiert nur die JPG's drin haben will.

    Aus diesem Array will ich dann randomartig einen Path ausw‰hlen und das entsprechende Bild anzeigen.

    Besten Dank und Keep Codin'
    «Der Sommerserver fiel aus». Mirko Bonné, Hibiskus Code
  • RE: Array mit filenamen

    ich w¸rde es so versuchen:

    #import <Foundation/Foundation.h>
    #import <stdlib.h>
    #import <time.h>

    int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    NSString *path=@"/Users/.../Pictures";
    NSMutableArray* pictures=[[NSMutableArray alloc]init];
    NSFileManager* fileManager = [NSFileManager defaultManager];
    if([fileManager changeCurrentDirectoryPath:path]){
    {
    int i,n;
    NSArray * files= [fileManager directoryContentsAtPath:path];
    for(i=0,n=[files count];i<n;i++){
    NSString* filename=(NSString*)[files objectAtIndex:i];
    NSLog(@"%@",filename);
    NSString* temp=[filename uppercaseString];
    if([temp hasSuffix:@".JPG"])
    [pictures addObject:filename];
    }
    }
    }else NSLog(@"Invalid path : %@",path);
    if([pictures count] >0){
    time_t tim;
    int index;
    srand(time(&tim));
    index=rand()%[pictures count];
    NSString* randomImage=[pictures objectAtIndex:index];
    NSLog(@"random image : %@",randomImage);
    }
    [pictures release];
    [pool release];
    return 0;
    }

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von snowman ()

  • RE: Array mit filenamen

    Geht doch nichts ¸ber ein ausf¸hrliches Beispiel :)

    Da ich selber gerne auch solche Schnipsel benutze, vielleicht hier noch ein Hinweis:

    der "harte" Vergleich mit der Endung ".JPG" ist ung¸nstig, da das "Standard" Filesystem HFS zwar nicht case sensitiv arbeitet, dafl UFS aber sehr wohl. Dies kann dazu f¸hren, dafl das Programm 1A auf HFS funktioniert, aber bei UFS plˆtzlich Probleme macht.

    Um das Problem zu vermeiden, sollte man selber die Endung abschneiden und diese dann mit den Mˆglichkeiten (.jpeg, jpg, usw.) mit NSCaseInsensitiveSearch vergleichen.
    Es gibt genau 10 Sorten von Menschen.
    Die eine kennt das binaere Zahlensystem, die andere nicht.
  • RE: Array mit filenamen

    um diesen Effekt einzud‰mmen, wird der Dateiname vorher in Grossbuchstaben umgewandelt.
    Diente ja auch nur als Diskussionsgrundlage ohne Anspruch auf Vollst‰ndigkeit.
    Dem Namen des 'Bilder'-Ordners kann man auch besser mit
    NSString *NSHomeDirectory(void) finden...
  • RE: Array mit filenamen

    Das uppercaseString habe ich ¸bersehen... ;)

    Konnte man den Source-Code nicht irgendwie so einf¸gen, dafl die Formatierung erhalten blieb? Ich finde die Funktion gerade nicht hier im Interface ?(
    Es gibt genau 10 Sorten von Menschen.
    Die eine kennt das binaere Zahlensystem, die andere nicht.
  • cool! erstmal vielen Dank f¸r den ausf¸hrlichen Hinweis; kann leider erst sp‰ter daran weitermachen.

    Aber rein theoretisch kann ich jetzt sowas einf¸gen wie

    picture = [NSImage alloc] initWithContentOfFile:randomImage]

    und das dann auf einen NSView leiten.

    bis sp‰ter

    AndrÈ
    «Der Sommerserver fiel aus». Mirko Bonné, Hibiskus Code
  • danke f¸r den DevCenter-Tip, sind interessante tutorials.

    Ich hab den Code in eine IBAction eingebaut, die mir jetzt die Zufallsbilder anzeigt. Jetzt muss ich nur noch eine Mˆglichkeit finden, dass der Array nur einmal gef¸llt wird und dann daraus zuf‰llig ausgew‰hlt wird. Sonst wird ja das ganze f¸r jeden Display wieder von vorne durchgerechnet. Krieg ich raus.

    bis bald, es wird nicht meine letzte Frage bleiben...

    AndrÈ
    «Der Sommerserver fiel aus». Mirko Bonné, Hibiskus Code
  • Hm, die Methode directoryContentsAtPath: der Klasse NSFileManager ist ja ganz schˆn, nur leider sind die Files anders sortiert als z.B. bei einem NSOpenPanel oder im Finder. :(
    Gibt es keine Mˆglichkeit, das NSArray entsprechend umzusortieren?

    Beispiel:
    NSOpenPanel und Finder zeigt die Files so an:

    Bild1
    Bild2
    Bild9
    Bild10
    Bild11

    und directoryContentsAtPath: liefert die Files in folgender Reihenfolge:

    Bild1
    Bild10
    Bild11
    Bild2
    Bild9

    Irgendwelche Tips?
  • Nope, funktioniert nicht. Da es sich um NSString Objekte handelt, ist die Sortierung:

    Bild1
    Bild10
    Bild11
    Bild2
    Bild9

    ja eigentlich auch korrekt. Ich h‰tte jedoch gerne die Sortierung die NSOpenPanel und der Finder verwendet. Da muss es doch bestimmt eine Methode in einem Framework geben, da MacOS X die andere Sortierung ja verwendet, aber wo?
  • Ich denke mal, da bleibt dir nur ¸brig, deine eigene zu schreiben. Diese andere Prozedur ist sehr aufwendig, da du herausfinden musst, was davon eine Kette ist und das dann nochmal sortieren musst.

    Ich w¸rde dir raten, entweder bei dieser einen zu bleiben oder mal in der Cocoa-Pro liste von CocoaDevCentral zu fragen. Wenn du willst, kann ich es auch tun. Musst es nur sagen.

    grufl
    MAX
  • M.A.X. hat es schon geschrieben: du brauchst eine eigene Sortierfunktion.

    Diese wird allerdings recht einfach, wenn du die evtl. auftretenden Spezialf‰lle ignorierst und einfach die LETZTE zusammenh‰nge Zahl vor dem ersten Punkt aus dem Namen extrahierst und beim Vergleich miteinbeziehst (diese entscheidet dann, wenn der Name bis zur Zahl gleich ist, ansonsten kann man ja den Standard compare nehmen).

    Das sind nur 3 Schritte:

    • schneide von links beginnend alles ab dem 1. Punkt ab (Gesamtname). Alles weitere betrachtet nur diesen Teil.

    • Suche die 1. Ziffer und nehme denTeil DAVOR als "Namen vor der Ziffer". Wenn beide Namen gleich sind, dann kannst nach Zifferstrings schauen (letzter Schritt) ansonsten kann man gleich direkt vergleichen.

    • Dann fuer alle Zeichen in Gesamtname:
      suche eine Ziffer 0-9
      sobald eine gefunden wird, baue eine Zahl mit dieser und evtl. nachfolgenden Ziffern auf
      sobald Keine Ziffer auftaucht ist die Zahl beendet und es wird bei der n‰chsten Ziffer wieder bei 0 begonnen


    Alternativ kann man auch nur die 1. Zahl nehmen, damit wird es noch etwas einfacher.
    Es gibt genau 10 Sorten von Menschen.
    Die eine kennt das binaere Zahlensystem, die andere nicht.
  • Hier w‰re aber wieder die Frage: Wenn du eine Filelist darstellen willst, dann kannst du entweder die Standard Prozedur nehmen oder die aus dem Finder komplett ¸bernehmen. Ansonsten verwundert es den User nur noch mehr und es geht voll nach hinten los. Ich kenne die Prozedur, die der Finder nimmt nicht, es kann auch sein, dass er nur so macht, wie mac_held es schon beschrieben hat, es kann aber auch sein, dass er eine sehr komplexe struktur verfolgt...

    grufl
    MAX
  • Hm, ich will die Files (Bilder) eigentlich nur logisch sortiert anzeigen. Da MacOS X diese logische Sortierung beherscht, wundert es mich nur, dafl man als Entwickler nicht auf diese Art der Sortierung zur¸ckgreifen kann. Naja, da werde ich mal im CocoaDevCentral nachfragen, ob die eine Lˆsung haben.

    Erst mal vielen Dank f¸r die Hilfe. Sollte es eine einfache Lˆsung geben, wovon ich ¸berzeugt bin, werde ich diese nat¸rlich hier posten.