function to get the file name of an URL

Iphone

Iphone Problem Overview


I have some source code to get the file name of an url

for example:

http://www.google.com/a.pdf

I hope to get a.pdf

because the way to join 2 NSStrings I can get is 'appendString' which only for adding a string at right side, so I planned to check each char one by one from the right side of string 'http://www.google.com/a.pdf';, when it reach at the char '/', stop the checking, return string fdp.a , after that I change fdp.a to a.pdf

source codes are below

-(NSMutableString *) getSubStringAfterH :  originalString:(NSString *)s0 
{
	NSInteger i,l;
	l=[s0 length];
	NSMutableString *h=[[NSMutableString alloc] init];
	
    NSMutableString *ttt=[[NSMutableString alloc] init  ];
	 for(i=l-1;i>=0;i--) //check each char one by one from the right side of string 'http://www.google.com/a.pdf', when it reach at the char '/', stop
	{
	 	ttt=[s0 substringWithRange:NSMakeRange(i, 1)];
		 if([ttt isEqualToString:@"/"]) 
		{ 
			break;
		}
 	        else
		{
			 [h appendString:ttt];
		} 
     }
	 [ttt release];
     NSMutableString *h1=[[[NSMutableString alloc] initWithFormat:@""] autorelease];
    
    for (i=[h length]-1;i>=0;i--)
    {
	        NSMutableString *t1=[[NSMutableString alloc] init ];
    	t1=[h substringWithRange:NSMakeRange(i, 1)];
    	[h1 appendString:t1];
	        [t1 release];
    } 
	[h release];
	return h1;
}

h1 can reuturn the coorect string a.pdf, but if it returns to the codes where it was called, after a while system reports 'double free *** set a breakpoint in malloc_error_break to debug'

I checked a long time and foudn that if I removed the code

ttt=[s0 substringWithRange:NSMakeRange(i, 1)];

everything will be Ok (of course getSubStringAfterH can not returns the corrent result I expected.), no error reported.

I try to fix the bug a few hours, but still no clue.

Welcome any comment

Thanks interdev

Iphone Solutions


Solution 1 - Iphone

The following line does the job if url is a NSString:

NSString *filename = [url lastPathComponent];

If url is a NSURL, then the following does the job:

NSString *filename = [[url path] lastPathComponent];

Solution 2 - Iphone

Try this:

Edit: from blow comment

NSString *url = @"http://www.google.com/a.pdf";
NSArray *parts = [url componentsSeparatedByString:@"/"];
NSString *filename = [parts lastObject];

Solution 3 - Iphone

I think if you have already had the NSURL object, there is lastPathComponent method available from the iOS 4 onwards.

NSURL *url = [NSURL URLWithString:@"http://www.google.com/a.pdf"];
NSString *filename = [url lastPathComponent];

Solution 4 - Iphone

Swift 3

Let's say that your url is http://www.google.com/a.pdf

    let filename = url.lastPathComponent
    
    \\filename = "a.pdf"

Solution 5 - Iphone

This is more error free and meant for getting the localized name in the URL.

NSString *localizedName = nil;
[url getResourceValue:&localizedName forKey:NSURLLocalizedNameKey error:NULL];

Solution 6 - Iphone

I haven't tried this yet, but it seems like you might be trying to do this the hard way. The iPhone libraries have the NSURL class, and I imagine that you could simply do:

NSString *url = [NSURL URLWithString:@"http://www.google.com/a.pdf"];
NSString *path = [url path];

Definitely look for a built in function. The libraries have far more testing and will handle the edge cases better than anything you or I will write in an hour or two (generally speaking).

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionarachideView Question on Stackoverflow
Solution 1 - IphoneatttView Answer on Stackoverflow
Solution 2 - Iphoneuser121301View Answer on Stackoverflow
Solution 3 - IphoneRpranataView Answer on Stackoverflow
Solution 4 - IphoneChannelView Answer on Stackoverflow
Solution 5 - IphoneejpsView Answer on Stackoverflow
Solution 6 - IphonemarccView Answer on Stackoverflow