Kezdjük azzal a függvénnyel, mely az XML tartalmat állítja elő. Ez lesz a GetDirContent. Paraméterként annak a mappának az elérési útvonalát kell megadnunk, melynek tartalmára kíváncsiak vagyunk. Visszatérési értékként egy XmlDocument osztályt kapunk, melyben rendelkezésre áll az összes szükséges adat.
Public Shared Function GetDirContent(directory As String) As XmlDocument
Az XML dokumentum írását a XmlTextWriter osztály segíti. Ennek létrehozásához szükségünk van egy StringWriter osztályra.
Dim sw As New StringWriter()
Dim xtw As New XmlTextWriter(sw)
Első lépésként a dokumentumunkban az XML deklarációt kell elhelyezni a WriteStartDocument függvénnyel.
xtw.WriteStartDocument(True)
Ez az alábbi szöveget eredményezi:
<?xml version="1.0" encoding="utf-16" standalone="yes"?>
Következhet a megadott mappáról az információ gyűjtése. Ehhez egy DirectoryInfo osztályt használunk fel.
Dim di As New DirectoryInfo(directory)
Dim b As Boolean = True
Egy ciklus segítségével végigmegyünk az összes mappában talált elemen.
For Each fsi In di.GetFileSystemInfos()
A ciklusban csak egy alkalommal van szükség arra, hogy egy DirectoryList bejegyzést helyezzünk el az XML-ben. Itt egy attribútumban tároljuk, hogy melyik az a mappa, melyet feldolgoztunk.
If b = True Then
xtw.WriteStartElement("DirectoryList", "")
Dim sFullName As String = fsi.FullName
Dim sName As String = fsi.Name
Dim sDir As String = sFullName.Substring(0, sFullName.Length - sName.Length)
xtw.WriteAttributeString("dir", sDir)
b = False
End If
Fenti kód az alábbi eredményt szolgáltatja az XML-ben:
<DirectoryList dir="D:\So\Bso\0101\ListDir\">
E csomópont alá kerülnek a FileSystemInfo bejegyzések, melyből annyi lesz, ahány állományt, illetve almappát találunk a megadott mappán belül. Létrehozva a FileSystemInfo csomópontot, tároljuk alatta az összes szükséges információt az adott elemről.
xtw.WriteStartElement("FileSystemInfo", "")
xtw.WriteElementString("Name", fsi.Name)
...
Fenti kód az alábbi eredményt szolgáltatja az XML-ben:
<FileSystemInfo>
<Name>App.ico</Name>
<Created>2002.09.27. 13:22:32</Created>
<LastAccess>2002.09.27. 13:22:32</LastAccess>
<LastWrite>2002.09.27. 13:22:32</LastWrite>
<IsFile>True</IsFile>
<IsDir>False</IsDir>
<ReadOnly>False</ReadOnly>
</FileSystemInfo>
A ciklus végeztével csak zárnunk kell a megnyitott DirectoryList csomópontot, illetve az XML dokumentumot.
xtw.WriteEndElement()
xtw.WriteEndDocument()
Utolsó lépésként létrehozunk egy XmlDocument osztályt, melybe betöltjük a már létrehozott XML dokumentumot és ezt adjuk a függvény visszatérési értékének.
Dim sr As New StringReader(sw.ToString())
Dim xd As New XmlDocument()
xd.Load(sr)
Return xd
Most, hogy adott egy függvényünk, mely egy mappa tartalmát XML-ben adja vissza, így már egyszerű a helyzetünk, ha ezt nem XmlDocument formában szeretnék felhasználni, hanem sztringként. Ehhez készítünk egy GetDirInString nevű függvényt, mely meghívja az imént létrehozott GetDirContent függvényt. Így rendelkezésre áll az eredmény XmlDocument osztályban.
Public Shared Function GetDirInString(directory As String) As String
Dim s As String = ""
Dim xd As XmlDocument = GetDirContent(directory)
If Not (xd Is Nothing) Then
Ezek után egy StringWriter osztályt létrehozunk és ebbe a stream-be mentjük az XmlDocument tartalmát. Felhasználva a StringWriter osztály ToString függvényét, megkapjuk az XML dokumentumot sztringként.
Dim sw As New StringWriter()
xd.Save(sw)
s = sw.ToString()
End If
Return s
End Function 'GetDirInString
Nézzük most azt az esetet, amikor egy DataSet-ben szeretnénk az eredményt látni. Ehhez a GetDirInDataset függvényt készítjük el. Itt első lépésként egy sztringbe kérjük le az eredményt az előbbi GetDirInString függvényünkkel.
Ha ez adott, akkor létrehozunk egy XmlDataDocument osztályt, melynek DataSet property-jén keresztül feltöltjük a már rendelkezésre álló XML-t. Így rendelkezésünkre áll egy DataSet, melyet már csak vissza kell adnunk.
Public Shared Function GetDirInDataset(directory As String) As DataSet
Dim s As String = GetDirInString(directory)
Dim xdd As New XmlDataDocument()
xdd.DataSet.ReadXml(New StringReader(s))
Return xdd.DataSet
End Function 'GetDirInDataset
A felhasználáshoz attól függően, hogy milyen típusú adatra van szükségünk, használhatjuk a különböző függvényeket. Például egy DataGrid-ben történő adatmegjelenítéshez a DataSet típust szolgáltató függvényt használjuk fel.
Private Sub button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles button1.Click
textBox2.Text = ListDirToXml.GetDirInString(textBox1.Text)
dataGrid1.DataSource = ListDirToXml.GetDirInDataset(textBox1.Text)
dataGrid1.DataMember = "FileSystemInfo"
End Sub 'button1_Click