簡體   English   中英

如何檢查Objective-C中是否存在目錄

[英]How to check if a directory exists in Objective-C

我想這是一個初學者的問題,但我試圖檢查iPhone上的Documents文件夾中是否存在目錄。 我閱讀了文檔並提出了這段代碼,遺憾的是,它在BOOL fileExists行中與EXC_BAD_ACCESS崩潰:

 -(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 var作為參數的指針,而不是BOOL本身。 NSFileManager將記錄該文件是否是該變量中的目錄。 例如:

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

萬一有人需要一個getter,如果它不存在,會在Documents中創建一個文件夾:

- (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;
}

我有一個Utility單例類,我用它來做這樣的事情。 由於我無法更新我的數據庫,如果它仍然在Documents中,我使用此代碼將我的.sqlite文件從Documents復制到/ Library / Private Documents。 第一種方法找到庫。 第二個創建私有文檔文件夾(如果它不存在)並將該位置作為字符串返回。 第二種方法使用@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];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM