我正在为Coda开发插件,在尝试将文件路径与sqlite行进行比较时,我遇到了一个奇怪的问题。
基本上,NSOpenPanel返回一个NSURL,返回如下路径:
/Users/michael/Documents/xcode stuff/hM github/Plugin/filename
Coda返回当前文件路径:
/Volumes/Macintosh HD/Users/michael/Documents/xcode stuff/hM github/Plugin/filename
我需要能够检索绑定到此文件的sqlite行(最初是在用户通过NSOpenPanel选择文件时创建的),给出了来自Coda的路径。
有没有办法获取文件的实际完整路径,包括卷信息? 或者,有没有更好的方法来存储对可以轻松检索的文件的引用,而不管给定的路径是什么?
更新
我已经意识到Coda会以这样一种方式修改保存的文件,使你不能依赖文件的inode编号来保持一致,所以trojanfoe的答案对我来说不起作用。
答案 0 :(得分:1)
唯一标识文件的更好方法是使用文件的设备和inode编号,无论其指定方式如何(绝对,相对或包括安装):
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/stat.h>
static void get_file_details(const char *filename) {
struct stat statbuf;
if (stat(filename, &statbuf) == 0) {
printf("%s = %016llx%016llx\n", filename, (uint64_t)statbuf.st_dev, (uint64_t)statbuf.st_ino);
} else {
fprintf(stderr, "Failed to stat '%s': %s\n", filename, strerror(errno));
}
}
int main(int argc, const char **argv) {
for (int i = 1; i < argc; i++)
get_file_details(argv[i]);
return 0;
}
$ clang -o stattest stattest.c
$ ./stattest stat*
stattest = 00000000010000010000000001b1d48a
stattest.c = 00000000010000010000000001b1d43b
您需要决定格式设备/ inode组合的方式,但上述格式在大多数情况下都可以正常使用。
答案 1 :(得分:1)
观察以下内容:
miranda-6:~ jeremyp$ ls -l /Volumes
total 8
drwxr-xr-x 1 jeremyp staff 8192 23 Oct 06:54 BOOTCAMP
drwxrwxr-x@ 20 jeremyp staff 748 23 Oct 11:22 G-DRIVE
lrwxr-xr-x 1 root admin 1 28 Oct 07:25 Macintosh HD -> /
drwxrwxrwx 0 root wheel 0 1 Nov 16:28 MobileBackups
miranda-6:~ jeremyp$
/Volumes/Macintosh HD
是/
的符号链接。
那么你应该做什么(IMO),遍历/Volumes
中的项目,直到你找到一个符号链接到/
然后每当你从Coda获得一个文件路径开始使用/Volumes/<the item linked to / >
,在数据库中搜索之前将其删除。
您可以使用NSFileManager attributesOfItemAtPath:error:查看是否有符号链接,NSFileManager -destinationOfSymbolicLinkAtPath:error:找出符号链接的位置。