1

我正在制作一个 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];

但是文件中的文本仍然没有出现。

4

3 回答 3

2

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

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

要获取 Application Support 目录,或 Caches 目录,或任何其他您可能想要在其中创建内容并稍后从中检索它们的目录,请向文件管理器索取它

于 2013-02-15T14:53:22.857 回答
1

/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] );
}
于 2013-02-14T21:39:49.817 回答
0

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

于 2013-02-14T21:41:01.413 回答