Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 枚举大量目录并将它们移动到另一个目录_.net_Vb.net_Windows Services - Fatal编程技术网

.net 枚举大量目录并将它们移动到另一个目录

.net 枚举大量目录并将它们移动到另一个目录,.net,vb.net,windows-services,.net,Vb.net,Windows Services,我正在尝试实现一个服务,如果满足某些条件,它会将一个目录移动到另一个目录,为此我尝试了以下代码: Dim dirInfo As New DirectoryInfo("C:\foo") Dim name As String For Each dir As System.IO.DirectoryInfo In dirInfo.GetDirectories() name = dir.Name If needsToMove(name) Then dir.MoveTo("C

我正在尝试实现一个服务,如果满足某些条件,它会将一个目录移动到另一个目录,为此我尝试了以下代码:

Dim dirInfo As New DirectoryInfo("C:\foo")
Dim name As String
For Each dir As System.IO.DirectoryInfo In dirInfo.GetDirectories()
    name = dir.Name
    If needsToMove(name) Then
        dir.MoveTo("C:\bar\" & nombre)
    End If
Next
这方面的主要问题是,例如,
C:\foo
可能有300000个目录(没有内部文件夹),执行该代码的成本非常高

是否有更快的方法移动目录或列出目录?


有没有办法列出前1000个目录,然后再列出下1000个目录,依此类推?


任何帮助都将不胜感激

如果您注意到,当您在windows中复制粘贴多个目录时,它会弹出一个带有“进度”和“取消”按钮的弹出窗口。所以,即使是windows也不能做到超快速

对于您的问题,您需要设计递归方法,如下所示

public sub DirectoriesRecursively(parentDir as string, destination as string)

    '--> here, if destination don't exist, create

    '--> here do for each file in your parent dir and [if needs to move] copy them to destination 

    '--> here do for each folder in your parent dir and call 
    DirectoriesRecursively(parentDir & "\" & folderName, destination & "\" & folderName)

End Sub

' usage
DirectoriesRecursively("c:\folder1", "d:\folder111")
因此,您可以递归调用此方法,如果需要,您的所有文件和文件夹都将被移动。我没有输入特定的代码,因为我知道你知道怎么做

例如,现在,如果文件被锁定,您需要放置Try-Catch。您可以重试。您应该使用
backgroundworker
,这样,如果用户想要取消,您就可以插入取消代码


这里有很多选项和可能的版本,但是关键字-“递归”

是否将它们移动到同一个驱动器?如果是,此操作在大多数情况下几乎是免费的。例外是当文件被锁定时,它基本上等同于文件复制。您觉得它很昂贵,应该是一个异步调用。@Neolisk是的,它在同一个驱动器中。我尝试了10000个空目录,它大约持续了5分钟。这很奇怪,我希望它几乎是即时的,因为它所做的只是在不同的文件夹下重新映射,所以相对结构保持不变-这就是它在Windows中的工作方式。但我还没有尝试过这么多文件夹。无论如何,async应该可以帮助您。@neolick我也这么认为,但是该服务需要一些时间来移动很多文件夹。现在我保留这段代码,但在将来我认为它需要改进。我在考虑划分枚举,但我不知道这是否可能(例如,枚举前1000名)。您是否使用WCF?如果是,您可以让代码保持同步,然后WCF可以为您生成带有异步调用和回调的代理。复制和删除是否会影响性能?“本机移动”是否复制和删除每个文件/目录?您需要了解基于windows性能的性能。我相信,当文件被删除时,不会对性能造成太大影响,因为windows只是从文件注册表中删除文件,而扇区被标记为空闲。实际上没有对硬盘做任何处理[几乎什么都没有]。移动文件也是如此。您的文件仍保留在硬盘上的相同空间,只有有关此文件的元数据发生更改。你的第二个问题是什么意思?我的第二个问题是,如果.NET的
moveTo
函数与cmd.exe的
move
函数相同,我正在考虑调用此命令。很可能。最后一切都调用windows api。复制粘贴与移动到同一驱动器不同。移动应该是超快速的(又称瞬间),因为它实际上并没有做任何事情。