file.createNewFile()実際の作成時間の前にラスト修飾時間でファイルを作成する

StackOverflow https://stackoverflow.com/questions/2717936

質問

私は使用しています jpoller 特定のディレクトリ内のファイルの変更を検出するには、実際の作成時間よりも早くタイムスタンプになってしまうため、ファイルが欠落しています。これが私のテスト方法です:

public static void main(String [] files)
{
    for (String file : files)
    {
        File f = new File(file);
        if (f.exists())
        {
            System.err.println(file + " exists");
            continue;
        }

        try
        {
            // find out the current time, I would hope to assume that the last-modified
            // time on the file will definitely be later than this
            System.out.println("-----------------------------------------");
            long time = System.currentTimeMillis();

            // create the file
            System.out.println("Creating " + file + " at " + time);
            f.createNewFile();

            // let's see what the timestamp actually is (I've only seen it <time)
            System.out.println(file + " was last modified at: " + f.lastModified());

            // well, ok, what if I explicitly set it to time?
            f.setLastModified(time);
            System.out.println("Updated modified time on " + file + " to " + time + " with actual " + f.lastModified());
        }
        catch (IOException e)
        {
            System.err.println("Unable to create file");
        }
    }
}

そして、これが私が出力のために得るものです:

-----------------------------------------
Creating test.7 at 1272324597956
test.7 was last modified at: 1272324597000
Updated modified time on test.7 to 1272324597956 with actual 1272324597000
-----------------------------------------
Creating test.8 at 1272324597957
test.8 was last modified at: 1272324597000
Updated modified time on test.8 to 1272324597957 with actual 1272324597000
-----------------------------------------
Creating test.9 at 1272324597957
test.9 was last modified at: 1272324597000
Updated modified time on test.9 to 1272324597957 with actual 1272324597000

結果は人種条件です。

  1. jpollerはxyzとして最後のチェックの時間を記録します... 123
  2. XYZで作成されたファイル... 456
  3. ファイルラスト修飾タイムスタンプは実際にxyz ... 000を読み取ります
  4. jpollerは、xyzより大きいタイムスタンプを使用して新しい/更新されたファイルを探します... 123
  5. jpollerはxyz ... 000がxyz未満であるため、新しく追加されたファイルを無視します... 123
  6. しばらく髪を引き出します

コードを掘り下げようとしましたが、両方を試してみました lastModified()createNewFile() 最終的にはネイティブコールに解決するので、私はほとんど情報を残しません。

にとって test.9, 957ミリ秒を失います. 。どのような精度を期待できますか?私の結果はオペレーティングシステムまたはファイルシステムによって異なりますか?提案された回避策?

注:現在、XFSファイルシステムを使用してLinuxを実行しています。私はクイックプログラムを書きました C そしてその 統計システムコール ショー st_mtime なので truncate(xyz...000/1000).

アップデート: :私はWindows 7でNTFSを使用して上記のプログラムを実行しました。 します 完全なミリ秒の精度を維持します。 MSDNリンク @MDMAは、FAT Files -Systemsが10ミリ秒の解像度で作成されているが、アクセスが2秒しか正確ではないことをさらにメモしました。したがって、これは本当にOSに依存します。

役に立ちましたか?

解決

ファイルシステムは正確に時間を保存せず、多くの場合、ミリ秒の解像度ではありません。たとえば、脂肪は作成時間に2秒の解像度を持ち、NTFは最後のアクセス時間の更新を最大1時間遅らせる可能性があります。 (詳細 MSDN。)あなたの場合はそうではありませんが、ファイルが別のコンピューターで作成されている場合、クロックを同期するという問題もあります。

これはJPollerの人々にとって問題であるかもしれないようです。なぜなら、これはロジックの処理時間があるところだからです。固定されるまで、実際の時間から+4秒に記載されている各ファイルの最後の変更時間を手動で設定することでこれを回避できます。+4は、作業中のファイルシステムの解像度よりも大きくなる任意の値です。ファイルがファイルシステムに書き込まれると、それらは丸められますが、追加した値よりも少なくなります。きれいではありませんが、うまくいきます!

他のヒント

ラスト変更されたタイムスタンプは、明らかにミリ秒ではなく数秒で保存されています。それはファイルシステムの制限かもしれません。ミリ秒ではなく秒と比較することをお勧めします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top