如何在iOS上创建一个目录?

29

好的,

我有一个需要更新的Cydia应用程序。我知道Cydia应用程序没有文档文件夹,所以你需要创建一个。以下是我在iOS 4中创建它的方法(在iOS 5上不起作用):

mkdir("/var/mobile/Library/APPNAME", 0755);
mkdir("/var/mobile/Library/APPNAME/Documents", 0755);

NSString *foofile = @"/var/mobile/Library/APPNAME/Documents/database.db";
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:foofile];

if (fileExists == TRUE) {
    NSLog(@"already exists");
} else {
    NSLog(@"doesn't exists");
    NSFileManager *fileManager = [[NSFileManager defaultManager]autorelease];
    NSError *error;
    NSString *documentDBFolderPath = @"/var/mobile/Library/APPNAME/Documents/database.db";

    NSString *resourceDBFolderPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"database.db"];
    [fileManager copyItemAtPath:resourceDBFolderPath toPath:documentDBFolderPath error:&error];

}

我还包含了将数据库文件复制到该文件夹的代码。但是这并不起作用(即使我通过SSH手动创建文件夹也不行)。
请帮忙!谢谢。

出了什么问题,或者我可以使用哪些其他代码来创建目录? - iosfreak
正确,哪里出了问题? 你没有告诉我们。 没有错误消息,没有故障描述。 - Hot Licks
@Daniel R Hicks:什么都没有发生...在粘贴下面的代码后,我确实遇到了一个错误...创建目录错误:Error Domain=NSCocoaErrorDomain Code=513 "无法完成操作。(Cocoa error 513。)" UserInfo=0x1c2650 {NSFilePath=/var/mobile/Library/APPNAME, NSUnderlyingError=0x1c3520 "无法完成操作。未获授权"} - iosfreak
5个回答

63

这是我制作用于创建目录的方法

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

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

这是我得到的错误... 操作无法完成。操作不允许 - iosfreak
2
这可能是您正在寻找的内容:https://dev59.com/mlPTa4cB1Zd3GeqPhkX8 - syclonefx

5
尝试使用createDirectoryAtURL:withIntermediateDirectories:attributes:error:方法。 NSFileManager类参考文档
创建具有指定属性的目录。 参数 url - 指定要创建的目录的文件URL。如果想要指定相对路径,必须在创建相应的NSURL对象之前设置当前工作目录。此参数不能为空。 createIntermediates - 如果为YES,则该方法将在创建url中的目录时创建任何不存在的父目录。如果为NO,则如果任何一个中间父目录不存在,则该方法将失败。如果任何一个中间路径元素对应于文件而不是目录,则此方法也会失败。 attributes - 新目录和任何新创建的中间目录的文件属性。可以设置所有者和组编号、文件权限和修改日期。如果对此参数指定nil或省略特定值,则使用一个或多个默认值,如讨论所述。您可以在“常量”(第54页)部分列出的全局常量作为属性字典中的键。一些键,如NSFileHFSCreatorCode和NSFileHFSTypeCode,不适用于目录。 error - 输入时,指向错误对象的指针。如果发生错误,则将此指针设置为包含错误信息的实际错误对象。如果不想要错误信息,可以将此参数指定为nil。
返回值
如果成功创建目录或目录已存在,则返回YES;否则返回NO

似乎我用iPad回答有点慢...另一个答案看起来与这个差不多。 - chown

3

请查看NSFileManager的类参考。要创建文件夹,需要使用createDirectoryAtPath:withIntermediateDirectories:attributes:error:方法。


我尝试了一下,但没有文件夹被创建出来... 我认为那只适用于OSx系统,而不是iOS系统? - iosfreak
你有使用过 YES 作为 withIntermediateDirectories: 的参数吗? - Jef
NSFileManager *NSFm = [NSFileManager defaultManager]; [NSFm createDirectoryAtPath:@"/var/mobile/Library/APPNAME" withIntermediateDirectories:YES attributes:nil error:nil]; [NSFm createDirectoryAtPath:@"/var/mobile/Library/APPNAME/Documents" withIntermediateDirectories:YES attributes:nil error:nil]; 这是我使用的确切代码... - iosfreak
假设 /var/mobile/Library/ 存在,你不需要第一个调用,只需要第二个。你确定你有正确的写入权限吗?它返回什么错误? - Jef

1
在Swift中,如果存在或已创建,则返回true。
func ensureDirectoryExists(path:String) -> Bool {

    if !NSFileManager.defaultManager().fileExistsAtPath(path) {
        do {
            try NSFileManager.defaultManager().createDirectoryAtPath(path, withIntermediateDirectories: true, attributes: nil)
        } catch {
            print(error)
            return false
        }
    }
    return true
}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接