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!
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!
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.