我正在尝试下面的代码,以便扩展这些位置的绝对路径,以便我可以将它们用于使用NSFileManager进行的操作,但是在使用波浪线和相对路径时失败。
我正在使用Objective-C在Xcode中开发命令行应用程序。我可以从命令行运行程序并为我扩展路径,但是从Xcode中的目标中,我正在使用$PROJECT_DIR和$HOME传递命令行参数的值来获取部分内容。问题是我需要到达$PROJECT_DIR/..,但它在NSFilemanager中无法解决。
似乎URLByResolvingSymlinksInPath或URLByStandardizingPath不起作用。我应该做些什么?
更新:我正在使用stdlib中的realpath来解析路径,并创建了以下方法,尽管我不理解这个C函数。具体来说,我不知道解析出的值是什么,以及我如何使用它。但我确实看到了期望的返回值。
我正在使用Objective-C在Xcode中开发命令行应用程序。我可以从命令行运行程序并为我扩展路径,但是从Xcode中的目标中,我正在使用$PROJECT_DIR和$HOME传递命令行参数的值来获取部分内容。问题是我需要到达$PROJECT_DIR/..,但它在NSFilemanager中无法解决。
似乎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];
}
argv
中始终会给出绝对路径。我建议您更新调试参数以使用完整路径(例如 /Users/brennan/file.txt)。 - Abhi Beckertrealpath
会创建一个泄漏,因为传递NULL
将分配一个大小为PATH_MAX
字节的数组来存储结果。 - OzB