【问题标题】:Copy certain directories to another directory将某些目录复制到另一个目录
【发布时间】:2014-12-14 16:26:16
【问题描述】:

我需要一些帮助来完成以下任务。我有一个非常大的目录结构,如下所示:

g:\documents\100
g:\documents\100\100001
g:\documents\100\100001\Incoming
g:\documents\100\100001\Workfiles
g:\documents\100\100001\Customer Files
g:\documents\100\100002
g:\documents\100\100002\Incoming
g:\documents\100\100002\Workfiles
g:\documents\100\100002\Customer Files
...
g:\documents\100\100999
g:\documents\100\100999\Incoming
g:\documents\100\100999\Workfiles
g:\documents\100\100999\Customer Files

...

g:\documents\101
g:\documents\101\101001
g:\documents\101\101001\Incoming
g:\documents\101\101001\Workfiles
g:\documents\101\101001\Customer Files
g:\documents\101\101002
g:\documents\101\101002\Incoming
g:\documents\101\101002\Workfiles
g:\documents\101\101002\Customer Files
...
g:\documents\101\101999
g:\documents\101\101999\Incoming
g:\documents\101\101999\Workfiles
g:\documents\101\101999\Customer Files

etc...

我想将 alle 目录的 Incoming 和 Workfiles 移动到具有相同结构的新路径 e.q.: z:\documents 中。

如何遍历所有目录并移动名称等于 Incoming 或 WorkFiles 的完整目录并创建与旧结构相同的结构。

导致:

g:\documents\100
g:\documents\100\100001
g:\documents\100\100001\Customer Files
g:\documents\100\100002
g:\documents\100\100002\Customer Files
...
g:\documents\100\100999
g:\documents\100\100999\Customer Files

z:\documents\100\100001\Incoming
z:\documents\100\100001\Workfiles
z:\documents\100\100002\Incoming
z:\documents\100\100002\Workfiles
...
z:\documents\100\100999\Incoming
z:\documents\100\100999\Workfiles

我想在 VB.NET 中执行此操作,或者是否有可以执行此任务的 robocopy 语法? 其他工具?

提前致谢!

【问题讨论】:

    标签: vb.net robocopy directoryinfo


    【解决方案1】:

    您可以通过迭代目录结构并将与 WorkFiles & Incoming 匹配的路径保存为当前找到的子目录来实现。其他路径被进一步扫描,匹配的路径被保存以供稍后处理。

    获得所有匹配项后,然后将目录一一移动到新位置。由于目录保持其完整路径,因此只需将 sourceDirectory 替换为 targetDirectory 即可轻松获取新路径。然后你检查,如果这个新路径的父路径已经存在,当不创建它时,然后将目录从源文件夹移动到目标文件夹

    作为一个例子,我在 Vb.net 中写了这个:

    Public Class MoveDirectories
        Protected ReadOnly ListToMove As IList(Of String) = New List(Of String)
    
        Public Function GetMatching(ByVal sourceDirectory As String) As IList(Of String)
            Dim lst As New List(Of String)
            Dim subFolders() As String = Directory.GetDirectories(sourceDirectory)
    
            For Each subFolder As String In subFolders
                Dim folderName As String = subFolder.Substring(subFolder.LastIndexOf("\") + 1).ToLower()
                If ListToMove.Contains(folderName) Then
                    lst.Add(subFolder)
                    Continue For
                End If
                Dim subFolderMatching = GetMatching(subFolder)
                If subFolderMatching IsNot Nothing AndAlso subFolderMatching.Count > 0 Then
                    For Each sfm As String In subFolderMatching
                        lst.Add(sfm)
                    Next
                End If
            Next
    
            Return lst
        End Function
    
        Public Function ScanAndMoveMatching(ByVal sourceDirectory As String, ByVal targetDirectory As String) As Boolean
            Dim success As Boolean = True
            Dim matching As IList(Of String)
    
            Try
                matching = GetMatching(sourceDirectory)
    
                If Not Directory.Exists(targetDirectory) Then
                    Directory.CreateDirectory(targetDirectory)
                End If
    
                For Each folder As String In matching
                    Dim target As String = folder.Replace(sourceDirectory, targetDirectory)
                    Dim subTarget As String = target.Substring(0, target.LastIndexOf("\"))
                    If Not Directory.Exists(subTarget) Then
                        Directory.CreateDirectory(subTarget)
                    End If
                    Directory.Move(folder, target)
                Next
    
            Catch ex As Exception
                success = False
                Console.WriteLine("Error occured: {0}", ex.Message)
            End Try
    
    
            Return success
        End Function
    
        Public Sub New(ByVal ParamArray moveFolder As String())
            If (moveFolder IsNot Nothing) Then
                For i As Integer = 0 To moveFolder.Length - 1
                    ListToMove.Add(moveFolder(i).ToLower())
                Next
            End If
        End Sub
    End Class
    

    然后会通过以下方式在您的程序中创建和调用:

    Sub Main()
        Dim dScanner As New MoveDirectories("workfiles", "incoming")
        If dScanner.ScanAndMoveMatching("g:\documents", "z:\documents") Then
            Console.WriteLine("Succeeded!")
        Else
            Console.WriteLine("Failed!")
        End If
        Console.ReadLine()
    End Sub
    

    如果您希望首先查看匹配项的列表,您可以简单地调用 GetMatching 方法,它会返回准确的结果:)

    【讨论】:

    • 哇,这看起来很棒。非常感谢,我将使用此代码作为我的解决方案的基础。
    【解决方案2】:

    使用 robocopy:

    robocopy "g:\documents\100" "z:\documents\100\" /E
    

    /E 是复制子文件夹,包括空文件夹。

    参考:

    【讨论】:

      猜你喜欢
      • 2014-07-18
      • 2013-01-11
      • 1970-01-01
      • 2016-02-08
      • 2012-09-13
      • 1970-01-01
      • 2011-09-07
      • 2017-11-18
      • 2012-02-15
      相关资源
      最近更新 更多