如何获取文件路径的完整路径(包括挂载目录)?

时间:2013-10-31 22:02:35

标签: objective-c macos

我正在为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的答案对我来说不起作用。

2 个答案:

答案 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:找出符号链接的位置。