Ordner erstellen und als Package definieren

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

  • Ordner erstellen und als Package definieren

    Ich stehe gerade auf dem Schlauch. Und zwar möchte ich ein Verzeichnis erstellen und dieses als Paket definieren. Kann ich machen indem ich [<nsfilemanager> createDirectoryAtPath:withIntermediateDirectories:attributes:error:] benutze und dann im Finder SetFile -a B ordner ausführe, aber wie kann ich das im Code machen? Da gibt es eine UTI kUTTypePackage, aber wie weise ich die zu? Die möglichen Keys im attribute-dictionary scheinen mir nicht zu passen... das kann doch nicht so schwer sein, oder?
    Widgetschmie.de • Life is too short for gadgets
  • Ja, soll er aber auch machen wenn es keine solche App gibt.

    Das Grundproblem ist das, dass ich einen Ordner via iTunes auf iPhones schieben lassen will. Das geht aber nur mit Files oder eben Packages/Bundles, Ordner lässt iTunes nicht auf eine App laden. Meine Vorläufige Lösung ist, einfach die Endung .bundle zu verwenden, das klappt auch. :)
    Widgetschmie.de • Life is too short for gadgets
  • zerm schrieb:

    Ist das, was "SetFile" setzt nicht auch einfach diese eXtended Attributes (wie xattr)? Wenn dem so ist, musst Du doch nur herausfinden, welches Attribut das genau ist und eben das programmatisch setzen?

    Kenne ich bisher nicht müsste ich mir genauer anschauen.

    zerm schrieb:

    Ist das, was "SetFile" setzt nicht auch einfach diese eXtended Attributes (wie xattr)? Wenn dem so ist, musst Du doch nur herausfinden, welches Attribut das genau ist und eben das programmatisch setzen?

    Tobse001 schrieb:

    Nun die große Frage: Wie sieht das bei Windowsnutzern aus?
    Dort sind Bundles ja normalerweise als Verzeichnisse dargestellt, oder?

    Du hast Recht, daran hatte ich bisher nicht gedacht. Ach Mist, wie könnte man das wohl lösen? Gleich mal iTunes in Parallels installieren und testen...
    Widgetschmie.de • Life is too short for gadgets
  • Pascal schrieb:

    Kenne ich bisher nicht müsste ich mir genauer anschauen.

    War ja nur eine Vermutung. Kannst mal "xattr" im Terminal auf solche Bundles loslassen und nachschauen.
    Ich hatte hier irgendwo mal im Forum ein (eigenes..) Python-Skript gepostet, welches die xattrs ausliesst, find ich aber nicht. Das Skript hab ich jedenfalls noch hier: ioctl.eu/browser/hacks/python/xattr/xattr.py Darin ruf ich einfach die C-Funktionen, kann man also fast 1:1 in eine objc Anwendung übertragen.
    C++
  • Tobse001 schrieb:

    Wie wäre es mit Zip-Files bei denen du die Endung in was eigenes umbenennst?
    Dafür sollte sich doch sicher eine OpenSource Lösung finden die zu entpacken.

    Hatte ich zuerst so überlegt. Das Problem ist das "Bundle" ist ein sqlite-file von CoreData und dann einige Unterverzeichnisse mit Dateien, welche mit CoreData Einträgen assoziiert sind. Dieses Paket möchte ich von Gerät zu Gerät übertragen lassen. Mit ".bundle" klappt das auf OS X wunderbar, aber unter Windows lässt mich iTunes den Ordner nicht hochladen. :P

    Sieht so aus als müsste ich den ZIP-Weg gehen und jeweils ein Archiv der Daten unter ~/Documents bereit stellen.

    zerm schrieb:

    Pascal schrieb:

    Kenne ich bisher nicht müsste ich mir genauer anschauen.

    War ja nur eine Vermutung. Kannst mal "xattr" im Terminal auf solche Bundles loslassen und nachschauen.
    Ich hatte hier irgendwo mal im Forum ein (eigenes..) Python-Skript gepostet, welches die xattrs ausliesst, find ich aber nicht. Das Skript hab ich jedenfalls noch hier: ioctl.eu/browser/hacks/python/xattr/xattr.py Darin ruf ich einfach die C-Funktionen, kann man also fast 1:1 in eine objc Anwendung übertragen.

    Danke fürs Script, werd ich mir genauer ansehen. Die Dinger bewirken aber leider unter Windows nicht viel. Menno.
    Widgetschmie.de • Life is too short for gadgets

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Pascal ()

  • Pascal schrieb:

    Sieht so aus als müsste ich den ZIP-Weg gehen und jeweils ein Archiv der Daten unter ~/Documents bereit stellen.

    Ich glaub das war damals mit Quake so richtig aufgekommen, dass alle Dateien in einem *.pak zusammen liegen. Das waren sogar nur tar-archive, wenn ich mich recht erinnere. Wenn mich nicht alles täuscht, sollte es da einige fertige Lösungen geben, damit man direkt daraus auf Dateien zugreifen kann, quasi mit fopen("/path/to/archive.pak/inside/blubb.png"); Mit dem ganzen Obj-C-Schnickschnack kannst Du vielleicht einfach ein paar Categories einfügen, damit Du dann mit diesen *.pak (oder wie auch immer Du sie nennen möchtest) arbeiten kannst, als wären es normale Verzeichnisse.
    Wenn Du einfach wirklich tar-archive nimmst, sind die ja nicht gepackt und der Zugriff sollte ohne entpacken auch so verdammt schnell sein. Musst Du auch in diese "Bundles" schreiben? Dann wirds vielleicht etwas komplizierter...
    C++
  • zerm schrieb:

    Pascal schrieb:

    Sieht so aus als müsste ich den ZIP-Weg gehen und jeweils ein Archiv der Daten unter ~/Documents bereit stellen.

    Ich glaub das war damals mit Quake so richtig aufgekommen, dass alle Dateien in einem *.pak zusammen liegen. Das waren sogar nur tar-archive, wenn ich mich recht erinnere. Wenn mich nicht alles täuscht, sollte es da einige fertige Lösungen geben, damit man direkt daraus auf Dateien zugreifen kann, quasi mit fopen("/path/to/archive.pak/inside/blubb.png"); Mit dem ganzen Obj-C-Schnickschnack kannst Du vielleicht einfach ein paar Categories einfügen, damit Du dann mit diesen *.pak (oder wie auch immer Du sie nennen möchtest) arbeiten kannst, als wären es normale Verzeichnisse.
    Wenn Du einfach wirklich tar-archive nimmst, sind die ja nicht gepackt und der Zugriff sollte ohne entpacken auch so verdammt schnell sein. Musst Du auch in diese "Bundles" schreiben? Dann wirds vielleicht etwas komplizierter...

    Das ist ne sehr gute Idee, ich wollte gerade schauen ob man ZIP in TAR-Form benutzen kann (0% Komprimierung), aber TAR ist da natürlich erste Wahl. Nein, ich brauche keine Bundles, auf diese Idee bin ich nur gekommen weil ich keine Ordner hochladen kann.

    Schau ich mir an, vielen Dank! Und in Zukunft poste ich wohl doch wieder die ursprüngliche Frage, statt eine Frage zum Lösungsansatz. ;)
    Widgetschmie.de • Life is too short for gadgets
  • Hab grad selber mal geschaut, also TAR ist soo simpel, da kann man sogar selber schnell einen Reader basteln. Ansonsten hab ich diese fertige Lib gefunden: code.google.com/p/libarchive/ (BSD Lizenz, also auch für kommerzielle Anwendungen geeignet. Kann wohl auch on-the-fly Dateien hinzufügen etc?)

    Ich überlege grad, ob man die open/read/write syscalls in einer Anwendung einfach geschickt umverpacken kann, damit ein Zugriff auf solche Archive völlig transparent ablaufen kann. Das wäre ja mal was für ein neues kleines Projekt ;)
    C++
  • Das wäre in der Tat sehr interessant. Ich schätze aber das könnte in Verbindung mit CoreData etwas kompliziert werden.

    Ich hatte überlegt die DB und die Subdirectories in die Library zu legen und in ~/Documents davon eine ZIP Version zu spiegeln. Files mit zlib anhängen an ein ZIP geht ja und ohne Kompression wäre das vielleicht sogar genug schnell um das immer aktuell zu halten, wie gut man Files daraus löschen oder ersetzen kann muss ich mir mal ansehen. Ich überlege mir aber grade ob mir der Aufwand wert ist, eigentlich brauchen die Leute gar keinen Zugriff via iTunes auf die DB zu haben, Backups macht ja iTunes und so kann man auch auf neue Geräte migrieren. Ach Mist, die ".bundle" Lösung hat so gut ausgesehen... :)

    Edit
    Das Problem bei TAR ist noch, dass du keinen Index hast, sprich du musst immer von vorne durchgehen, wenn du ein File suchst.
    Widgetschmie.de • Life is too short for gadgets
  • Ernst gemeinter Ansatz: kleinen Webserver implementieren mit rudimentärer GUI, um soviele Dateien wie Du willst hochzuladen, hab ich dafür mal gemacht.
    Ja, ist etwas mehr Arbeit aber Du hast auch gleich eine Lösung für Linux-Nutzer (die iOS-Verbreitung in der Fraktion mal dahingestellt) und Du verschwendest nicht immer gleich einen Ladezyklus beim Anschließen des iPhones an den Rechner.
    if (!exit(-1)) fprintf(stderr, "exit call failed. Program will continue\n");
  • Das habe ich testweise sogar bereits gemacht, und ich habe soeben den Code so umgebaut dass die Datenbank in der Library landet. Stimmt schon, es lohnt sich eher, die Energie in den Server-Approach zu stecken und das richtig zu machen.

    Benutzt habe ich übrigens CocoaHTTPServer und dem ein neue Delegate-Methoden spendiert, um "virtuelle" URLs zu unterstützen und so CoreData-Daten zurück zu lieferen. Klappt wunderbar: bitbucket.org/p2/cocoahttpserver
    Widgetschmie.de • Life is too short for gadgets