2013-09-05 3 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

Я бы сбросил результаты на две разные таблицы в базе данных и написал 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

Смежные вопросы