0

我有这个代码,没关系。

NSString *pathName = [@"/Users/" stringByAppendingString:NSUserName()];
        pathName = [pathName stringByAppendingString:@"/Library/Application Support/AddressBook/Configuration.plist"];
        [[NSFileManager defaultManager] removeItemAtPath:pathName error:nil];

我想使用这个目录,但是有一个带有cbk4yc7r.default的文件夹。cbk4yc7r 为每个用户更改。如何修改代码以使用此目录?

"/Library/Application Support/Firefox/Profiles/cbk4yc7r.default/places.sqlite"

我尝试了“/Library/Application Support/Firefox/Profiles/*.default/places.sqlite”,但在objective-c中不起作用。

你能帮助我吗?谢谢

4

3 回答 3

0

假设您知道每个用户的 cbk4yc7r 是什么,您可以执行以下操作:

 [NSString stringWithFormat:@"/Library/Application Support/Firefox/Profiles/%@.default/places.sqlite", user.dirString];

其中user.dirstring是每个用户的 cbk4yc7r 等价物。

于 2012-02-29T10:09:27.977 回答
0

首先你应该使用

NSString *pathName = [@"~/Library/Application Support/Firefox/Profiles/" stringByExpandingTildeInPath];

要获得正确的父目录,其次该目录中的配置文件由 ~/Library/Application Support/Firefox/profiles.ini 文件定义,例如“Path=Profiles/cbk4yc7r.default”,因此您需要解析profiles.ini 或使用

[[NSFileManager defaultManager] contentsOfDirectoryAtPath:pathName error:&error];
于 2012-02-29T10:18:23.600 回答
0

最好的解决方案是使用一些 Firefox API(如果存在)来确定配置文件 ID。但我不太了解 Firefox 内部结构,不知道这是否可行。不过,我确实知道单个用户可以拥有多个配置文件,这是需要考虑的事情。

此外,您(坦率地说,还有其他响应者)对目录结构做出了很多不能保证成立的假设。您还假设一切正常,这当然不能保证磁盘操作。考虑到这些考虑,我提交了以下内容,它相当彻底地使用了 Foundation 提供的抽象。它还在适当的地方使用更现代的 NSURL:

    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *appDirErr;
    NSURL *appSupportDir = [fileManager URLForDirectory:NSApplicationSupportDirectory
                                               inDomain:NSUserDomainMask
                                      appropriateForURL:nil
                                                 create:NO
                                                  error:&appDirErr];

    if (appSupportDir) {
        NSURL *firefoxDir = [appSupportDir URLByAppendingPathComponent:@"Firefox/Profiles"
                                                           isDirectory:YES];
        NSError *profileErr;
        NSArray *profileURLs = [fileManager contentsOfDirectoryAtURL:firefoxDir
                                          includingPropertiesForKeys:nil
                                                             options:0
                                                               error:&profileErr];
        if (profileURLs) {
            for (NSURL *currentProfileURL in profileURLs) {
                NSURL *removalURL = [currentProfileURL URLByAppendingPathComponent:@"places.sqlite"
                                                                       isDirectory:NO];
                NSError *removalErr;
                if (! [fileManager removeItemAtURL:removalURL error:&removalErr]) {
                    NSLog(@"Error! %@", [removalErr localizedDescription]);
                }

            }
        }
        else {
            NSLog(@"Error! %@", [profileErr localizedDescription]);
        }
    }
    else {
        NSLog(@"Error! %@", [appDirErr localizedDescription]);
    }
于 2012-02-29T10:29:49.017 回答