2013-05-11 13 views
11

Ich versuche nur den letzten Teil der URL zu entfernen, ist es eine FTP-URL.Entfernen Sie den letzten Teil der NSURL: iOS

Angenommen, ich habe eine URL wie:>ftp://ftp.abc.com/public_html/somefolder/. Nach dem Entfernen der letzten Portion sollte ich es haben: ftp://ftp.abc.com/public_html/.

Ich habe versucht mit stringByDeletingLastPathComponenet und URLByDeletingLastPathComponent, aber sie entfernen nicht den letzten Teil korrekt. Sie ändern das gesamte Aussehen der URL.

zum Beispiel, nach der Verwendung der oben genannten Methoden, hier ist das URL-Format ich bekomme ftp: /ftp.abc.com/public_html/. Es entfernt ein "/" in "ftp: //", was mein Programm zum Absturz bringt.

Wie ist es möglich, nur den letzten Teil zu entfernen, ohne den Rest der URL zu stören?

UPDATE:

NSURL * stringUrl = [NSURL URLWithString:string]; 
NSURL * urlByRemovingLastComponent = [stringUrl URLByDeletingLastPathComponent]; 
NSLog(@"%@", urlByRemovingLastComponent); 

obigen Code verwenden, erhalte ich die Ausgabe als: - ftp: /ftp.abc.com/public_html/

+1

'-stringByDeletingLastPathComponent' wird in der Tat keine doppelte Schrägstriche kondensieren. Die Dokumentation dafür ruft ausdrücklich darauf hin, dass es nur für Pfade und nicht für URLs gedacht ist! –

+1

'-URLByDeletingLastPathComponent' erledigt seine Aufgabe jedoch richtig. Das einzige, das ich für das obige Codebeispiel sehen kann, um 'ftp:/ftp.abc.com/public_html /' auszugeben, ist, wenn die Eingabe in ähnlicher Weise falsch formatiert wurde, wie etwa 'ftp:/ftp.abc.com/public_html/somefolder/' –

+1

Kurzes Followup: Unter OS X 10.6 (und vermutlich iOS 4) tritt '-URLByDeletingLastPathComponent' auf und behandelt doppelte Schrägstriche im Pfadbereich. Der Versuch, eine solche Komponente zu entfernen, führt dazu, dass "../" stattdessen angefügt wird. –

Antwort

2

Jetzt

NSString* filePath = @"ftp://ftp.abc.com/public_html/somefolder/."; 

    NSArray* pathComponents = [filePath pathComponents]; 
    NSLog(@"\n\npath=%@",pathComponents); 
    if ([pathComponents count] > 2) { 
      NSArray* lastTwoArray = [pathComponents subarrayWithRange:NSMakeRange([pathComponents count]-2,2)]; 
      NSString* lastTwoPath = [NSString pathWithComponents:lastTwoArray]; 
      NSLog(@"\n\nlastTwoArray=%@",lastTwoPath); 

      NSArray *listItems = [filePath componentsSeparatedByString:lastTwoPath]; 
      NSLog(@"\n\nlist item 0=%@",[listItems objectAtIndex:0]); 

    } 


output 

path=(
     "ftp:", 
     "ftp.abc.com", 
     "public_html", 
     somefolder, 
     "." 
    ) 

lastTwoArray =somefolder/. 

list item 0 =ftp://ftp.abc.com/public_html/ 
+0

Das funktioniert zwar, aber die URL kann alles sein, Was ist, wenn es ftp://ftp.abc.com/public_html/somefolder/someOtherFolder/? Diese Methode liefert keine korrekten Ergebnisse. – Shailesh

+0

ohhh .. ich denke, URL ist behoben. warte einfach –

+0

sehe meine bearbeitete Antwort –

17

Hmm. URLByDeletingLastPathComponent funktioniert perfekt mit der obigen Eingabe.

NSURL *url = [NSURL URLWithString:@"ftp://ftp.abc.com/public_html/somefolder/"]; 
NSLog(@"%@", [url URLByDeletingLastPathComponent]); 

kehrt

ftp://ftp.abc.com/public_html/ 

Haben Sie einige Beispiel-Code haben, die falsche Ergebnisse zeitigt?

Max

+1

@Max: Bitte überprüfe das Update in meiner Frage. – Shailesh

+1

Leider kann ich den Fehler, den Sie haben, nicht replizieren. Ist es möglich, dass die String-Eingabe fehlerhaft ist? – mxweas

+1

@Max: Ich bin mir nicht sicher, aber ich gebe die Eingabe von TextFields. – Shailesh

1

Ein Beispiel versuchen, wie der letzte Teil von NSURL zu extrahieren. In diesem Fall den Speicherort der Datei. SQLite Kerndaten

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"CoreAPI.sqlite"]; 

NSString *localPath = [storeURL absoluteString]; 

NSArray* pathComponents = [localPath pathComponents]; 

NSLog(@"%@",[pathComponents objectAtIndex:6]); 

NSString * nombre = [NSString stringWithFormat:@"%@", [pathComponents objectAtIndex:6]]; 

Dieser Code gibt mir den Namen der Datei CoreAPI.sqlite