使用[NSData writeToFile:]时给文件命名的正确方法

时间:2014-09-22 14:28:58

标签: ios cocoa nsdata writetofile

我正在使用该代码将下载的视频从互联网保存到应用程序文档文件夹:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *save_it = [documentsDirectory stringByAppendingPathComponent:video_filename];


NSError *error;
BOOL success = [fileData writeToFile:save_it options:0 error:&error];
if (!success) {
    NSLog(@"writeToFile failed with error %@", error);
}

它可以工作,但是如果video_filename中有一个斜杠“/”,它会因为斜杠而中断目录分隔符,我知道。

例如,当video_filename为:Best Video / Best Song Ever.3gpp时,日志说:

{NSFilePath=/Users/Apple/Library/Developer/CoreSimulator/Devices/5A7D36F5-6EDB-495D-9E8E-B9EB22E5357C/data/Containers/Data/Application/B1D0AC48-D84C-4A0D-9F09-08BF4C45DD32/Documents/Best Video / Best Song Ever.3gpp, NSUnderlyingError=0x7d339430 "The operation couldn’t be completed. No such file or directory"}

我不知道是否还有其他特殊角色会崩溃,

那么从nsstring中清除这些特殊字符的最佳方法是什么?

我们可以在PHP中创建SEO友好的URL,我正在搜索这样的函数来执行此操作。

2 个答案:

答案 0 :(得分:0)

我在这里看到的第一个问题是你的文件路径包含一些空格。在您给出的示例中,video_filename变量的值为“Best Video / Best Song Ever.3gpp”,其中包含斜杠周围的空格。您首先必须删除空格,这可能有助于您这样做:

NSArray *components = [video_filename componentsSeparatedByString:@"/"];

for (NSInteger i = 0, i < components.count, ++i) {
    NSString *string = components[i];
    string = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
    components[i] = string;
}

NSString *path = [components componentsJoinedByString:@"/"];

如果我理解正确,您的video_filename可能是xxx.3gpp或yyy / xxx.3gpp。如果是yyyy / xxxx.3gpp的格式,首先必须创建一个名为yyyy的目录,然后将该文件保存到该目录。 这可能有助于您做到这一点:

- (void)createDirectory:(NSString *)directoryName
             atFilePath:(NSString *)filePath
{
    NSString *filePathAndDir = [filePath
                                stringByAppendingPathComponent:directoryName];
    NSError *error;

    if (![[NSFileManager defaultManager] createDirectoryAtPath:filePathAndDir
                                   withIntermediateDirectories:NO
                                                    attributes:nil
                                                         error:&error]) {
        NSLog(@"Create directory error: %@", error);
    }
}

以及你使用它的方式是

[self createDirectory:components[0] atFilePath:documentsDirectory];

希望这有帮助!

答案 1 :(得分:0)

因此,如果您的文件名实际上是#34; Best Video / Best Song Ever.3gpp&#34;对不起,我想起来并不容易。

现在,如果Best Video是您要保存文件的文件夹,则可以使用:

+(NSString*) getPathToFolder:(NSString*) folderName {
    NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    NSString *folderPath = [documentsPath stringByAppendingPathComponent:folderName];

    NSFileManager *fileManager = [NSFileManager defaultManager];
    if (![fileManager fileExistsAtPath:folderPath]) {
        NSLog(@"Creating a new folder at\n%@", folderPath) ;
        [fileManager createDirectoryAtPath:folderPath withIntermediateDirectories:NO attributes:nil error:nil];
    }
    return folderPath ;
}

这将检查您的文件夹是否存在,如果它不存在则会创建它。 它将返回您要用于保存文件的路径。

现在关于文件的命名,使用空格是非常不可取的,我建议使用:

NSString* pathWITHSpaces ;
NSString* pathWithoutSpaces = [pathWITHSpaces stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

希望这有点帮助