如何检查文件夹中是否有任何新文件?

How to check the folder on the appearance in it of any new file?

请帮忙。我找不到解决办法。 (Windows 平台) 我需要:

  1. 扫描文件夹
  2. 如果您收到任何新文件。
  3. 处理文件。

您可以使用 FileSystemWatcher class 监控文件夹中的新文件。

也可以很容易地used from PowerShell:

$FSW = New-Object System.IO.FileSystemWatcher

然后使用 Register-ObjectEvent 到 "listen" 引发的事件

在不知道您要执行什么的情况下,我只能提供这些。理论上,您会 运行 每 1 小时将其作为计划任务:

foreach ($file in (Get-ChildItem "C:\TargetDirectory" | where {$_.lastwritetime -gt (Get-Date).AddHours(-1)})) {
    # Execute-Command -Target $file
}

另一种检测"new files"的方法是存档属性。每当创建或更改文件时,此属性由 windows 设置。

每当您处理文件时,取消设置它的存档属性 (attrib -a file.ext)。

优点是,你不依赖于任何时间。

要列出 "new"(或更改的)文件,请使用 dir /aadir /a-a 将列出已处理的文件)

有关更多信息,请参阅 dir /?attrib /?

FileSystemWatcher 是我最近学习的一个实用程序,以后一定会用到。最好的部分是它依赖于 .net 事件,因此您不需要构建外部触发结构。

这是我如何在 24/7 生产环境中使用它的示例(完整脚本接收 xml,对其进行处理,然后将结果插入 SQL 中 under 3秒)。

    Function submit-resultFile {
#Actual file processing takes place here
    }

Function create-fsw {
    Register-ObjectEvent $fsw Created -SourceIdentifier "Spectro FileCreated" -Action {
        $name = $Event.SourceEventArgs.Name
        $File = $Event.SourceEventArgs.Fullpath
        $changeType = $Event.SourceEventArgs.ChangeType
        $timeStamp = $Event.TimeGenerated
        Write-Verbose "The file '$name' was $changeType at $timeStamp" -fore green

        submit-ResultFile -xmlfile $file
        }
    }



# In the following line, you can change 'IncludeSubdirectories to $true if required.                          
$fsw = New-Object IO.FileSystemWatcher $watchFolder, $watchFilter -Property @{IncludeSubdirectories = $false;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'}

$xmlFiles = Get-ChildItem -Path $ResultsDirectory -Filter *.xml
foreach ($file in $xmlfiles)
{
submit-ResultFile -xmlfile $File.FullName
}


Create-fsw
 # Register a new File System Watcher

需要注意的几个要点: - 如果在创建 FSW 之前该位置存在文件,它们将不会触发 "objectevent",因此在我的脚本中,您会看到我首先 运行 扫描现有文件。

  • 当 FSW 确实触发时,您希望它一次只处理 1 个文件。由于下一个文件创建事件将生成一个新的 "objectevent"。构建 FSW 以在每个触发器上处理多个文件最终会导致崩溃。