Создание безопасного имени файла из NSString? - PullRequest
6 голосов
/ 10 августа 2011

Есть ли способ взять NSString и превратить его в безопасную версию, которую можно использовать в качестве имени файла для сохранения в папке пользовательских документов на iPhone.

В настоящее время я делаю что-то вроде этого:

NSString *inputString = @"This is sample text which may have funny chars and spaces in.";

NSInteger len = [inputString length];        
NSString *newFilename = [[inputString substringToIndex:MIN(20, len)] stringByAppendingPathExtension:@"txt"];

В настоящее время у меня остается что-то вроде:

This is sample text .txt

Необходимо убедиться, что символы, которые не разрешены в именах файлов и тоже удалены.

Ответы [ 3 ]

5 голосов
/ 10 августа 2011

У вас, вероятно, будет какое-то регулярное выражение или что-то в этом роде. Просто потому, что слишком опасно использовать except -фильтр (вы можете пропустить некоторые незаконные символы).

Для этого я рекомендую вам использовать RegexKitLite (http://regexkit.sourceforge.net/RegexKitLite/), в сочетании со следующей строкой кода:

inputString = [inputString stringByReplacingOccurencesOfRegex:@"([^A-Za-z0-9]*)" withString:@""];

Это заменит все символы, кроме A-Z, a-z и 0-9 =)!

3 голосов
/ 11 августа 2011

Вы также можете сделать это по старинке вместо использования регулярного выражения:

NSString* SanitizeFilename(NSString* filename)
{
    NSMutableString* stripped = [NSMutableString stringWithCapacity:filename.length];
    for (int t = 0; t < filename.length; ++t)
    {
        unichar c = [filename characterAtIndex:t];

        // Only allow a-z, A-Z, 0-9, space, -
        if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') 
        ||  (c >= '0' && c <= '9') || c == ' ' || c == '-')
            [stripped appendFormat:@"%c", c];
        else
            [stripped appendString:@"_"];
    }

    // No empty spaces at the beginning or end of the path name (also no dots
    // at the end); that messes up the Windows file system.
    return [stripped stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}
0 голосов
/ 25 февраля 2012

Если все, что вам действительно нужно, - это безопасное случайное имя файла, тогда просто используйте SecRandomCopyBytes до нужной длины и закодируйте его base64.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...