我正在寻找一个“拖放文件夹”的Windows共享驱动器,每个人都可以访问。 我想要文件被自动删除,如果他们坐在文件夹超过X天。
但是,似乎所有的方法,我发现要做到这一点,使用最后修改date,上次访问时间或文件的创builddate。
我试图让这个文件夹,用户可以放入文件与人分享。 如果有人复制或移动文件到这里,我希望时钟在这个时候开始滴答滴答。 但是,除非有人实际修改了文件,否则不会更新文件的上次修改date和创builddate。 最后访问时间更新太频繁…似乎只是在Windows资源pipe理器中打开一个目录将更新上次访问时间。
任何人都知道这个解决scheme? 我在想,每天对文件进行哈希编目,然后根据比某个date更早的哈希过期文件可能是一个解决scheme….但是,取出文件哈希可能是耗时的。
任何想法将不胜感激!
注意:
我已经在这里看了很多答案…看着文件服务器资源监视器,powershell脚本,批处理脚本等,他们仍然使用上次访问时间,上次修改时间或创build时间…其中,如上所述,不符合上述需求。
我们使用了一个powershell脚本和一个策略的组合。 该策略指定用户必须在Drop_Zone共享内创build一个文件夹,然后将所需的任何文件复制到该文件夹中。 当文件夹达到7天(使用CreationTime)时,PowerShell脚本将删除它。
我还添加了一些日志到PowerShell脚本,所以我们可以validation它的操作,并打开影子副本只是为了保存完全无能为力。
这里是没有所有日志logging的脚本。
$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 } }
如果您可以假设NTFS,则可以将一个密钥(Guid)写入该文件的备用stream中。 加上date,所以你基本上可以将数据库存储在文件中。
更多信息可以在这里find
http://blogs.technet.com/b/askcore/archive/2013/03/24/alternate-data-streams-in-ntfs.aspx
基本上,您可以将其他内容存储在由特殊名称编码的单独的stream中。
您可以使用IO.FileSystemWatcher,它允许您“观察”一个文件夹创build新文件。 这是你需要做的工作。
这些variablesconfiguration要监视的path和一个filter来微调哪些文件要跟踪:
$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
最后,您可以每天运行一次以清理旧文件:
Get-ChildItem $watchFolderPath -Recurse | Where-Object {((Get-Date)-$_.LastWriteTime).TotalDays -gt 6} | Remove-Item
这应该是你需要的一切…
这已经有一段时间了,但我为此提出了一个相对简单的方法。
我会触摸添加到放置目录的任何文件(通过资源监视实用程序进行监视),并将最后修改date设置为添加到文件夹的date。
然后,我可以使用上次修改date来清除任何需要closures的文件。 这也有一个好处,如果有人真的更新文件,它会重置倒计时。
当文件被复制或移动到文件夹时,无法依赖date。 Windowspipe理在文件系统,驱动器,networking共享等中保存文件。您可以使用Linux文件服务器来解决问题,或者防止用户使用FTP或基于Web的上传系统直接复制文件。
如果您确定上传后无法修改文件,您可以分开上传和访问文件夹,以及在它们之间移动文件并重新进行datelogging的脚本。 但是,这听起来像你希望人们能够直接修改文件。
所以,一个简单的,如果有点冒险的解决scheme将是混乱的date。 我会写两个脚本:
按照您的首选语言,每小时运行一次脚本,即:
在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日)运行这个脚本,将所有文件的修改date设置为1994年6月1日 – 正好是356 * 20天前。 因为它只更改比$ before值更新的文件,所以它不会触及已经设置为过去的文件。
清理脚本将每天晚上运行,并且:
我不会写这部分的脚本 – 有很多工具可以处理删除超过指定date的文件,select任何你喜欢的。 重要的部分是查找7300 + X天的文件,其中X是自上次修改以来要保留的天数。
与其他答案相比,这有一些优点:
我可以看到的唯一的问题是,如果人们复制了20年前最后修改的文件到drop文件夹。 我认为在大多数情况下,这不太可能是一个问题,但它可能会出现。
您可以通过具有“上传”IFRAME的网页将文件添加到投递箱。 然后用户可以“发布”文件,在服务器上调用一个PHP / ASP作业,该文件将该文件放入折叠位置。 PHP / ASP可以执行任何数量的索引/分析操作。
如果有人复制或移动文件到这里,我希望时钟在这个时候开始滴答滴答。 但是,除非有人实际修改了文件,否则不会更新文件的上次修改date和创builddate。
我会创build一个脚本,每五分钟按计划运行一次,并执行两件事。
有一个现有的机制来标记文件,存档位。 从DOS的早期开始就一直存在,并且在FAT和NTFS上都存在。
基本上,每个文件都会默认设置存档位。 如果您看到放置文件夹中存档位的文件,(1)清除该位并(2)将其date设置为今天。 如果您看到一个没有这个位的文件,并且过去的date<= 7天,请将其删除。
如果用户在放置文件夹中时写入文件,则会将其归档位重新设置,使其生存期也重置为7天。 毕竟,这实际上是一个新的文件。
您现在可以安全地使用FileSystemWatcher。 它所具有的任何问题(如重复事件,缓冲区溢出丢失详细信息)都不再重要,因为相关信息都在文件元数据中。