Как сделать путь NSString (имя файла) безопасным
Я использую очень сложные методы борьбы:), чтобы сделать строку вроде Fi?le*/ Name
безопасной для использования в качестве имени файла, например File_Name
.
Я уверен, что существует способ преобразования cocoa. И я уверен, что лучше всего спросить здесь:)
Спасибо!
Ответы
Ответ 1
Если вы явно не запускаете оболочку или неявно запускаете оболочку с помощью функции, такой как popen
или system
, нет причин скрывать что-либо, кроме разделителя пути.
Возможно, вы также захотите, чтобы имя файла начиналось с полной остановки (что могло бы заставить Finder скрыть файл), и, вероятно, также должно обеспечить, чтобы оно не было пустым и было меньше, чем NAME_MAX
characters * long.
* syslimits.h
указывает байты, но если вы перейдете через диспетчер файлов, это символы. Я не уверен, что подходит для Cocoa.
Ответ 2
Это приведет к удалению всех недопустимых символов в любом месте имени файла на основе неправильного набора символов Ismail (я не проверял, насколько полный его набор).
- (NSString *)_sanitizeFileNameString:(NSString *)fileName {
NSCharacterSet* illegalFileNameCharacters = [NSCharacterSet characterSetWithCharactersInString:@"/\\?%*|\"<>"];
return [[fileName componentsSeparatedByCharactersInSet:illegalFileNameCharacters] componentsJoinedByString:@""];
}
Кредит принадлежит Peter N Lewis за идею использования компонентовSeparatedByCharactersInSet:
NSString - Преобразование только в чистый алфавит (например, удаление акцентов + пунктуация)
Ответ 3
NSURL *fileURL = [NSURL fileURLWithPath:yourFilePath isDirectory:NO];
if (fileURL) {
NSError *error;
fileURL = [NSURL URLByResolvingAliasFileAtURL:fileURL options:(NSURLBookmarkResolutionWithoutUI | NSURLBookmarkResolutionWithoutMounting) error:&error];
}
Перед переносом:
/Пользователи/XXX/Desktop/~! @# $% ^ & *() _ + `- = {} |" < > ? [] \; ',.: {} < > : ^.png
После переноса:
Файл:///Пользователи/джонни/Desktop/~ @% 23 $% 25% 5E & *() _ +% 60 - =% 7B% 7D% 7C% 22% 3C% 3E% 3F% 5B % 5D% 5C% 3B".,: %20 %20% 7B% 7D% 3C% 3E% 5C:% 5E %20.png
Ответ 4
И, конечно, должен быть быстрый парень с произвольным
список ненависти (украденный из других ответов). Этот парень мне:
func sanitizedString(string : String) -> String {
// put anything you dislike in that set ;-)
let invalidFsChars = NSCharacterSet(charactersInString: "/* <>?%|")
let components = string.componentsSeparatedByCharactersInSet(invalidFsChars)
return components.joinWithSeparator("")
}
Ответ 5
Я повторил на ответ johnboiles, преобразовывая в Swift и записывая его как расширение:
extension String {
var stringForFilePath: String {
// characterSet contains all illegal characters on OS X and Windows
let characterSet = NSCharacterSet(charactersInString: "\"\\/?<>:*|")
// replace "-" with character of choice
return componentsSeparatedByCharactersInSet(characterSet).joinWithSeparator("-")
}
}
Недопустимый набор символов, на который ссылается здесь.
Ответ 6
Решение в Swift 4
extension String {
var sanitizedFileName: String {
return components(separatedBy: .init(charactersIn: "/\:\?%*|\"<>")).joined()
}
}
Использование:
"https://myurl.com".sanitizedFileName // = httpsmyurl.com
Ответ 7
Согласно википедии, наиболее распространенными символами, которые должны быть исключены из имен файлов, являются:
/\% * | "<? >
http://en.wikipedia.org/wiki/Filename
Учитывая это, и поскольку операция инвертированного набора в альтернативном решении может быть интенсивной, для меня ниже подход более чистый:
NSCharacterSet *invalidFsChars = [NSCharacterSet characterSetWithCharactersInString:@"/\\?%*|\"<>"];
NSString *scrubbed = [originalStr stringByTrimmingCharactersInSet:invalidFsChars];
Таким образом, вы все равно можете разрешать имена файлов с тире и т.д.