Iphone 如何检查Objective-C中是否存在目录

Iphone 如何检查Objective-C中是否存在目录,iphone,objective-c,cocoa-touch,nsfilemanager,Iphone,Objective C,Cocoa Touch,Nsfilemanager,我想这是一个初学者的问题,但我试图检查iPhone上我的文档文件夹中是否存在目录。我阅读了文档,得出了以下代码,不幸的是,在BOOL fileExists行中的EXC_BAD_访问崩溃了: -(void)checkIfDirectoryAlreadyExists:(NSString *)name { NSFileManager *fileManager = [[NSFileManager alloc] init]; NSString *path = [[self docume

我想这是一个初学者的问题,但我试图检查iPhone上我的文档文件夹中是否存在目录。我阅读了文档,得出了以下代码,不幸的是,在BOOL fileExists行中的EXC_BAD_访问崩溃了:

 -(void)checkIfDirectoryAlreadyExists:(NSString *)name
{
    NSFileManager *fileManager = [[NSFileManager alloc] init];

    NSString *path = [[self documentsDirectory] stringByAppendingPathComponent:name];

    BOOL fileExists = [fileManager fileExistsAtPath:path isDirectory:YES];

    if (fileExists)
    {
        NSLog(@"Folder already exists...");
    }

}
我不明白我做错了什么?在我看来这一切都很完美,而且它肯定符合文件的要求,不是吗?任何关于我错在哪里的消息都将受到高度赞赏!谢谢

更新:

仍然不工作

  -(void)checkIfDirectoryAlreadyExists:(NSString *)name
{
    NSFileManager *fileManager = [[NSFileManager alloc] init];

    NSString *path = [[self documentsDirectory] stringByAppendingPathComponent:name];

    BOOL isDir;
    BOOL fileExists = [fileManager fileExistsAtPath:path isDirectory:&isDir];

    if (fileExists)
    {


        if (isDir) {

            NSLog(@"Folder already exists...");

        }

    }

}
查看此方法签名的列表:

- (BOOL)fileExistsAtPath:(NSString *)path isDirectory:(BOOL *)isDirectory
您需要一个指向BOOL变量的指针作为参数,而不是BOOL本身。NSFileManager将记录文件是否为该变量中的目录。例如:

BOOL isDir;
BOOL exists = [fm fileExistsAtPath:path isDirectory:&isDir];
if (exists) {
    /* file exists */
    if (isDir) {
        /* file is a directory */
    }
 }

万一有人需要一个getter,它会在文档中创建一个文件夹,如果它不存在:

- (NSString *)folderPath
{
    if (! _folderPath) {
        NSString *folderName = @"YourFolderName";
        NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectoryPath = [documentPaths objectAtIndex:0];
        _folderPath = [documentsDirectoryPath stringByAppendingPathComponent:folderName];

        // if folder doesn't exist, create it
        NSError *error = nil;
        NSFileManager *fileManager = [NSFileManager defaultManager];
        BOOL isDir;
        if (! [fileManager fileExistsAtPath:_folderPath isDirectory:&isDir]) {
            BOOL success = [fileManager createDirectoryAtPath:_folderPath withIntermediateDirectories:NO attributes:nil error:&error];
            if (!success || error) {
                NSLog(@"Error: %@", [error localizedDescription]);
            }
            NSAssert(success, @"Failed to create folder at path:%@", _folderPath);
        }
    }

    return _folderPath;
}

我有一个实用的单例类,我用它来处理类似的事情。由于如果数据库仍保存在文档中,则无法更新它,因此我使用此代码将.sqlite文件从文档复制到/Library/Private文档。第一个方法查找库。第二种方法是创建不存在的私有文档文件夹,并以字符串形式返回位置。第二个方法使用的文件管理器方法与@wzboson使用的方法相同

+ (NSString *)applicationLibraryDirectory {

            return [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
}


+ (NSString *)applicationLibraryPrivateDocumentsDirectory {

    NSError *error;
    NSString *PrivateDocumentsDirectory = [[self applicationLibraryDirectory] stringByAppendingPathComponent:@"Private Documents"];

    BOOL isDir;
    if (! [[NSFileManager defaultManager] fileExistsAtPath:PrivateDocumentsDirectory isDirectory:&isDir]) {

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

    return PrivateDocumentsDirectory;
}
我在持久存储协调器初始化中这样使用它。但相同的原则适用于任何文件

NSString *libraryDirectory = [Utilities applicationLibraryPrivateDocumentsDirectory];
NSString *sourcePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:sqliteName];
NSString *destinationPath = [libraryDirectory stringByAppendingPathComponent:sqliteName];

@Legolas it根据文档检查它是否为目录。但我猜这就是我错的地方。第二个在什么意义上不起作用,还是一个坏的访问?还想从文档中指出:
注意:不建议尝试根据文件系统的当前状态或文件系统上的特定文件来判断行为。这样做可能会导致奇怪的行为或种族状况。尝试一项操作(如加载文件或创建目录)、检查错误并优雅地处理这些错误,要比提前判断操作是否会成功要好得多。
非常感谢。我认为苹果应该把你的例子放在他们的文档中——我不理解它们,但现在它们很清楚了——通过你的例子!再次感谢,非常感谢。事实上,我刚刚尝试实现了这一点,但它仍然使我的应用程序崩溃。我更新了上面的代码。有什么想法吗?谢谢你的帮助。@n.evermind:很高兴能帮忙。是的,示例很重要,但可能会占用太多空间:-)别担心,您最终会习惯于从文档中提取准确的信息。另外,请注意,苹果给出了一个涉及目录部分的示例。回到问题上来,我在这里看不到错误,除了创建文件管理器对象的异常方式(以前没有注意到)。您是否有任何特殊原因不使用
[NSFileManager defaultManager]
?这可能会给你省去一些麻烦。@n.无论如何,它应该能用。尝试在
BOOL isDir之前放置一个断点行,程序停止后,在调试器中键入
po path
。它打印的值正确吗?@sidyll很好,特别是在这种情况下,它可以防止内存泄漏。