5

以下のコードを試して、それらの場所の絶対パスを展開して、チルダと相対パスを使用すると失敗する NSFileManager でのアクションに使用できるかどうかを確認しています。

Objective-C の Xcode でコマンドライン アプリを作成しています。コマンド ラインからプログラムを実行すると、パスが展開されますが、Xcode のターゲットからは、$PROJECT_DIR と $HOME を使用してコマンド ライン引数の値を渡し、途中まで進みます。問題は、NSFilemanager で解決されない $PROJECT_DIR/.. に到達する必要があることです。

URLByResolvingSymlinksInPath または URLByStandardizingPath が期待どおりに機能していないようです。他にすべきことはありますか?

BOOL isDir = TRUE;
for (NSString *path in @[@"~/", @".", @".."]) {
    NSURL *url = [[[NSURL URLWithString:path] URLByResolvingSymlinksInPath] URLByStandardizingPath];
    DebugLog(@"path: %@", url.absoluteString);
    DebugLog(@"Exists: %@", [[NSFileManager defaultManager] fileExistsAtPath:url.path isDirectory:&isDir] ? @"YES" : @"NO");
}

更新: stdlib の realpath を使用してパスを解決し、次のメソッドを作成しましたが、この C 関数はわかりません。具体的には、解決された値が何であるか、またはそれをどのように使用するかはわかりません。期待される戻り値を取得することがわかります。

- (NSString *)resolvePath:(NSString *)path {
    NSString *expandedPath = [[path stringByExpandingTildeInPath] stringByStandardizingPath];
    const char *cpath = [expandedPath cStringUsingEncoding:NSUTF8StringEncoding];
    char *resolved = NULL;
    char *returnValue = realpath(cpath, resolved);

//    DebugLog(@"resolved: %s", resolved);
//    DebugLog(@"returnValue: %s", returnValue);

    return [NSString stringWithCString:returnValue encoding:NSUTF8StringEncoding];
}
4

3 に答える 3

2

以下は、回避しようとしていた低レベルの C 関数を使用する、うまく機能している私のソリューションです。それは私の目的のために働いています。以下の Objective-C 用に作成したメソッドを使用する完全なプロジェクトは、GitHub で入手できます。

https://github.com/brennanMKE/Xcode4CodeSnippets/tree/master/SnippetImporter

- (NSString *)resolvePath:(NSString *)path {
    NSString *expandedPath = [[path stringByExpandingTildeInPath] stringByStandardizingPath];
    const char *cpath = [expandedPath cStringUsingEncoding:NSUTF8StringEncoding];
    char *resolved = NULL;
    char *returnValue = realpath(cpath, resolved);

    if (returnValue == NULL && resolved != NULL) {
        printf("Error with path: %s\n", resolved);
        // if there is an error then resolved is set with the path which caused the issue
        // returning nil will prevent further action on this path
        return nil;
    }

    return [NSString stringWithCString:returnValue encoding:NSUTF8StringEncoding];
}
于 2013-07-10T21:29:04.280 に答える