Я использую следующий код для преобразования произвольной строки в правильное имя файла. Он следует правилам (если не тем же), что и при создании файла webloc при перетаскивании URL-адреса на рабочий стол.
// Returns a sting representing this filename transformed (if neccesary) to make
// a valid (Mac OS X) filename.
- (NSString *) stringByMakingFileNameValid:(NSString *)fileName
{
NSMutableString * validFileName = [NSMutableString stringWithString:fileName];
if (!validFileName || [validFileName isEqualToString:@""]) {
return @"untitled";
}
// remove initial period chars "."
if ([validFileName hasPrefix:@"."]) {
NSRange dotRange = [validFileName rangeOfCharacterFromSet:[NSCharacterSet characterSetWithCharactersInString:@"."]];
[validFileName deleteCharactersInRange:dotRange];
}
// remove any colon chars ":" (same as webloc creation behaviour)
[validFileName replaceOccurrencesOfString:@":" withString:@"" options:0 range:NSMakeRange(0, [validFileName length])];
// this may lead to spaces at either end which need trimming
validFileName = [[[validFileName stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] mutableCopy] autorelease];
// if there is nothing left return default value
if ([validFileName isEqualToString:@""]) {
return @"untitled";
}
// replace other disallowed Mac OS X characters
[validFileName replaceOccurrencesOfString:@"/" withString:@"-" options:0 range:NSMakeRange(0, [validFileName length])];
// if grater than 102 chars reduce to 101 and add elipses
if ([validFileName length] > 102) {
[validFileName deleteCharactersInRange:NSMakeRange(100, [validFileName length]-100)];
[validFileName appendString:@"…"];
}
return [[validFileName copy] autorelease];
}
На уровне Дарвина символы "/" хранятся как символы ":" (и наоборот). Они удалены здесь по косметическим причинам.