フォルダー内のファイルを期限切れにする:x日後にファイルを削除する


12

誰でもアクセスできるWindows共有ドライブに「ドロップフォルダー」を作成したいと考えています。ファイルがX日以上フォルダー内にある場合、ファイルを自動的に削除したいです。

ただし、ファイルの最終変更日、最終アクセス時刻、または作成日を使用して、これを行うことがわかったすべての方法のようです。

これをユーザーがファイルをドロップして誰かと共有できるフォルダーにしようとしています。誰かがここにファイルをコピーまたは移動した場合、この時点で時計が動き始めます。ただし、実際にファイルを変更しない限り、ファイルの最終変更日と作成日は更新されません。最終アクセス時間があまりにも頻繁に更新されます... Windows Explorerでディレクトリを開くだけで最終アクセス時間が更新されるようです。

誰でもこれに対する解決策を知っていますか?ファイルのハッシュを毎日カタログ化し、特定の日付よりも古いハッシュに基づいてファイルを期限切れにすることは解決策になると考えています...しかし、ファイルのハッシュを取得するには時間がかかる可能性があります。

どんなアイデアでも大歓迎です!

注:
私はすでにここで非常に多くの回答を見てきました...ファイルサーバーリソースモニター、PowerShellスクリプト、バッチスクリプトなどを調べました。彼らはまだ最終アクセス時間、最終変更時間または作成時間を使用しています...説明したように、これは上記のニーズに適合しません。


@Michael Kjorlingが述べたように、ボックスにドロップされた後にファイルが変更された場合、タイマーはカウントを停止しますか?
Get-HomeByFiveOClock

あなたが探しているのは、Windowsの同等のものtmpwatchです。
エイブリーペイン14年

回答:


5

PowerShellスクリプトとポリシーの組み合わせを使用しました。このポリシーは、ユーザーがDrop_Zone共有内にフォルダーを作成し、必要なファイルをそのフォルダーにコピーする必要があることを指定しています。フォルダが7日間経過すると(CreationTimeを使用)、powershellスクリプトはそれを削除します。

また、PowerShellスクリプトにログを追加して、その動作を確認し、シャドウコピーを有効にして、自分自身から完全に無能なものを保存しました。

以下は、すべてのログを含まないスクリプトです。

$location = Get-ChildItem \\foo.bar\Drop_Zone
$date = Get-Date
foreach ($item in $location) {
  # Check to see if this is the readme folder
  if($item.PsIsContainer -and $item.Name -ne '_ReadMe') {
    $itemAge = ((Get-Date) - $item.CreationTime).Days
    if($itemAge -gt 7) {
      Remove-Item $item.FullName -recurse -force
    }
  }
  else {
  # must be a file
  # you can check age and delete based on that or just delete regardless
  # because they didn't follow the policy
  }
}

1
これは最も簡単なようで、ファイルの日付時刻スタンプ、代替データストリームに手を加えたり、ファイルのリストとそれらのドロップ日付を必要としない。あらゆる種類の魔法を実行する素晴らしいスクリプトを作成するつもりでしたが、その後、これを見ました。
BeowulfNode42

また、1日1回実行できるので、スクリプトを常にトリガーするファイルシステム監視イベントを必要としません。また、何らかの理由で1日を逃してもそれほど重要ではありません。
BeowulfNode42

2
@ BeowulfNode42が指摘したように、非常にシンプルなアイデアです。ユーザーがフォルダーを作成する必要があることを確認するために、「このフォルダーのみ」に対する「ファイルの作成/データの書き込み」ACLの単純な「拒否」により、ユーザーもサブフォルダーを作成する必要があります。
ブレットG

3

NTFSを想定できる場合は、ファイルの代替ストリームにキー(Guid)を書き込むことができます。日付を追加すると、基本的にファイルにデータベースを保存できます。

詳細については、をご覧ください。

http://blogs.technet.com/b/askcore/archive/2013/03/24/alternate-data-streams-in-ntfs.aspx

基本的に、特別な名前でコード化された別のストリームに追加のコンテンツを保存できます。


これをどのように行うのでしょうか?
ブレットG

@BrettGドキュメントへのリンクを追加しました。「NTFS代替データストリーム」は、万が一に備えてグーグルでも見つけることができます。グーグルがわかりません。
トムトム

申し訳ありませんが、代替データストリームとは何かを知っています。このコンテキストでの使用方法を理解しようとしていました。したがって、ハッシュなどを使用する代わりに、ファイルを追跡するために代替データストリームでGUID(および/または日付)を使用します。
ブレットG

うん。ファイルを確実にマークできる場合-マーキング日付を入れることさえできます-ハッシュを計算する必要はありません。
トムトム

ファイルがストアからコピーされ、編集されてからコピーされるかどうかに注意してください。その後、タイマーを再起動する必要があります。これにはハッシュが便利です。
CVn

2

IO.FileSystemWatcherを使用すると、作成された新しいファイルのフォルダを「監視」できます。この作品を作るために必要な作品は次のとおりです。

これらの変数は、監視するパスと、追跡するファイルを微調整するフィルターを構成します。

$watchFolderPath = $env:USERPROFILE
$watchFolderFilter = "*.*"

これにより、監視するフォルダーのパラメーターと、イベントが発生したときに実行するアクションが設定されます。基本的に、これは各ファイルの書き込み時にLastWriteTimeをリセットします。

$watcher = New-Object IO.FileSystemWatcher $watchFolderPath, $watchFolderFilter -Property @{
    IncludeSubdirectories = $true
    NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'
    }
$onCreated = Register-ObjectEvent $watcher Created -SourceIdentifier FileCreated -Action {
    $FileName = $Event.SourceEventArgs.FullPath
    $file = Get-Item $FileName
    $file.LastWriteTime = Get-Date
    }

これを使用して、必要に応じてイベントを登録解除できます。

Unregister-Event -SourceIdentifier FileCreated

最後に、古いファイルをクリーンアップするために、これを1日に1回実行できます。

Get-ChildItem $watchFolderPath -Recurse | Where-Object {((Get-Date)-$_.LastWriteTime).TotalDays -gt 6} | Remove-Item

それはあなたが必要とするすべてであるべきです...


これを編集して、ファイルの作成時にLastWriteTime属性を設定し、それを使用して後でファイルを削除します。
ティムフェリル

1

しばらく経ちましたが、私はこれに対処するための比較的簡単な方法を設定しました。

ドロップディレクトリに追加されたファイル(リソース監視ユーティリティを使用して監視)にタッチし、最終変更日をフォルダーに追加された日付に設定します。

その後、最終変更日を使用して、期限切れにする必要のあるファイルをすべて削除できます。これには、誰かが実際にファイルを更新した場合にカウントダウンがリセットされるという利点もあります。


完璧なアイデア。私は自分で調査を行います。しかし、どのリソース監視ユーティリティを使用したのでしょうか?
ブレットG

@BrettG正直に言って、ほぼ10年前でした。思い出せません。あなたは私を古く感じさせています。:)今日それをやるとしたら、イベントビューアでファイルシステム監査イベントに基づいてジョブを実行します。FileSystemWatcher .NETオブジェクトは、PowerShell経由で利用できると思います。別のオプションになります。
ティムブリガム

ハ、あなたが「しばらく」と言ったとき、あなたがそんなに長いことを意味していることに気づかなかった。面白いことに、FileSystemWatcherを見ていました。ただし、移動/コピーされたファイルでは動作しないと思います。返信いただきありがとうございます!
ブレットG

1
@BrettG-Filesystemwatcherは追跡テーブルと組み合わせて使用​​できますが、独自の問題があります。ここを参照してください:stackoverflow.com/questions/1764809/...は stackoverflow.com/questions/6000856/filesystemwatcher-issues
JohnP

1
@BrettGは-また、これはFSWに良い拡張したものです:codeproject.com/Articles/58740/...
JohnP

1

ファイルがフォルダーにコピーまたは移動された日付に依存する方法はありません。Windowsは、ファイルシステム、ドライブ、ネットワーク共有などにまたがってそれを保存します。Linuxファイルサーバーで何かを解決したり、FTPやWebベースのアップロードシステムを使用してファイルを直接コピーしたりするのを防ぐことができます。

アップロード後にファイルを変更できない場合は、別のアップロードフォルダーとアクセスフォルダー、およびそれらの間でファイルを移動して日付を更新するスクリプトを作成できます。しかし、人々がファイルを直接変更できるようにしたいようです。

したがって、単純で、多少ハッキングされた場合の解決策は、日付を台無しにすることです。次の2つのスクリプトを作成します。

毎時日付変更スクリプト

希望する言語で1時間に1回程度スクリプトを実行します。

  • 過去20年以内に日付が変更されたファイルを探します。
  • そのようなファイルが見つかったら、変更日を今日から20年を引いた日付に変更します。

PowerShellでは、次のようになります。

$path = "D:\test"

$today = Get-Date
$before = $today.AddDays(-7300) #356*20 days

Get-ChildItem -Recurse -Path $path | foreach {
    if ($_.LastWriteTime -gt $before) {
        Write-Host $_.Name
        $_.LastWriteTime = $before
    }
}

このスクリプトを今日(5月27日)実行すると、すべてのファイルの変更日が1994年6月1日-ちょうど356 * 20日前に設定されます。変更するのは$ before値より新しいファイルのみであるため、すでに過去に設定されているファイルには影響しません。

クリーンアップスクリプト

クリーンアップスクリプトは毎晩実行され、次のようになります。

  • 日付が「20年とX日前」に変更されたファイルを検索する
  • それらを削除する

この部分のスクリプトは作成しません。指定した日付よりも古いファイルの削除を処理できるユーティリティがたくさんあります。好きな方を選択してください。重要な部分は、7300 + X日前のファイルを探すことです。ここで、Xは、最後に変更されてから保存したい日数です。

長所

これには、他の回答よりもいくつかの利点があります。

  • 誰かがファイルを変更すると、タイマーがリセットされます。
  • ファイルをマークするためのNTFS代替ストリームは必要ありません(ファイルを移動するときに保存されるため、変更されたファイルが途中で削除される可能性があります)
  • パフォーマンスへの影響がある場合、最小限にする必要があります。データベースまたはファイル名やハッシュのリストを保持する必要はありません。
  • スクリプトの実行に失敗しても、ひどく壊れることはありません。日付を更新するために必要なサービスや継続的に実行するプログラムはありません。いくつかのスケジュールされたタスク。新しいファイルを監視し、最終変更時刻を今すぐ更新することに依存するソリューションでは、サービスが失敗したり競合状態に陥ったりすると、新しいファイルが削除される可能性があります。

私が見ることができる唯一の問題は、20年前に最後に変更されたファイルをドロップフォルダーにコピーする場合です。ほとんどのシナリオでは、それが問題になることはほとんどないと思いますが、それは起こる可能性があります。


0

「アップロード」IFRAMEがあるWebページを介して、ドロップボックスへのファイルの追加を形式化できます。次に、ユーザーはファイルを「ポスト」し、サーバー上でPHP / ASPジョブを呼び出します。これにより、ファイルが取得され、puckerロケーションに配置されます。PHP / ASPは、任意の数のインデックス/分析操作を実行できます。


0

誰かがここにファイルをコピーまたは移動した場合、この時点で時計が動き始めます。ただし、実際にファイルを変更しない限り、ファイルの最終変更日と作成日は更新されません。

5分ごとにスケジュールされたタスクとして実行し、2つのことを行うスクリプトを作成します。

  1. 最初のアクションは、フォルダーにコピーされたファイルのコピーを作成し、ファイルにプレフィックスを付けて元のファイルを削除します。これにより、ファイルの作成日がアプリケーションで統一されます。
  2. 2番目のアクションは、事前に決定されたプレフィックス(アクション1で設定)を持つすべてのファイルを調べ、X日より古い作成日を持つファイルを削除します。これにより、変更/アクセスされた日付の問題が解決されます。

0

ファイルをマークする既存のメカニズム、Archiveビットがあります。DOSの初期から存在しており、FATとNTFSの両方に存在します。

基本的に、すべてのファイルにはデフォルトでアーカイブビットが設定されています。あなたは、ファイルが表示される場合、あなたのドロップフォルダのアーカイブビットを、(1)そのビットをクリアして、(2)は、今日までその日付を設定します。そのビットがなく、過去7日以内の日付のファイルが表示された場合は、削除します。

ユーザーがドロップフォルダーにいる間にファイルに書き込むと、そのアーカイブビットが再度設定されるため、その有効期間も7日間にリセットされます。結局のところ、実際には新しいファイルです。

FileSystemWatcherを安全に使用できるようになりました。関連する情報はすべてファイルメタデータにあるため、問題(重複イベント、詳細情報を失うバッファオーバーフローなど)は問題になりません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.