以下のコードを試して、それらの場所の絶対パスを展開して、チルダと相対パスを使用すると失敗する 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];
}