AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 598133
Accepted
Brett G
Brett G
Asked: 2014-05-24 08:11:56 +0800 CST2014-05-24 08:11:56 +0800 CST 2014-05-24 08:11:56 +0800 CST

使文件夹中的文件过期:x 天后删除文件

  • 772

我希望在每个人都可以访问的 Windows 共享驱动器中创建一个“放置文件夹”。如果文件在文件夹中停留超过 X 天,我希望文件被自动删除。

但是,似乎我发现的所有方法都可以使用文件的最后修改日期、最后访问时间或创建日期。

我正在尝试将此文件夹设置为用户可以将文件放入其中以与某人共享的文件夹。如果有人将文件复制或移动到这里,我希望时钟在此时开始滴答作响。但是,除非有人实际修改了文件,否则不会更新文件的最后修改日期和创建日期。最后一次访问时间更新太频繁了……看来只要在windows资源管理器中打开一个目录就会更新最后一次访问时间。

有谁知道解决这个问题?我认为每天对文件的哈希进行编目,然后根据某个日期之前的哈希使文件过期可能是一种解决方案……但是获取文件的哈希可能会很耗时。

任何想法将不胜感激!

注意:
我已经在这里查看了很多答案...查看了文件服务器资源监视器、powershell 脚本、批处理脚本等。它们仍然使用上次访问时间、上次修改时间或创建时间...如上所述,它不符合上述需求。

windows windows-server-2003 file-sharing powershell batch
  • 8 8 个回答
  • 9648 Views

8 个回答

  • Voted
  1. Best Answer
    murisonc
    2014-05-28T13:21:49+08:002014-05-28T13:21:49+08:00

    我们使用了 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
      }
    }
    
    • 5
  2. TomTom
    2014-05-24T08:22:33+08:002014-05-24T08:22:33+08:00

    如果您可以假设 NTFS,您可以将密钥 (Guid) 写入文件的备用流。加上日期,因此您基本上可以将数据库存储在文件中。

    更多信息可以在

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

    基本上,您可以将附加内容存储在由特殊名称编码的单独流中。

    • 3
  3. Tim Ferrill
    2014-05-24T08:48:19+08:002014-05-24T08:48:19+08:00

    您可以使用 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
    

    最后,您可以每天运行一次以清理旧文件:

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

    这应该是你需要的一切......

    • 2
  4. Tim Brigham
    2014-05-24T09:25:38+08:002014-05-24T09:25:38+08:00

    已经有一段时间了,但我设置了一个相对简单的方法来解决这个问题。

    我会触摸添加到放置目录的任何文件(通过资源监视实用程序监视)并将最后修改日期设置为添加到文件夹的日期。

    然后我可以使用最后修改日期来清除任何需要老化的文件。这还有一个好处是,如果有人真的更新了文件,它将重置倒计时。

    • 1
  5. Grant
    2014-05-28T14:18:41+08:002014-05-28T14:18:41+08:00

    无法依赖文件被复制或移动到文件夹中的日期。Windows 设法跨文件系统、驱动器、网络共享等保存它。您可以使用 linux 文件服务器解决问题,或者防止人们使用 FTP 或基于 Web 的上传系统直接复制文件。

    如果您对人们在上传后无法修改文件感到满意,您可以拥有单独的上传和访问文件夹,以及在它们之间移动文件并重新日期的脚本。但听起来您希望人们能够直接修改文件。

    所以一个简单的,如果有点hacky,解决方案就是弄乱日期。我会写两个脚本:

    每小时换日脚本

    以您的首选语言每小时运行一次左右的脚本:

    • 查找在过去 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 年前最后修改的文件复制到放置文件夹。我认为在大多数情况下,这不太可能是一个大问题,但它可能会出现。

    • 1
  6. Simon Catlin
    2014-05-28T12:52:18+08:002014-05-28T12:52:18+08:00

    您可以通过具有“上传”IFRAME 的网页正式将文件添加到投递箱。然后,用户可以“发布”该文件,该文件调用服务器上的 PHP/ASP 作业,该作业获取该文件并将其放置在褶皱位置。PHP/ASP 可以执行任意数量的索引/分析操作。

    • 0
  7. user1914368
    2014-05-29T07:55:50+08:002014-05-29T07:55:50+08:00

    如果有人将文件复制或移动到这里,我希望时钟在此时开始滴答作响。但是,除非有人实际修改了文件,否则不会更新文件的最后修改日期和创建日期。

    我将创建一个脚本,该脚本每五分钟作为计划任务运行一次,并做两件事。

    1. 第一个操作将复制复制到文件夹中的任何文件,在文件上添加前缀并删除原始文件。这将确保文件的创建日期对于应用程序是统一的。
    2. 第二个操作将查看所有具有预定前缀(使用操作 1 设置)的文件,并删除任何创建日期早于 X 天的文件。这将解决修改/访问日期问题。
    • 0
  8. MSalters
    2014-07-01T08:00:35+08:002014-07-01T08:00:35+08:00

    存在一种标记文件的机制,即存档位。它从 DOS 的早期就已经存在,并且存在于 FAT 和 NTFS 上。

    基本上,每个文件都会默认设置它的存档位。如果您在放置文件夹中看到带有存档位的文件,(1) 清除该位并 (2) 将其日期设置为今天。如果您看到没有该位且日期 <= 7 天以前的文件,请将其删除。

    如果用户在放置文件夹中写入文件,则其存档位会再次设置,因此其生命周期也将重置为 7 天。毕竟,它实际上是一个新文件。

    您现在可以安全地使用 FileSystemWatcher。它所具有的任何问题(例如重复事件、缓冲区溢出丢失详细信息)都不再重要,因为相关信息都在文件元数据中。

    • 0

相关问题

  • 知道任何适用于 Windows 的快速可编写脚本的 ftp 客户端吗?[关闭]

  • 如果 Windows 服务崩溃,如何自动重新启动它?

  • 无法安排任务(访问被拒绝)

  • 物理机重启时自动重启虚拟机(VMWare)

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve