如何阅读/ Library / Application Support /文件夹?

时间:2013-02-14 21:08:47

标签: xcode macos cocoa readfile

我正在制作一个OX Cocoa应用程序,我希望能够在按下按钮时使用应用程序读取和写入文本文件。这些文本文件应保存在/ Library / Application Support / AppName中,但我无法让我的应用程序从那里读取任何内容。它可以写入文件夹,但不能读取它在那里写的内容,即使我可以在finder中看到该文件。

这是我使用成功写入文件夹的代码。

    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];

然而,文件中的文字仍然没有出现。

3 个答案:

答案 0 :(得分:1)

当您对应用进行沙盒处理时,大多数硬编码路径都会失败。即使你逃脱这个,或者你不打算沙盒这个应用程序,这是一个值得离开的坏习惯。

此外,您确定要/Library而不是~/Library吗?前者通常不是用户可写的。后者位于用户的主目录(或沙箱中的容器)。

获取应用程序支持目录,Caches目录或您可能想要创建内容的任何其他目录,然后从ask a file manager for it中获取它们。

答案 1 :(得分:0)

/ Library / Application Support不在您的捆绑包中。使用[[NSBundle mainBundle] pathsForResourcesOfType:…]获得的路径仅对访问应用程序内部的文件(构建应用程序时包含的图像,声音等)非常有用。

您希望使用[[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:error]来获取应用程序之外的目录中的文件列表。

Matt Gallagher有一个很好的例子,可以在Cocoa With Love找到应用程序支持目录路径的容错方法。我建议通过硬编码/ Library / Application Support路径来使用它。

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] );
}

答案 2 :(得分:0)

您正试图从应用程序的主要捆绑包中使用NSBundle获取路径。但是文件不在包中,您应该手动指定路径。您可以对路径进行硬编码,将先前写入的路径存储在某处,或使用NSFileManager获取目录内容并对其进行分析。例如,-[NSFileManager contentsOfDirectoryAtPath:error:]