Подтвердить что ты не робот

Как сделать путь NSString (имя файла) безопасным

Я использую очень сложные методы борьбы:), чтобы сделать строку вроде Fi?le*/ Name безопасной для использования в качестве имени файла, например File_Name. Я уверен, что существует способ преобразования cocoa. И я уверен, что лучше всего спросить здесь:)

Спасибо!

4b9b3361

Ответ 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];

Таким образом, вы все равно можете разрешать имена файлов с тире и т.д.