2

Mac OS X(10.6以降)でディレクトリツリーをウォークし、ディレクトリが最後にバックアップ場所と同期されてから発生した変更を検出しようとするユーティリティを作成しています。

最初にファイルとフォルダーを同期するときに、iノード番号を取得してそのファイルまたはフォルダーのデータベースレコードに保存します。

NSString *oldFilePath = /* ... */;
NSError *error = nil;
NSDictionary *attributes = [[NSFileManager defaultManager] attributesOfItemAtPath:oldFilePath error:&error];
/* set database record for oldFilePath to [attributes fileSystemFileNumber] */

新しいファイルまたはフォルダーに遭遇したときは、最初にiノード番号を使用してデータベースルックアップを実行し、元のファイルがある場合はそれを見つけます。

しかし、ファイルが親ディレクトリからサブディレクトリに移動し、親ディレクトリへの変更を検出しようとしている場合、保存されたiノード番号を使用して新しいパスを識別できるようにしたいと思います。移動と削除を区別できます。

4

4 に答える 4

6

Macでは、GetFileInfoコマンドはiノード番号の逆引き参照を実行します。

GetFileInfo /.vol/234881029/344711

生成する必要があります:

file: "/path/to/file"
...

Martin Rの答えは、ディレクトリでのみ機能します。

于 2013-10-21T12:36:58.457 に答える
4

iノード番号はファイルシステム内でのみ一意であるため、ファイルを識別するには少なくともデバイスとiノード番号が必要です。

HFS +ファイルシステムでは、iノード番号は実際には「MacintoshファイルID」と同じであり、デバイスおよびiノードごとにディレクトリを検索できる特別な「/.vol」ファイルシステムがあります。

例:

$ cd /.vol/234881029/342711
$ pwd
/Volumes/Data/tmpwork/test20/test20.xcodeproj
$ stat .
234881029 342711 drwxr-xr-x 5 martin staff 0 170 ......

ご覧のとおり、234881029は「/ Volumes / Data」のデバイス番号、342711はそのファイルシステム内の「tmpwork / test20 / test20.xcodeproj」のiノード番号、そして

cd /.vol/<deviceNo>/<inodeNo>

そのフォルダに直接転送しました。getcwd()これで、そのフォルダへの実際のパスを決定するために使用できます。

「/.vol」ファイルシステムは、従来のテクニカルQ&AQA1113に記載されています。

免責事項:私はこれをOS X 10.7でのみ試しましたが、古いシステムでも機能すると確信しています。OS Xの将来のバージョンでこの機能を信頼できるかどうかはわかりません。また、これは非常にHFS固有です。

于 2012-08-14T12:06:45.210 に答える
2

Unixライクなシステムでは、多くのファイル名が同じiノードを参照する可能性があるため、ファイルシステムを検索する必要があります。MacOSがショートカットを提供しているかどうかはわかりません。

于 2012-08-14T11:42:31.120 に答える
0

上で説明したように、/。vol /'magic'ディレクトリには、ボリュームのデバイスIDと、ディレクトリまたはファイルのiノードが必要であることに注意してください。ここで別の回答でstat説明されているように、ボリュームのデバイスIDを最初に返された番号として取得できます。

# stat returns device ID as '234881026' and confirms inode is '32659974'
~$ stat /Volumes/Foo
234881026 32659974 lrwxr-xr-x 1 root admin 0 1 ... /Volumes/Foo

# access file using ./vol/<device ID>/<inode>
~$ cd /.vol/234881026/1017800
:../Prague 2011 March$

~$ GetFileInfo /.vol/234881026/1017800/IMG_3731.JPG
file: "/Users/roger/Pictures/Prague 2011 March/IMG_3731.JPG"
于 2014-09-25T23:14:06.537 に答える