1

我正在为 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

给定来自 Coda 的路径,我需要能够检索与该文件相关联的 sqlite 行(最初是在用户通过 NSOpenPanel 选择文件时创建的)。

有没有办法获取文件的实际完整路径,包括卷信息?或者,是否有更好的方法来存储对可以轻松检索的文件的引用,而不管给定的路径如何?

更新

我已经意识到 Coda 以这样一种方式修改保存的文件,以至于您不能依赖文件的 inode 编号来保持一致,因此 trojanfoe 的答案对我不起作用。

4

2 回答 2

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 组合,但上述格式在大多数情况下应该可以正常工作。

于 2013-10-31T22:17:12.450 回答
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:找出符号链接的位置。

于 2013-11-01T16:40:01.187 回答