web-dev-qa-db-ja.com

ファイルの名前変更または移動時にiノードは変更されますか?

in PHP fileinode()関数はファイルのiノードを返します。ファイルの名前が変更されたか、移動されたか、変更されたかを判断するためにそれを使用できるかどうか疑問に思いました。

私はいくつかのテストを行いましたが、名前を変更してもiノードは同じままです。この動作は一貫していますか? Linuxディストリビューションのどのタイプのファイルでも機能しますか?

10
yoo

ファイルシステムの境界を越えないファイル名の変更は、単なるメタデータの変更であるため、iノード番号を保持する必要があります。一般的に言って、ファイルを開いてその内容を変更しても、iノード番号は変更されません。これは、とにかく単一のファイルシステム内でのみ意味があります(ただし、たとえばアクセス時間は変更されます)。テキストエディタなどの一部のツールは、適切な場所に書き込むのではなく、まったく新しいファイルを作成する傾向があることに注意してください。thatを使用すると、新しいiノードが使用されます。

ファイルの変更を確認することが目的の場合は、アクセス時間とサイズを確認する方が信頼性が高くなります。

8
dhag

Inodeを使用して、ファイルが変更されたかどうかを確認することはできません。

ファイルの名前を変更したり移動したりすると、変更される場合と変更されない場合があります。別のディスクに移動しない限り、通常は同じままです...

3
robert

PHPドキュメント 吸う 非常に悪い:あいまいで、あいまいで、誤解を招く。 fileinode()は、「gets file inode」または「returns the inode」として簡潔に定義されています。しかし、もう少し掘り下げると、ドキュメントはこの関数がiノードnumberを返すと述べ始めているようです。 iノードはiノード番号以上のものです。 「ファイルのiノードを返す」と「ファイルのiノード番号を取得する」の違いは、署名した証書の違いに匹敵します私の家はあなたのところにあります。

ダグとロバートの答えはとても良いので、私は彼らが言ったことを繰り返したり、それらを改善しようとしたりしません。追加することを除いて:ファイルがファイルシステム内で名前変更または移動されたかどうかを検出する最良の方法は、iノード構造の_st_ctime_メンバーを調べることです。これは、ファイルへの最後のc hangeの時間(UNIXタイムスタンプ:日付と時刻)であり、その属性も含まれます。ドキュメントによると、これはPHP with int filectime ( string $filename )で取得できます。

1
Scott