我有一个询问外部流程的工具,我想添加一些适用于Info.plist文件的Objective-c查询。
为了做到这一点,我使用以下代码将应用程序基本路径作为输入(即/Applications/Notes.app /)
NSDictionary* infoDict = [[NSBundle bundleWithPath:vlcFilePath] infoDictionary];
但是,我只能从远程进程获取可执行文件路径(即/Applications/Notes.app/Contents/MacOS/Notes),并且我希望转换为基本路径。
我已经使用std :: strings和rfind来获得我需要的东西,但是我想知道是否有更传统的方式也可以在一些有效的非传统路径形式上运行(我的代码容易受到包含几个连续斜杠的路径的攻击,如/Application/Notes.app/Contents/MacOS//Notes)。
我的代码(等于向后转到父目录3次):
for (int i=0;i<3;i++) {
const size_t last_slash_idx = executable.rfind('/');
if (std::string::npos != last_slash_idx) {
executable = executable.substr(0, last_slash_idx);
}
}
答案 0 :(得分:0)
okey,我在使用string.rfind方法多次尝试后找到了一些简洁的解决方案,该方法寻找最后一次出现的&#34; .app&#34;然后从该索引开始截断字符串。
std::string app_suffix(".app");
int split_idx = executable.rfind(app_suffix);
executable = executable.substr(0,split_idx+app_suffix.size());