NSURL fileURLWithPath enthält drei / ?!

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

  • NSURL fileURLWithPath enthält drei / ?!

    Hallo,

    ich speicere PDFs in folgendem Pfad:

    Quellcode

    1. ​NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    2. NSString *documentsDirectory = [paths objectAtIndex:0];
    3. NSString *filePath = [NSString stringWithFormat:@"%@/%@", documentsDirectory, [NSString stringWithFormat:@"%@.pdf", [dokument titel]]];


    Wenn ich dann später im WebView versuche diese zu laden, erstellt folgender code mir den unten stehenden Pfad:

    Quellcode

    1. ​[NSURL fileURLWithPath:meinPfad];


    Die entstandende URL:

    Quellcode

    1. ​file:///var/mobile/Containers/Data/Application/C8E8A974-A790-4375-921A-7F5F8D118D0A/Documents/Datei.pdf


    Müssen dort wirklich DREI / hinter file: ?!

    Das WebView zeigt keine PDF an. Und ja, das speichern hat funktioniert und die PDFs können auch geöffnet werden, wenn ich mir den "Container" der App über "Devices" lade..
    Man kann alles schaffen. Man muss es nur wollen ;)
    www.regetskcob.github.io
  • Ja, da müssen drei /// hinter file.

    Du hast einmal das Protokoll file
    Abgetrennt vom Rest mit ://
    Und dann den Rest. Dein Rest beginnt als absoluter Pfad mit dem Wurzelverzeichnis '/'

    Wie auch bei HTTP. Hier ist Rest aber ein 'relativer' Pfad…
    osxentwicklerforum.de/index.php/thread/29446

    Anyways. Du speicherst den absoluten Pfad ab. Ich halte das für keine gute Idee.
    Denn das Gestrüpp C8E8A974-A790-4375-921A-7F5F8D118D0A kann sich bei jedem Start der App ändern.
    Speicher lieber den relativen Pfad und bau ihn Dir zur Laufzeit zusammen.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • DanielBocksteger95 schrieb:

    Hallo,

    ich speicere PDFs in folgendem Pfad:

    Quellcode

    1. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    2. NSString *documentsDirectory = [paths objectAtIndex:0];
    3. NSString *filePath = [NSString stringWithFormat:@"%@/%@", documentsDirectory, [NSString stringWithFormat:@"%@.pdf", [dokument titel]]];

    Warum benutzt du nicht die Path-Methoden von NSString, um den Dateinamen anzuhängen?

    DanielBocksteger95 schrieb:

    Müssen dort wirklich DREI / hinter file: ?!

    Die drei '/' sind schon korrekt, weil da kein Hostname in der URL steht. Mit Hostnamen sähe die URL so aus:

    Quellcode

    1. ​file://localhost/var/mobile/Containers/Data/Application/C8E8A974-A790-4375-921A-7F5F8D118D0A/Documents/Datei.pdf

  • Ich kann mich Michael nur anschließen und kommentieren warum Du einen Pfad nicht korrekt mit den bereitgestellten Methoden zusammen baust.
    Dafür sind die Dinger da…

    Außerdem kann ich Dir gleich anraten, wenn Du am Ende eine NSURL benötigst auch gleich mit der Instanz zu arbeiten.
    Die Klasse bietet auch alles für Pfade und immer Methoden verwenden NSURL statt ein NSString als Pfad.

    Ausserdem kann das gelieferte Array leer sein und Du greifst einfach auf den Index 0 zu.
    Da habe ich Dir schon mal angeraten so etwas richtig zu prüfen, auch wenn es das Testprojekt ist ;)
    Sudeln und später zusammenkopierten bringt nur Fehler mit sich. Also gleich korrekt bauen und nicht so faul sein.

    Viele Grüße
  • Michael schrieb:

    DanielBocksteger95 schrieb:

    Hallo,

    ich speicere PDFs in folgendem Pfad:

    Quellcode

    1. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    2. NSString *documentsDirectory = [paths objectAtIndex:0];
    3. NSString *filePath = [NSString stringWithFormat:@"%@/%@", documentsDirectory, [NSString stringWithFormat:@"%@.pdf", [dokument titel]]];

    Warum benutzt du nicht die Path-Methoden von NSString, um den Dateinamen anzuhängen?

    DanielBocksteger95 schrieb:

    Müssen dort wirklich DREI / hinter file: ?!

    Die drei '/' sind schon korrekt, weil da kein Hostname in der URL steht. Mit Hostnamen sähe die URL so aus:

    Quellcode

    1. ​file://localhost/var/mobile/Containers/Data/Application/C8E8A974-A790-4375-921A-7F5F8D118D0A/Documents/Datei.pdf



    little_pixel schrieb:

    Ich kann mich Michael nur anschließen und kommentieren warum Du einen Pfad nicht korrekt mit den bereitgestellten Methoden zusammen baust.
    Dafür sind die Dinger da…

    Außerdem kann ich Dir gleich anraten, wenn Du am Ende eine NSURL benötigst auch gleich mit der Instanz zu arbeiten.
    Die Klasse bietet auch alles für Pfade und immer Methoden verwenden NSURL statt ein NSString als Pfad.

    Ausserdem kann das gelieferte Array leer sein und Du greifst einfach auf den Index 0 zu.
    Da habe ich Dir schon mal angeraten so etwas richtig zu prüfen, auch wenn es das Testprojekt ist ;)
    Sudeln und später zusammenkopierten bringt nur Fehler mit sich. Also gleich korrekt bauen und nicht so faul sein.

    Viele Grüße


    Hallo,

    hiermit klappt das laden nun, Überprüfung habe ich auch direkt aufgenommen.

    Quellcode

    1. ​NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    2. if ([paths count] > 0) {
    3. NSString *documentsDirectory = [paths objectAtIndex:0];
    4. NSURL *fileURL = [[[NSURL URLWithString:documentsDirectory] URLByAppendingPathComponent:[dokument titel]] URLByAppendingPathExtension:@"pdf"];
    5. return fileURL;
    6. }


    Die Arbeit mit Dateien ist mir unter Objective-C bis heute noch etwas suspekt, da ich normal halt äußerst wenig damit zu tun habe...

    Danke an alle.

    @Marco Feltmann: Wie genau funktioniert das mit den relativen Pfaden denn? Wie lassen die sich erstellen? und vor allen auch später verwenden?
    Man kann alles schaffen. Man muss es nur wollen ;)
    www.regetskcob.github.io
  • Marco Feltmann schrieb:

    Ja, da müssen drei /// hinter file.

    Du hast einmal das Protokoll file
    Abgetrennt vom Rest mit ://
    Und dann den Rest. Dein Rest beginnt als absoluter Pfad mit dem Wurzelverzeichnis '/'

    Wie auch bei HTTP. Hier ist Rest aber ein 'relativer' Pfad…
    osxentwicklerforum.de/index.php/thread/29446

    Anyways. Du speicherst den absoluten Pfad ab. Ich halte das für keine gute Idee.
    Denn das Gestrüpp C8E8A974-A790-4375-921A-7F5F8D118D0A kann sich bei jedem Start der App ändern.
    Speicher lieber den relativen Pfad und bau ihn Dir zur Laufzeit zusammen.

    Das Ergebnis ist zwar richtig, die Erläuterung jedoch nicht.

    Das Protokoll ist file. Es wird ausschließlich mit einem : abgetrennt. Das Schema lautet:

    file://<host>/<path>

    Also nix mit ///.

    // heißt, dass es sich um einen absoluten Pfad handelt. (Das ist bei file immer so.) Nach einem absolutem Pfad folgt der Hostname. Dann kann wieder ein Pfadtrenner (/) für einen Pfad auf dem Host folgen.

    file:///… heißt also:
    1. file-Protokoll wegen file:
    2. Absoluter Pfad wegen //
    3. Hostname
    4. Pfad auf dem Host

    Der Hostname ist also lediglich leer gelassen.

    Nach RFC1738, Section 3.10 bedeutet ein leerer Hostname "localhost". Da steht also "in Wahrheit":

    file://localhost/…
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?