2013-10-31 252 views
1

我正在研究Coda的插件,並且在嘗試將文件路徑與sqlite行進行比較時遇到了一個奇怪的問題。如何獲取文件路徑的完整路徑(包括安裝目錄)?

基本上,NSOpenPanel返回返回這樣的路徑的NSURL:

/Users/michael/Documents/xcode stuff/hM github/Plugin/filename 

而且科達返回當前文件的路徑,因爲這:

/Volumes/Macintosh HD/Users/michael/Documents/xcode stuff/hM github/Plugin/filename 

我需要能夠檢索源碼行綁定到此文件(最初在用戶通過NSOpenPanel選擇文件時創建的),從Coda獲得路徑。

有沒有辦法獲得文件的實際完整路徑,包括卷信息? 或者,是否有更好的方式來存儲對文件的引用,而不管給定的路徑如何,這個文件可以很容易地被檢索到?

更新

我已經意識到,科達會修改,這樣你可以不依賴於文件的inode編號保持一致的方式保存的文件,所以trojanfoe的回答不會爲我工作。

回答

1

查看以下:

miranda-6:~ jeremyp$ ls -l /Volumes 
total 8 
drwxr-xr-x 1 jeremyp staff 8192 23 Oct 06:54 BOOTCAMP 
[email protected] 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迭代,直到你找到了,這是一個符號鏈接/然後,每當你從科達與/Volumes/<the item linked to/>開頭的文件路徑,你帶的是關然後在數據庫中搜索它。

您可以使用NSFileManager attributesOfItemAtPath:error:來確定您是否有符號鏈接,並使用NSFileManager -destinationOfSymbolicLinkAtPath:error:找出符號鏈接的位置。

+0

你是對的,我正在向後看問題。解決方案其實很簡單: NSURL * url = [NSURL fileURLWithPath:somePath]; url = [NSURL URLWithString:[url absoluteString]]; NSString * newPath = [[url URLByResolvingSymlinksInPath] path]; – mjvotaw

+0

啊,是的,甚至更好。 – JeremyP

1

一個更好的辦法來唯一地標識一個文件,不管它是如何規定的(絕對的,相對的,或包括安裝)是使用是整個系統中的唯一文件的設備和索引節點號:

#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組合,但上面的格式在大多數情況下應該可以正常工作。

+0

謝謝,這正是我一直在尋找的。我能夠通過NSFileManager獲取設備和inode#的信息。 – mjvotaw

+0

不!我被科達阻撓了。不過,顯然,Coda決定保存文件會更改inode編號,使得此方法無用。 – mjvotaw

+0

@mjvotaw啊,那是一種痛苦。我想你必須找到一種以一致的方式獲得絕對文件名的方法(即將Coda的文件名轉換爲一致的格式)。 – trojanfoe