sharexmlserver.vb

来自「是可以运行的电子光盘 有程序与PPT介绍 对于学习VB。NET的有参考意义」· VB 代码 · 共 301 行

VB
301
字号
Imports Microsoft.VisualBasic
Imports System.Data
Imports System.io
Public Class ShareXmlServer
    Public Shared Function GetXmlFullPath(ByVal strPath As String) As String
        ' 如果路径中含有:符号,则认定为传入的是完整路径  
        If strPath.IndexOf(":") > 0 Then
            Return strPath
        Else
            '返回完整路径()
            Return System.Web.HttpContext.Current.Server.MapPath(strPath)
        End If
    End Function

    Public Shared Function GetDataSetByXml(ByVal strXmlPath As String) As DataSet
        Try
            Dim ds As DataSet = New DataSet()
            '读取XML到DataSet
            ds.ReadXml(GetXmlFullPath(strXmlPath))
            If (ds.Tables.Count > 0) Then
                Return ds
            End If
            Return Nothing
        Catch ex As Exception

        End Try
        Return Nothing
    End Function
    '删除所有行
    Public Shared Function DeleteXmlAllRows(ByVal strXmlPath As String) As Boolean

        Try
            Dim ds As DataSet = New DataSet()
            ds.ReadXml(GetXmlFullPath(strXmlPath))
            '如果记录条数大于0
            If (ds.Tables(0).Rows.Count > 0) Then

                '移除所有记录
                ds.Tables(0).Rows.Clear()
            End If
            '重新写入,这时XML文件中就只剩根节点了

            ds.WriteXml(GetXmlFullPath(strXmlPath))

            Return True

        Catch ex As Exception

            Return False
        End Try
    End Function

    '删除指定Index值的行的方法为:
    Public Shared Function DeleteXmlRowByIndex(ByVal strXmlPath As String, ByVal iDeleteRow As Integer) As Boolean
        Try
            Dim ds As DataSet = New DataSet()
            ds.ReadXml(GetXmlFullPath(strXmlPath))
            If (ds.Tables(0).Rows.Count > 0) Then
                '删除符号条件的行
                ds.Tables(0).Rows(iDeleteRow).Delete()
            End If
            ds.WriteXml(GetXmlFullPath(strXmlPath))
            Return True

        Catch ex As Exception

            Return False
        End Try
    End Function
    '删除指定User和Name值的行的方法为,只删除一条记录:
    Public Shared Function DeleteXmlRowByUserAndName(ByVal strXmlPath As String, ByVal User As String, ByVal Name As String) As Boolean
        Try
            Dim ds As DataSet = New DataSet()
            ds.ReadXml(GetXmlFullPath(strXmlPath))
            If (ds.Tables(0).Rows.Count > 0) Then
                '删除符合条件的行
                For Each row As DataRow In ds.Tables(0).Rows
                    If row.Item("User") = User And row.Item("Name") = Name Then
                        '删除行后,跳出,否则将出错,行已经变化,无法继续枚举
                        row.Delete()
                        Exit For
                    End If
                Next
                'For i As Integer = 0 To ds.Tables(0).Rows.Count - 1
                '    If ds.Tables(0).Rows(i).Item("User") = User And ds.Tables(0).Rows(i).Item("Name") = Name Then
                '        ds.Tables(0).Rows(i).Delete()
                '    End If
                'Next
            End If
            ds.WriteXml(GetXmlFullPath(strXmlPath))
            Return True

        Catch ex As Exception

            Return False
        End Try
    End Function
    '删除指定字段名和值的行的方法为,只删除一条记录:
    Public Shared Function DeleteXmlRowByFieldAndValue(ByVal strXmlPath As String, ByVal Field() As String, ByVal Value() As String) As Boolean
        Try
            Dim ds As DataSet = New DataSet()
            ds.ReadXml(GetXmlFullPath(strXmlPath))
            Dim Flag As Boolean
            If (ds.Tables(0).Rows.Count > 0) Then
                '删除符合条件的行
                For Each row As DataRow In ds.Tables(0).Rows
                    Flag = True
                    For i As Short = 0 To Field.Length - 1
                        If row.Item(Field(i)) <> Value(i) Then
                            Flag = False
                        End If
                    Next
                    If Flag Then
                        '删除行后,跳出,否则将出错,行已经变化,无法继续枚举
                        row.Delete()
                        Exit For
                    End If
                Next
            End If
            ds.WriteXml(GetXmlFullPath(strXmlPath))
            Return True

        Catch ex As Exception

            Return False
        End Try
    End Function
    '删除指定User的行的方法为:
    Public Shared Function DeleteXmlRowByUser(ByVal strXmlPath As String, ByVal User As String, ByVal Name As String) As Boolean
        Try
            Dim dv As DataView
            Dim ds As DataSet = New DataSet()
            ds.ReadXml(GetXmlFullPath(strXmlPath))
            If (ds.Tables(0).Rows.Count > 0) Then
                '删除符号条件的行
                'For Each row As DataRow In ds.Tables(0).Rows
                '    If row.Item("User") = User Then
                '        row.Delete()
                '    End If
                'Next
                dv = ds.Tables(0).DefaultView
                dv.RowFilter = "User='" & User & "'"

            End If
            ds.WriteXml(GetXmlFullPath(strXmlPath))
            Return True

        Catch ex As Exception

            Return False
        End Try
    End Function
    '修改指定User和Name值的行的方法为,只修改一条记录:
    Public Shared Function ModifyXmlRowByUserAndName(ByVal strXmlPath As String, _
        ByVal User As String, ByVal Name As String, ByVal Pwd As String, ByVal EnableEdit As Boolean, _
        ByVal EnableDel As Boolean, ByVal EnableUser As String) As Boolean
        Try
            Dim ds As DataSet = New DataSet()
            ds.ReadXml(GetXmlFullPath(strXmlPath))
            If (ds.Tables(0).Rows.Count > 0) Then
                '删除符号条件的行
                For Each row As DataRow In ds.Tables(0).Rows
                    If row.Item("User") = User And row.Item("Name") = Name Then
                        '删除行后,跳出,否则将出错,行已经变化,无法继续枚举
                        row("Pwd") = Pwd
                        row("EnableEdit") = EnableEdit
                        row("EnableDel") = EnableDel
                        row("EnableUser") = EnableUser
                        Exit For
                    End If
                Next
            End If
            ds.WriteXml(GetXmlFullPath(strXmlPath))
            Return True

        Catch ex As Exception

            Return False
        End Try
    End Function
    '通过DataSet检查 ShareFile.xml中数据的正确性和完备性
    '通过DataSet检查 ShareDir.xml中数据的正确性和完备性
    '参数FileName为ShareFile.xml文件或ShareDir.xml
    'bIsFile为True,检查的是 ShareFile.xml,False则检查 ShareDir.xml
    '如果记录数为0则删除该文件,
    Public Shared Sub CheckShareFile(ByVal strxmlPath As String, ByVal bIsFile As Boolean)
        '判断是否有重复共享文件或目录(同一个用户共享同一个文件或目录两次或以上)
        Ini_ShareXml(bIsFile)
        Dim ds As New DataSet
        '测试是否加快读取XML速度
        ds.ReadXmlSchema(GetXmlFullPath(strxmlPath))
        ds.ReadXml(GetXmlFullPath(strxmlPath), XmlReadMode.IgnoreSchema)

        Dim OnlyDs As DataSet

        OnlyDs = ds.Copy
        OnlyDs.AcceptChanges()
        For i As Integer = 0 To ds.Tables(0).Rows.Count - 2
            For j As Integer = i + 1 To ds.Tables(0).Rows.Count - 1
                If ds.Tables(0).Rows(i).Item("User") = ds.Tables(0).Rows(j).Item("User") _
                    And ds.Tables(0).Rows(i).Item("Name") = ds.Tables(0).Rows(j).Item("Name") Then
                    Try
                        OnlyDs.Tables(0).Rows(i).Delete()   ' 删除copy 表中重复行,只比较User和FileName是否相同
                    Catch ex As Exception

                    End Try

                End If
            Next
        Next
        '检查共享是否存在,不存在则删除
        For i As Integer = OnlyDs.Tables(0).Rows.Count - 1 To 0 Step -1
            If Not OnlyDs.Tables(0).Rows(i).RowState = DataRowState.Deleted Then
                Dim row As DataRow = OnlyDs.Tables(0).Rows(i)
                Dim tName As String
                tName = Path.Combine(row("Path").ToString, row("Name").ToString)
                If bIsFile Then '共享的是文件
                    If Not File.Exists(tName) Then
                        row.Delete()
                    End If
                Else
                    If Not Directory.Exists(tName) Then
                        row.Delete()
                    End If
                End If

            End If
        Next
        If OnlyDs.HasChanges Then   '数据集有变化时,重写XML数据
            OnlyDs.WriteXml(GetXmlFullPath(strxmlPath))
        End If
        ds = Nothing
        OnlyDs = Nothing


    End Sub

    'bIsFile为True,建立ShareFile.xml文件l,False建立ShareDir.xml文件
    '当文件存在但没有任何记录时,删除文件重新建立,同时建立一条记录
    Private Shared Sub Ini_ShareXml(ByVal bIsFile As Boolean)
        '"~/XML/ShareFile.xml"文件不存在则建立该文件,在设置共享时建立问题
        Dim ds As New DataSet
        Dim dt As DataTable
        If IsNothing(System.Web.HttpContext.Current.Session("User")) Then
            Return
        End If
        Dim User As String = System.Web.HttpContext.Current.Session("User")
        Dim strUserDir As String
        strUserDir = Path.Combine(Data.C_ServerDir, User)
        Dim strPath As String
        Dim Name As String
        If bIsFile Then
            If File.Exists(GetXmlFullPath(Data.C_ShareFileXmlMapPath)) Then
                ds.ReadXml(GetXmlFullPath(Data.C_ShareFileXmlMapPath))
                If ds.Tables.Count = 0 Then
                    File.Delete(GetXmlFullPath(Data.C_ShareFileXmlMapPath))
                Else
                    ds = Nothing
                    Return
                End If
            End If
            dt = ds.Tables.Add("File")
            Name = "temp.txt"
            strPath = Path.Combine(strUserDir, Name)
            Dim Writer As New StreamWriter(strPath, False)
            Writer.WriteLine("这个文件是为共享自动创建的")
            Writer.Close()
        Else
            If File.Exists(GetXmlFullPath(Data.C_ShareDirXmlMapPath)) Then
                ds.ReadXml(GetXmlFullPath(Data.C_ShareDirXmlMapPath))
                If ds.Tables.Count = 0 Then
                    File.Delete(GetXmlFullPath(Data.C_ShareDirXmlMapPath))
                Else
                    ds = Nothing
                    Return
                End If
            End If
            Name = "temp"
            strPath = Path.Combine(strUserDir, Name)
            Directory.CreateDirectory(strPath)
            dt = ds.Tables.Add("Dir")
        End If
        dt.Columns.Add("User")
        dt.Columns.Add("Pwd")
        dt.Columns.Add("Name")
        dt.Columns.Add("Path")
        dt.Columns.Add("EnableEdit")
        dt.Columns.Add("EnableDel")
        dt.Columns.Add("EnableUser")
        Dim Value() As String = {User, "", Name, strUserDir, "False", "False", "False"}
        dt.Rows.Add(Value)
        If bIsFile Then
            dt.WriteXml(GetXmlFullPath(Data.C_ShareFileXmlMapPath))
        Else
            dt.WriteXml(GetXmlFullPath(Data.C_ShareDirXmlMapPath))
        End If
    End Sub


End Class

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?