3

アプリ ライブラリ ディレクトリ内のサブディレクトリにファイルを作成しようとしています。まず、次のようにライブラリへのパスを取得しています。

- (NSURL*) getLibraryDirectory
{
    NSFileManager* manager = [NSFileManager defaultManager];
    NSArray* paths = [manager URLsForDirectory:NSLibraryDirectory inDomains:NSUserDomainMask];

    if ([paths count] > 0)
    {
        return [paths objectAtIndex:0];
    }
    return nil;
}

次に、次のコードを使用してサブフォルダーを作成します。

- (NSURL*) getDirectory:(NSString*)subdirName
{
    NSFileManager* sharedFM = [NSFileManager defaultManager];
    NSURL* libraryDirectory = [self getLibraryDirectory];

    if (libraryDirectory)
    {
        NSURL* subdir = [libraryDirectory URLByAppendingPathComponent:subdirName isDirectory:YES];
        if (![sharedFM fileExistsAtPath:[subdir absoluteString] isDirectory:YES])
        {
            NSError* error;
            if ([sharedFM createDirectoryAtURL:subdir withIntermediateDirectories:YES attributes:nil error:&error])
            {
                return subdir;
            } 
            else 
            {
                NSLog(@"Error occured while trying to create subdirectory \"%@\". Code - %d, desc - %@", subdirName, [error code], [error localizedDescription]);
            }
        }
    }
    return nil;
}

そして最後に、このフォルダーに次のようなファイルを作成しようとしています:

NSString* filePath = [[self getDirectory:DIR_COMMANDS] absoluteString];
if (filePath)
{
    filePath = [filePath stringByAppendingPathComponent:@"test_file.tst"];       

    NSFileManager* manager = [NSFileManager defaultManager];
    if ([manager createFileAtPath:filePath contents:[[NSData alloc] initWithBytes:[[@"string" dataUsingEncoding:NSUTF16LittleEndianStringEncoding] bytes] length:12] attributes:nil])
    {
        NSLog(@"YES");
    }
    else
    {
        NSLog(@"NO");
    }
}

しかし残念なことに、私は毎回「NO」を受け取り、その理由を理解できません。

4

1 に答える 1

6

ファイル URL からパスを取得するpathには、absoluteString.

NSString *filePath = [[self getDirectory:DIR_COMMANDS] path];

補足:libraryDirectoryの代わりにCocoa のメソッドの命名スタイルを採用する必要がgetLibraryDirectoryありますlibraryDirectoryURL。プレフィックスは、get戻り値が参照によって渡される場合にのみ使用されます。

また: の使用法fileExistsAtPath:isDirectory:が正しくありません。BOOLパラメータは参照によって渡されます。

BOOL isDir;
if ([sharedFM fileExistsAtPath:[subdir path] isDirectory:&isDir]) {
    if (! isDir) {
        NSLog(@"There's a plain file at my path");
        return nil;
    }
}
于 2013-02-28T18:07:58.453 に答える