比较XML文件夹数据的最佳方法
我们正在将服务器环境从一个网络迁移到另一个网络。网络完全分离,彼此看不见。我正在编写一个程序,将我们当前生产文件服务器上的文件与我们未来生产文件服务器上的文件进行比较 该计划需要列出以下内容:比较XML文件夹数据的最佳方法,xml,vb.net,Xml,Vb.net,我们正在将服务器环境从一个网络迁移到另一个网络。网络完全分离,彼此看不见。我正在编写一个程序,将我们当前生产文件服务器上的文件与我们未来生产文件服务器上的文件进行比较 该计划需要列出以下内容: 当前生产服务器的未来服务器中缺少文件 来自生产服务器的文件在将来的服务器中过期 我能想到的最快的方法是创建一个程序,浏览每个文件夹,并创建一个对象来保存所有文件和文件夹。然后,我将该结构序列化为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
Imports System.IO
公开课表格1
私有子表单1_Load(ByVal发送方作为System.Object,ByVal e作为System.EventArgs)处理MyBase.Load
Dim objFolder作为新文件夹
objFolder=GetFolder(“要浏览的文件夹”)
Dim strObjects As String=序列化对象(objFolder)
使用新StreamWriter(“输出路径”)
.Write(strObjects)
以
端接头
函数GetFolder(ByVal strPath作为字符串)作为文件夹
Dim objFolder作为新文件夹
对于新DirectoryInfo(strPath).GetFiles中的每个文件
将文件的大小设置为新文件
oFile.Name=File.Name
oFile.FullName=File.FullName
oFile.DateCreated=File.CreationTime
oFile.DateModified=File.LastWriteTime
objFolder.lstFiles.Add(oFile)
下一个
对于新DirectoryInfo(strPath).GetDirectory中的每个文件夹
objFolder.lstFolders.Add(GetFolder(Folder.FullName))
下一个
返回objFolder
端函数
公共共享函数序列化对象(ByVal objToSerialize作为对象)为字符串
Dim objXML作为新的Xml.Serialization.XmlSerializer(objToSerialize.GetType)
作为新IO.StringWriter()的Dim sw
序列化(sw,objToSerialize)
返回sw.ToString()
端函数
作为对象的公共共享函数反序列化对象(ByVal strSerializedObject作为字符串,ByVal objType作为类型)
Dim objXML作为新的Xml.Serialization.XmlSerializer(objType)
Dim sr作为新IO.StringReader(strSerializedObject)
返回CType(objXML.Deserialize(sr),对象)
端函数
末级
_
公共类文件夹
公共文件作为新列表(文件)
公用文件夹作为新列表(文件夹的列表)
末级
_
公共类文件
公共名称作为字符串
作为字符串的公共全名
创建为字符串的公共日期
公共日期修改为字符串
末级
我最终使用上述方法解决了这个问题。我只是反序列化对象并循环遍历每个文件,检查目标文件是否存在并比较其他数据点
代码如下:
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
Imports System.IO
公开课表格1
私有子表单1_Load(ByVal发送方作为System.Object,ByVal e作为System.EventArgs)处理MyBase.Load
Dim objFolder作为新文件夹
Dim StrObject As String=“”
使用新的StreamReader(“输入文件路径”)
strObjects=.ReadToEnd
以
objFolder=反序列化对象(strObjects,GetType(Folder))
检查文件(objFolder)
端接头
子检查文件(文件夹作为文件夹的ByVal)
Dim FileName As String=“输出文件路径”
Dim strWrite As String=“”
对于oFolder.lst文件中的每个文件
如果System.IO.File.Exists(oFile.FullName),则
将fi设置为新文件信息(oFile.FullName)
如果fi.LastWriteTime of ile.DateModified,则
strWrite+=vbCrLf&oFile.Name&“,&oFile.FullName&”,文件过期,&oFile.DateModified
如果结束
其他的
strWrite+=vbCrLf&oFile.Name&“,&oFile.FullName&”,文件不存在,&oFile.DateModified
如果结束
下一个
Dim sw作为新StreamWriter(文件名,真)
软件写入(strWrite)
sw.Close()
sw.Dispose()
对于oFolder.lstFolders中的每个文件夹2
检查文件(文件夹2)
下一个
端接头
公共共享函数序列化对象(ByVal objToSerialize作为对象)为字符串
Dim objXML作为新的Xml.Serialization.XmlSerializer(objToSerialize.GetType)
作为新IO.StringWriter()的Dim sw
序列化(sw,objToSerialize)
返回sw.ToString()
端函数
作为对象的公共共享函数反序列化对象(ByVal strSerializedObject作为字符串,ByVal objType作为类型)
Dim objXML作为新的Xml.Serialization.XmlSerializer(objType)
Dim sr作为新IO.StringReader(strSerializedObject)
返回CType(objXML.Deserialize(sr),对象)
端函数
末级
_
公共类文件夹
公共文件作为新列表(文件)
公用文件夹作为新列表(文件夹的列表)
末级
_
公共类文件
公共名称作为字符串
作为字符串的公共全名
创建为字符串的公共日期
公共日期修改为字符串
末级
如果您希望差异不大,并且可以安排XML文件以相同的顺序存储数据(差异除外),则可以使用。另外,当t