【问题标题】:Proper way to giving name to file when [NSData writeToFile:] used使用 [NSData writeToFile:] 时为文件命名的正确方法
【发布时间】:2014-11-16 13:34:49
【问题描述】:

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

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 友好的网址,我正在搜索类似的函数来执行此操作。

【问题讨论】:

  • 你考虑过阅读 NSString 的文档吗?
  • 请给我那个完全符合我要求的文档:)

标签: ios cocoa nsdata writetofile


【解决方案1】:

我在这里看到的第一个问题是您的文件路径包含一些空格。在您给出的示例中,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];

希望这会有所帮助!

【讨论】:

  • 我认为在将 NSData 保存到文件时没有必要删除空格。我不想创建任何文件夹,你误会我了,“Best Video / Best Song Ever.3gpp”必须成为“Best Video Best Song Ever.3gpp”,并且必须从其他特殊字符(如果存在)中清除。例如,当视频名称由日文字符组成时,保存时不会出现错误,但我想知道是否还有其他特殊字符我必须考虑。
  • @woheras 哦,对不起,你可能想检查这个答案然后stackoverflow.com/a/18526106/568529
【解决方案2】:

因此,如果您的文件名实际上是“Best Video / Best Song Ever.3gpp”,我很抱歉,但没有什么容易想到的。

现在,如果 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]];

希望对你有所帮助

【讨论】:

  • 不,最佳视频不是文件夹,“Best Video / Best Song Ever.3gpp”必须变为“Best Video Best Song Ever.3gpp”。我可以通过删除我知道的斜杠来做到这一点,但我想知道是否还有其他我必须关心的特殊字符?
猜你喜欢
  • 2016-04-18
  • 2012-04-29
  • 2012-05-18
  • 2011-09-21
  • 2011-11-06
  • 2011-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多