none
關於資料比對的問題 RRS feed

  • 問題

  • 各位大大,我要比對兩個資料夾內的檔案,但是裡面還有很多資料夾,而且每個資料夾裡面的檔案名稱有可能會相同,請問這樣要如何比對呢?

    功能有點像是資料備份一樣,目標資料夾內的所有資料要跟來源的相同.

    例如:
    來源資料夾(路徑 C:\DIREC)
    |---A
          |---0001.TXT
          |---0002.TXT
          |---0003.TXT
    |---B
          |---0ABC.TXT
          |---0DEF.TXT

    目標資料夾(路徑 D:\DIREC)
    |---A
          |---0001.TXT
          |---0002.TXT
    |---B
          |---0ABC.TXT
          |---0DEF.TXT

    我現在的做法如下,這樣會將不同路徑下但是檔案相同的檔案給覆蓋掉.要怎樣比對"相對路徑"下的檔案呢?而且判斷檔案有修改才複製.

    Dim diSource As New System.IO.DirectoryInfo(SourcePath)
    Dim diTarget As New System.IO.DirectoryInfo(TargetPath)
    Dim str1, str2 As String
    '判斷來源資料夾內的檔案是否存在於目標資料夾內
    For Each fiSource As System.IO.FileInfo In diSource.GetFiles("*", SearchOption.AllDirectories)
        str1 = fiSource.Name
        For Each fiTargetas As System.IO.FileInfo In diTarget.GetFiles("*", SearchOption.AllDirectories)
            str2 = fiTargetas.Name
            If fiTargetas.Name = fiSource.Name Then
                '判斷上一次修改檔案的時間
                If fiSource.LastWriteTime > fiTargetas.LastWriteTime Then
                    File.Copy(fiSource.FullName, fiTargetas.FullName, True)
                End If
            End If
        Next
    Next

    2010年4月12日 上午 02:22

解答

  • For Each fiSource As System.IO.FileInfo In diSource.GetFiles("*", SearchOption.AllDirectories)
    	str1 = fiSource.FullName
    	For Each fiTargetas As System.IO.FileInfo In diTarget.GetFiles("*", SearchOption.AllDirectories)
    		str2 = fiTargetas.FullName
    		If fiTargetas.FullName = fiSource.FullName Then
    			'判斷上一次修改檔案的時間
    			If fiSource.LastWriteTime > fiTargetas.LastWriteTime Then
    				File.Copy(fiSource.FullName, fiTargetas.FullName, True)
    			End If
    		End If
    	Next
    Next
    • 已標示為解答 Lolota Lee 2010年4月19日 上午 02:42
    2010年4月12日 上午 02:44
  • 微軟有現成軟體:SyncToy 2.1


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    • 已標示為解答 Lolota Lee 2010年4月19日 上午 02:42
    2010年4月12日 下午 01:49

所有回覆

  • For Each fiSource As System.IO.FileInfo In diSource.GetFiles("*", SearchOption.AllDirectories)
    	str1 = fiSource.FullName
    	For Each fiTargetas As System.IO.FileInfo In diTarget.GetFiles("*", SearchOption.AllDirectories)
    		str2 = fiTargetas.FullName
    		If fiTargetas.FullName = fiSource.FullName Then
    			'判斷上一次修改檔案的時間
    			If fiSource.LastWriteTime > fiTargetas.LastWriteTime Then
    				File.Copy(fiSource.FullName, fiTargetas.FullName, True)
    			End If
    		End If
    	Next
    Next
    • 已標示為解答 Lolota Lee 2010年4月19日 上午 02:42
    2010年4月12日 上午 02:44
  • Hi,

    參考

        Function GetDifferentFileList(ByVal sourcePath As String, ByVal destPath As String) As String()
            If sourcePath = destPath Then
                Return Nothing
            End If
            Dim differentFileList As New List(Of String)
            Dim diSource = New DirectoryInfo(sourcePath)
            Dim diTarget = New DirectoryInfo(destPath)
            For Each fiSource As System.IO.FileInfo In diSource.GetFiles("*", SearchOption.AllDirectories)
                For Each fiTargetas As System.IO.FileInfo In diTarget.GetFiles("*", SearchOption.AllDirectories)
                    If fiTargetas.FullName.Replace(destPath, String.Empty) = fiSource.FullName.Replace(sourcePath, String.Empty) AndAlso fiSource.LastWriteTime <> fiTargetas.LastWriteTime Then
                        differentFileList.Add(fiSource.FullName)
                    End If
                Next
            Next
            Return differentFileList.ToArray 
        End Function

     


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2010年4月12日 上午 05:43
  • 蹂躪大大,這樣是不是只會將不同的檔案列出來而已,對吧!!

    我試看看~謝謝大大!!

    2010年4月12日 上午 06:21
  • 微軟有現成軟體:SyncToy 2.1


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    • 已標示為解答 Lolota Lee 2010年4月19日 上午 02:42
    2010年4月12日 下午 01:49