1

私は OX Cocoa アプリを作成しています。ボタンを押してアプリを使用してテキスト ファイルを読み書きできるようにしたいと考えています。これらのテキスト ファイルは /Library/Application Support/AppName に保存する必要がありますが、アプリでそこから何かを読み取ることができません。フォルダーに書き込むことはできますが、ファインダーにファイルが表示されていても、そこに書き込まれたものを読み取ることはできません。

これは、フォルダーへの正常な書き込みに使用しているコードです。

    NSString *text = editor.string;
    NSString *path = @"/Library/Application Support/";

    NSMutableString *mu = [[NSMutableString stringWithString:path] init];
    [mu insertString:FileName.stringValue atIndex:mu.length];
    [mu insertString:@".txt" atIndex:mu.length];

    path = [mu copy];
    [text writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:NULL];

テキストファイルから読み取るために使用している(そして失敗している)コードは次のとおりです。

    NSArray *path = [[NSBundle mainBundle] pathsForResourcesOfType:@"txt" inDirectory:@"/Library/Application Support/"];
    NSString *output = @"";

    NSMutableString *mu = [[NSMutableString stringWithString:output] init];

    for (int i = 0; i < [path count]; i++) {
        NSString *text = [NSString stringWithContentsOfFile:path[i] encoding:NSUTF8StringEncoding error:NULL];
        [mu insertString:text atIndex:mu.length];
        [mu insertString:@"\n" atIndex:mu.length];
    }

    [textView setString:mu];

私が修正できることに関するヒントは非常に役立ちます。ここで少し立ち往生しています。

編集:あなたの入力を使用して、コードを次のように更新しました:

    NSString *fileLocation = @"~/Library/Application Support/";
    NSArray *text = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:fileLocation error:nil];
    NSString *output = @"";
    NSMutableString *mu = [[NSMutableString stringWithString:output] init];

    for (int i = 0; i < [text count]; i++) {
        [mu insertString:text[i] atIndex:mu.length];
        [mu insertString:@"\n" atIndex:mu.length];
    }
    [textView setString:mu];

ただし、ファイルのテキストはまだ表示されません。

4

3 に答える 3

2

アプリをサンドボックス化すると、ほとんどのハードコーディングされたパスは失敗します。これを回避したり、このアプリをサンドボックス化する予定がない場合でも、それは抜け出す価値のある悪い習慣です.

さらに、あなたは本当にあなたが欲しいです/Library~/Library?前者は、多くの場合、ユーザーが書き込みできません。後者は、ユーザーのホーム ディレクトリ (またはサンドボックス化されている場合はコンテナー) にあります。

Application Support ディレクトリ、または Caches ディレクトリ、または何かを作成して後で取得する可能性のあるその他のディレクトリを取得するには、ファイル マネージャーに問い合わせてください

于 2013-02-15T14:53:22.857 に答える
1

/ Library /ApplicationSupportはバンドルに含まれていません。使用するパスは[[NSBundle mainBundle] pathsForResourcesOfType:…]、アプリケーション自体の内部にあるファイル(アプリのビルド時に含めた画像、サウンドなど)にアクセスする場合にのみ役立ちます。

[[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:error]アプリケーションの外部のディレクトリにあるファイルのリストを取得するために使用したいとします。

Matt Gallagherは、 CocoaWithLoveのアプリケーションサポートディレクトリへのパスを見つけるフォールトトレラントな方法の優れた例を示しています。/ Library /ApplicationSupportパスをハードコーディングするよりも使用することをお勧めします。

NSError *error = nil;
NSArray *text = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:fileLocation error:&error];
if (!text) {
    NSLog( @"Error reading contents of application support folder at %@.\n%@", applicationSupportFolder, [error userInfo] );
}
于 2013-02-14T21:39:49.817 に答える
0

アプリのメインバンドルからNSBundleを使用してパスを取得しようとしています。ただし、ファイルはバンドルに含まれていないため、パスを手動で指定する必要があります。パスをハードコーディングしたり、以前に書き込んだパスをどこかに保存したり、NSFileManagerを使用してディレクトリの内容を取得して分析したりできます。たとえば、-[NSFileManager contentsOfDirectoryAtPath:error:]

于 2013-02-14T21:41:01.413 に答える