How to make an NSString path (file name) safe

Viewed 15859

I'm using very tricky fighting methods :) to make a string like Fi?le*/ Name safe for using as a file name like File_Name. I'm sure there is a cocoa way to convert it. And I'm sure the best place to ask is here :)

Thank you!

8 Answers

This will remove all invalid characters anywhere in the filename based on Ismail's invalid character set (I have not verified how complete his set is).

- (NSString *)_sanitizeFileNameString:(NSString *)fileName {
    NSCharacterSet* illegalFileNameCharacters = [NSCharacterSet characterSetWithCharactersInString:@"/\\?%*|\"<>"];
    return [[fileName componentsSeparatedByCharactersInSet:illegalFileNameCharacters] componentsJoinedByString:@""];
}

Credit goes to Peter N Lewis for the idea to use componentsSeparatedByCharactersInSet:
NSString - Convert to pure alphabet only (i.e. remove accents+punctuation)

Solution in Swift 4

extension String {
    var sanitizedFileName: String {
        return components(separatedBy: .init(charactersIn: "/\:\?%*|\"<>")).joined()
    }
}

Usage:

"https://myurl.com".sanitizedFileName // = httpsmyurl.com

I used jhones answer but improved for iOS. because ' causes paths to become invalid. and I removed . too just to avoid wired filetypes being generated.

Now if a file name contains "sam's" becomes it "sams", fixed the problem I was encountering

+ (NSString *)_sanitizeFileNameString:(NSString *)fileName {
    NSCharacterSet* illegalFileNameCharacters = [NSCharacterSet characterSetWithCharactersInString:@"/\\?%*|\"<'.>"];
    return [[fileName componentsSeparatedByCharactersInSet:illegalFileNameCharacters] componentsJoinedByString:@""];
}

According to wikipedia, the most common characters that should be excluded from filenames are:

/\?%*|"<>

http://en.wikipedia.org/wiki/Filename

Given that, and since the invertedSet operation in the alternate solution can be intensive, to me the below is a cleaner approach:

NSCharacterSet *invalidFsChars = [NSCharacterSet characterSetWithCharactersInString:@"/\\?%*|\"<>"];
NSString *scrubbed = [originalStr stringByTrimmingCharactersInSet:invalidFsChars];

This way you can still allow filenames that have dash, etc.

Related