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 からのパスを指定して、このファイル (ユーザーが NSOpenPanel を介してファイルを選択したときに最初に作成された) に関連付けられた sqlite 行を取得できる必要があります。

ボリューム情報を含む、ファイルの実際のフル パスを取得する方法はありますか? または、指定されたパスに関係なく、簡単に取得できるファイルへの参照を保存するより良い方法はありますか?

アップデート

Coda は、ファイルの inode 番号に依存して一貫性を保つことができないような方法で保存されたファイルを変更することに気付きました。

4

2 に答える 2

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ことは、へのシンボリック リンクであるアイテムが見つかるまで、 のアイテムを反復処理することです//Volumes/<the item linked to / >あなたのデータベース。

NSFileManager attributesOfItemAtPath:error:を使用してシンボリック リンクがあるかどうかを確認し、NSFileManager -destinationOfSymbolicLinkAtPath:error:を使用してシンボリック リンクの場所を確認できます。

于 2013-11-01T16:40:01.187 に答える
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 に答える