无需枚举的文件操作

时间:2019-07-09 14:36:31

标签: .net powershell delete-file enumeration

我想通过PowerShell删除大量文件。 我想使用终端,因为如果尝试删除或访问文件夹,资源管理器会崩溃。

这是Windows的INetCache文件夹(“ C:\ Windows \ SysWOW64 \ config \ systemprofile \ AppData \ Local \ Microsoft \ Windows \ INetCache \ IE”),与system32相同。

使用好的旧cmd,我可以看到文件夹中的实际内容,并且有〜10gb的0.5-1.5 kbit * .htm文件。 (约800万个文件)

我可以使用/.net库进行不强制枚举的文件操作吗?我在ps中发现的是,大多数程序只是基于.net lib的程序的别名。 否则我将不得不依靠* .bat文件...

也许我监督了一个简单的解决方案?

我尝试过的事情:

  • Remove-Item
  • del(别名Remove-Item)
  • rm(别名Remove-Item)
  • robocopy(从空目录到目标目录的镜像)
  • 删除Windows资源管理器(+按下 shift

我从PowerShell针对目录执行的所有操作都冻结了会话。我认为这是因为程序尝试枚举目录的内容。

解决方案:

  • 一个“我不喜欢它,但是它可以工作”的解决方案是使用删除程序 来自cmd.exe。

1 个答案:

答案 0 :(得分:3)

根据我的经验,我不知道一种在不枚举文件内容的情况下删除包含文件的目录的方法。

话虽这么说,我认为您可能走了这条路,因为您发现其他方法运行缓慢,并且可能对删除文件的最快方法感兴趣。

您可能想尝试此方法,此方法已根据答案The most efficient way to delete millions of files based on modified date, in windows进行了修改。此方法依赖于[System.IO]的基础dotnet静态类,应能为您提供最佳性能。

$HTMLfiles = [System.IO.Directory]::EnumerateFiles("C:\Windows\SysWOW64\config\systemprofile\AppData\Local\Microsoft\Windows\INetCache\IE", "*.htm", "AllDirectories")
$date = ([System.DateTime]::Now).AddSeconds(-300)
foreach ($File in $HTMLfiles ) {
    if ([System.IO.File]::GetLastWriteTime($File) -le $date) {
        [System.IO.File]::Delete($File)
    }
} #foreach

文件删除是否总是需要枚举?

在SO'How to delete all files and folders in a directory?'上查看此答案将我带到[System.IO.DirectoryInfo]的{​​{3}}。在尝试了其中显示的各种方法之后,我使用以下代码填充了包含50K文件的目录:

1..50000 | % {
  $i = "c:\temp\SO\Test_$_.htm"
[void][System.IO.File]::Create($i)
}

然后,我尝试使用Directory .Delete()方法刷新目录的内容,如下所示:

$dir = [System.IO.DirectoryInfo]::new("c:\temp\SO")
measure-command {$dir.Delete($true)}

观看计算机上的事件,实际上我可以看到单个文件一次从目录中删除。我看不到没有枚举即可批量删除文件的任何方法。哎呀,即使尝试删除目录也不起作用,因为此方法还必须先删除所有文件。

我认为在使用面向对象和面向API的编程和操作系统时,应该只是期望。