2013-09-05 39 views
0

我們正在將服務器環境從一個網絡遷移到另一個網絡。網絡完全分開,不能互相看到。我正在編寫一個程序,將我們當前生產文件服務器上的文件與我們未來生產文件服務器上的文件進行比較。比較XML文件夾數據的最佳方法

程序需要列出以下:

  • 文件中,從目前的生產服務器
  • 文件已經過時了,未來的服務器從我們的生產服務器未來的服務器丟失

我能想到的最快的方法是創建一個程序,瀏覽每個文件夾並創建一個對象來保存所有文件和文件夾。然後,我採用該結構並將其序列化爲XML格式。最終結果是我將有兩個文件包含每臺服務器上的所有文件和文件夾。

現在我的問題是,我需要一個簡單的方法來比較兩個文件,以查看任何差異。我想到的方法是將當前生產XML文件反序列化回對象,並循環遍歷每個文件/文件夾,檢查未來生產服務器上是否存在這些文件。

除了手動循環遍歷每個文件,還有一種比較兩個XML文件以查看哪些對象不同的更簡單的方法嗎?

這裏是我用來生成兩個文件的代碼:我最終通過我上面描述的方法解決這個

Imports System.IO 

Public Class Form1 

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 

     Dim objFolder As New Folder 
     objFolder = GetFolder("FOLDER TO BROWSE") 

     Dim strObjects As String = SerializeObject(objFolder) 
     With New StreamWriter("Out Path") 
      .Write(strObjects) 
     End With 

    End Sub 


    Function GetFolder(ByVal strPath As String) As Folder 
     Dim objFolder As New Folder 
     For Each File In New DirectoryInfo(strPath).GetFiles 
      Dim oFile As New File 
      oFile.Name = File.Name 
      oFile.FullName = File.FullName 
      oFile.DateCreated = File.CreationTime 
      oFile.DateModified = File.LastWriteTime 
      objFolder.lstFiles.Add(oFile) 
     Next 

     For Each Folder In New DirectoryInfo(strPath).GetDirectories 
      objFolder.lstFolders.Add(GetFolder(Folder.FullName)) 
     Next 

     Return objFolder 
    End Function 

    Public Shared Function SerializeObject(ByVal objToSerialize As Object) As String 
     Dim objXML As New Xml.Serialization.XmlSerializer(objToSerialize.GetType) 
     Dim sw As New IO.StringWriter() 
     objXML.Serialize(sw, objToSerialize) 
     Return sw.ToString() 
    End Function 

    Public Shared Function DeserializeObject(ByVal strSerializedObject As String, ByVal objType As Type) As Object 
     Dim objXML As New Xml.Serialization.XmlSerializer(objType) 
     Dim sr As New IO.StringReader(strSerializedObject) 
     Return CType(objXML.Deserialize(sr), Object) 
    End Function 

End Class 

<Serializable(), Xml.Serialization.XmlInclude(GetType(File))> _ 
Public Class Folder 
    Public lstFiles As New List(Of File) 
    Public lstFolders As New List(Of Folder) 
End Class 

<Serializable()> _ 
Public Class File 
    Public Name As String 
    Public FullName As String 
    Public DateCreated As String 
    Public DateModified As String 
End Class 
+0

如果你認爲會有一些不同之處,可以安排的XML文件在同一順序的數據(除了差異),你可以使用[FC命令](http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/fc.mspx?mfr=true)。另外,當文件時間應該相同時,文件時間的實際可能性是什麼? –

+0

我會將結果轉儲到數據庫中的2個不同表中,並編寫sql查詢以查找所有差異。除此之外,你只剩下像Beyond Compare這樣的文件比較工具來幫助你。 – Joe

+0

你爲什麼不簡單地使用某種類型的vpn軟件,它應該能夠很容易地對目錄進行比較,以便監聽哪些可以自由流通的常用工具?順便說一下,你不需要惹惱你自己的問題。系統會自動通知您每條評論或評論。 – rekire

回答

1

。我只是反序列化對象,並遍歷每個文件,檢查目標文件是否存在並比較其他數據點。

下面是代碼:

Imports System.IO 

Public Class Form1 

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
     Dim objFolder As New Folder 
     Dim strObjects As String = "" 

     With New StreamReader("INPUT FILE PATH") 
      strObjects = .ReadToEnd 
     End With 

     objFolder = DeserializeObject(strObjects, GetType(Folder)) 
     CheckFiles(objFolder) 

    End Sub 

    Sub CheckFiles(ByVal oFolder As Folder) 
     Dim FileName As String = "OUTPUT FILE PATH" 
     Dim strWrite As String = "" 
     For Each oFile In oFolder.lstFiles 
      If System.IO.File.Exists(oFile.FullName) Then 
       Dim fi As New FileInfo(oFile.FullName) 
       If fi.LastWriteTime <> oFile.DateModified Then 
        strWrite += vbCrLf & oFile.Name & "," & oFile.FullName & ",File Out of Date," & oFile.DateModified 
       End If 
      Else 
       strWrite += vbCrLf & oFile.Name & "," & oFile.FullName & ",File Does Not Exist," & oFile.DateModified 
      End If 
     Next 
     Dim sw As New StreamWriter(FileName, True) 
     sw.Write(strWrite) 
     sw.Close() 
     sw.Dispose() 

     For Each oFolder2 In oFolder.lstFolders 
      CheckFiles(oFolder2) 
     Next 
    End Sub 

    Public Shared Function SerializeObject(ByVal objToSerialize As Object) As String 
     Dim objXML As New Xml.Serialization.XmlSerializer(objToSerialize.GetType) 
     Dim sw As New IO.StringWriter() 
     objXML.Serialize(sw, objToSerialize) 
     Return sw.ToString() 
    End Function 

    Public Shared Function DeserializeObject(ByVal strSerializedObject As String, ByVal objType As Type) As Object 
     Dim objXML As New Xml.Serialization.XmlSerializer(objType) 
     Dim sr As New IO.StringReader(strSerializedObject) 
     Return CType(objXML.Deserialize(sr), Object) 
    End Function 

End Class 

<Serializable(), Xml.Serialization.XmlInclude(GetType(File))> _ 
Public Class Folder 
    Public lstFiles As New List(Of File) 
    Public lstFolders As New List(Of Folder) 
End Class 

<Serializable()> _ 
Public Class File 
    Public Name As String 
    Public FullName As String 
    Public DateCreated As String 
    Public DateModified As String 
End Class 
+0

+1。感謝您分享您的解決方案。 – Neolisk