web-dev-qa-db-ja.com

Objective-Cにディレクトリが存在するかどうかを確認する方法

これは初心者の問題だと思いますが、iPhoneのドキュメントフォルダにディレクトリが存在するかどうかを確認しようとしました。ドキュメントを読んで、残念ながら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...");

        }

    }

}
27
n.evermind

このメソッドシグネチャの documentation を見てください。

- (BOOL)fileExistsAtPath:(NSString *)path isDirectory:(BOOL *)isDirectory

BOOL自体ではなく、引数としてBOOL varへのポインターが必要です。 NSFileManagerは、ファイルがディレクトリかどうかをその変数に記録します。例えば:

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

誰かがゲッターを必要とする場合に備えて、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;
}
10
wzbozon

このような用途に使用するユーティリティシングルトンクラスがあります。 Documentsに残っているとデータベースを更新できないため、このコードを使用して.sqliteファイルをDocumentsから/ Library/Private Documentsにコピーします。最初の方法はライブラリを見つけます。 2番目は、プライベートドキュメントフォルダーが存在しない場合はそれを作成し、場所を文字列として返します。 2番目の方法は、@ 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];
2
JScarry