【问题标题】:Best way to update files between folders在文件夹之间更新文件的最佳方式
【发布时间】:2012-06-02 09:47:33
【问题描述】:

我有两个目录(dirAdirB),我想将所有文件从dirA 包括子文件夹复制到dirB dirA 中的一个文件仅当两个文件具有相同的名称(以及相同的子路径)和fileB.LastWriteTime < fileA.LastWriteTime,或者dirA 中的文件不存在于dirB 中时,才会替换dirB 中的文件。

所以,如果我有这些目录:

<directory Name="dirA">

   <file Name="file1" LastWriteTime="10:00" />
   <file Name="file2" LastWriteTime="11:00" />
   <file Name="file7" LastWriteTime="12:00" />

   <directory Name="subDir">
      <file Name="file3" LastWriteTime="10:00" />
      <file Name="file4" LastWriteTime="11:00" />
   </directory>

   <directory Name="subDir2">
      <file Name="file5" LastWriteTime="10:00" />
      <file Name="file6" LastWriteTime="11:00" />
   </directory>

</directory>

<directory Name="dirB">

   <file Name="file1" LastWriteTime="09:00" />
   <file Name="file2" LastWriteTime="13:00" />

   <directory Name="subDir">
      <file Name="file3" LastWriteTime="09:00" />
      <file Name="file4" LastWriteTime="12:00" />
   </directory>

   <directory Name="BsubDir2">
      <file Name="file5" LastWriteTime="09:00" />
   </directory>

</directory>

更新后dirB将是:

<directory Name="dirB">

   <file Name="file1" LastWriteTime="10:00" />
   <file Name="file2" LastWriteTime="13:00" />
   <file Name="file7" LastWriteTime="12:00" />

   <directory Name="subDir">
      <file Name="file3" LastWriteTime="10:00" />
      <file Name="file4" LastWriteTime="12:00" />
   </directory>

   <directory Name="BsubDir2">
      <file Name="file5" LastWriteTime="09:00" />
   </directory>

   <directory Name="subDir2">
      <file Name="file5" LastWriteTime="10:00" />
      <file Name="file6" LastWriteTime="11:00" />
   </directory>

</directory>

谢谢。

【问题讨论】:

  • 我试过this
  • ROBOCOPY source dest /XO,好吧我知道不是编程解决方案,但有时为什么要重新发明轮子?
  • @Steve 因为我的车轮有不同的轮辋,我需要一个编程解决方案。
  • 现在认真,看看你的代码,我可以说你可以使用 File.Exist 和 Directory.Exist 进行很好的优化,以避免 dest 上的循环来查找 dir/file 的存在

标签: .net filesystems directory copy updates


【解决方案1】:

这里为您提供解决方案。对一些文件进行了尝试和测试, 工作正常,但我认为需要更多测试

Private Sub UpdateRec(Src As String, Dest As String, IsTest As Boolean)

    ' Update files in dest dir 
    For Each fileSrc As String In Directory.GetFiles(Src)
        Dim srcInfo As New FileInfo(fileSrc)
        Dim destFile As String = Path.Combine(Dest, srcInfo.Name)
        Dim foundFile As Boolean = File.Exists(destFile)
        if foundFile = true then
            Dim destInfo As New FileInfo(destFile)
          ' Copy only if newer 
          If Not IsTest AndAlso destInfo.LastWriteTime < srcInfo.LastWriteTime Then
              File.Copy(srcInfo.FullName, destInfo.FullName, True)
          End If
        else
        'File not found in dest copy always
        If Not IsTest Then File.Copy(srcInfo.FullName, destFile)
        end if
    Next

    ' Update folder in dest
    For Each dirSrc As String In Directory.GetDirectories(Src)
        Dim srcInfo As New DirectoryInfo(dirSrc)
        Dim dstDir As String = Path.Combine(Dest, srcInfo.Name)
        Dim foundDir As Boolean = Directory.Exists(dstDir)
        ' Not found, create 
        if foundDir = false then
         Directory.CreateDirectory(dstDir)
        end if
        ' recurse to copy file and other subdirs
        Call Me.UpdateRec(dirSrc, dstDir, IsTest)
    Next
End Sub

现在该睡觉了。博纳诺特。

【讨论】:

  • 我当时只是在写同样的东西。这就是我正在寻找的。格拉齐。
【解决方案2】:

简单递归,相对于两个位置的根路径。

这是一般算法。伪鳕鱼。这不会编译。

// To copy left-to-right:
void CopyFrom(DirectoryInfo left, DirectoryInfo right) {
    foreach(FileInfo leftFile in left.Files) {
        if( !rightContainsFile( leftFile.Name ) ) {
            leftFile.CopyTo( Path.Combine( right.FullPath, leftFile.Name );
        }//if
    }//foreach

    foreach(DirectoryInfo leftDir in left.Directories) {
        DirectoryInfo rightChild;
        if( (rightChild = rightContainsDirectory( leftDir.Name ) ) == null ) {
            // right does not contain child of the same name
            // so create it
            rightChild = Directory.Create( Path.Combine( right.FullPath, leftChild.Name );
        }
        // recursive copy:
        CopyFrom( leftChild, rightChild );
    } //foreach

}//void

需要一些组装。 HTH。

【讨论】:

  • 看起来很像我的解决方案,也许有更好的办法
猜你喜欢
  • 1970-01-01
  • 2018-10-04
  • 2012-03-28
  • 1970-01-01
  • 1970-01-01
  • 2011-07-08
  • 2013-08-24
  • 2013-01-13
  • 1970-01-01
相关资源
最近更新 更多