2013-05-11 16 views
11

Próbuję usunąć tylko ostatnią część adresu URL, to jest adres URL FTP.Usuń ostatnią porcję NSURL: iOS

Załóżmy, że mam adres URL typu:>ftp://ftp.abc.com/public_html/somefolder/. Po usunięciu ostatniej części powinienem mieć ją jako: ftp://ftp.abc.com/public_html/.

Próbowałem użyć stringByDeletingLastPathComponenet i URLByDeletingLastPathComponent, ale nie usuwają one ostatniej części poprawnie. Zmieniają cały wygląd adresu URL.

na przykład, po użyciu powyższych metod, tutaj jest format adresu URL, który otrzymuję ftp: /ftp.abc.com/public_html/. Usuwa jeden "/" w "ftp: //", który powoduje awarię mojego programu.

Jak można usunąć tylko ostatnią część bez naruszania reszty adresu URL?

UPDATE:

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

Stosując powyższy kod, mam wyjścia jak: - ftp: /ftp.abc.com/public_html/

+1

'-stringByDeletingLastPathComponent' rzeczywiście skraplać żadnych podwójnych ukośników. Dokumentacja dla niego wyraźnie mówi, że jest przeznaczona tylko dla ścieżek, a nie adresów URL! –

+1

'-URLByDeletingLastPathComponent' spełnia swoje zadanie właściwie. Jedyne, co mogę zobaczyć dla powyższego przykładu kodu, aby wypisać 'ftp:/ftp.abc.com/public_html /', to jeśli dane wejściowe były w podobny sposób zniekształcone jak coś 'ftp:/ftp.abc.com/public_html/somefolder /' –

+1

Szybka obserwacja: w systemie OS X 10.6 (i prawdopodobnie iOS 4) '-URLByDeletingLastPathComponent' powoduje podwójne ukośniki w części ścieżki. Próba usunięcia takiego komponentu prowadzi do dodawania '../' zamiast niego –

Odpowiedz

2

Teraz spróbuj

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

To rzeczywiście działa, ale URL może być dowolny, Co jeśli jest to ftp://ftp.abc.com/public_html/somefolder/someOtherFolder/? Ta metoda nie zapewni prawidłowych wyników. – Shailesh

+0

ohhh .. Myślę, że URL jest naprawiony. po prostu poczekaj –

+0

zobacz moją zmienioną odpowiedź –

17

Hmm. URLByDeletingLastPathComponent działa idealnie, biorąc pod uwagę powyższe dane wejściowe.

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

powraca

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

Czy masz jakiś przykładowy kod, który przynosi nieprawidłowych wyników?

Max

+1

@ Max: Proszę sprawdzić aktualizację w moim pytaniu. – Shailesh

+1

Niestety, nie mogę zreplikować błędu, który masz. Czy jest możliwe, że dane wejściowe łańcucha są zniekształcone? – mxweas

+1

@Max: Nie jestem pewien, ale dostarczam dane wejściowe z TextFields. – Shailesh

1

Przykładem jak wydobyć ostatnią część bibliotece NSURL. W tym przypadku lokalizacja pliku. danych SQLite rdzeniowe

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]]; 

Ten kod zwraca mi nazwę pliku CoreAPI.sqlite