5

ディレクトリ構造を再帰的にトラバースし、特定の基準を満たすファイルを探して、それらに対して何らかの処理を行う Windows ベースのアプリケーションを構築しています。特定のファイルを処理するかどうかを決定するには、そのファイルを開いてその内容の一部を読み取る必要があります。

このアプローチは原理的には優れているように見えますが、アプリケーションの初期バージョンをテストしている一部の顧客は、多数のファイルの最終アクセス時刻が変更されていると報告しています (実際にファイルにアクセスしているため、驚くことではありません)。これらの顧客は、ファイルの最終アクセス時刻に基づいてアーカイブ ポリシーを持っているため、これは問題です (たとえば、過去 12 か月間アクセスされていないファイルをアーカイブします)。私たちのアプリケーションはアーカイブの「ウィンドウ」よりも頻繁に実行されるようにスケジュールされているため、これらのファイルがアーカイブされるのを効果的に防ぎます。

各ファイルの最終アクセス時刻を読み取り前に保存し、後で書き戻すコードを追加しようとしましたが (恐ろしいことです)、ファイル システムのトランザクション ログに基づいて増分バックアップを行っていた別の顧客に問題が発生しました。ファイルの最終アクセス時刻の明示的な設定により、実際には変更されていないにもかかわらず、それらのファイルがすべての増分バックアップに含まれていました。

ここで質問です。Windows 環境で、最終アクセス時刻を更新せずにファイルを読み取る方法はありますか?

前もって感謝します!

編集:「ntfs」タグにもかかわらず、実際にはファイルシステムが NTFS であることに依存することはできません。多くのお客様はネットワーク経由でアプリケーションを実行しているため、相手側ではほぼ何でもかまいません。

4

3 に答える 3

6

ドキュメントには、これを実行できることが示されていますが、私は自分で試したことはありません。

ファイルにアクセスした後でもファイルの既存の最終アクセス時刻を保持するには、このパラメーターの FILETIME 構造体メンバーを 0xFFFFFFFF に初期化して、ファイル ハンドルを開いた直後に SetFileTime を呼び出します。

于 2011-04-14T13:26:04.723 に答える
4

Vista 以降、NTFS はデフォルトで最終アクセス時間を更新しません。これを有効にするには、http://technet.microsoft.com/en-us/library/cc959914.aspxを参照してください。

NTFS トランザクションを開始してロールバックすると、パフォーマンスが大幅に低下します。

あなたもできる

FSUTIL 動作セット disablelastaccess 0

于 2011-04-27T01:58:48.800 に答える
1

クライアントの最小要件が何であるかはわかりませんが、NTFS トランザクションを試しましたか? デスクトップで最初にサポートされた OS は Vista で、サーバーでは Windows Server 2008 でした。しかし、一見の価値があるかもしれません。

NTFS トランザクションを開始し、ファイルを読み取り、トランザクションをロールバックします。単純!:-)。ただし、最終アクセス日をロールバックするかどうかは実際にはわかりません。自分でテストする必要があります。

他のリンクを含む NTFS トランザクションに関する MSDN マガジンの記事へのリンクを次に示します。http://msdn.microsoft.com/en-us/magazine/cc163388.aspx

それが役に立てば幸い。

于 2011-04-14T13:27:20.367 に答える