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 static XmlDocument GetDirContent(string directory)
{
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.
StringWriter sw = new StringWriter();
XmlTextWriter xtw = 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.
DirectoryInfo di = new DirectoryInfo(directory);
bool b = true;
Egy ciklus segítségével végigmegyünk az összes mappában talált elemen.
foreach (FileSystemInfo 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)
{
xtw.WriteStartElement("DirectoryList", "");
String sFullName = fsi.FullName;
String sName = fsi.Name;
String sDir = sFullName.Substring(0, sFullName.Length - sName.Length);
xtw.WriteAttributeString("dir", sDir);
b = false;
}
Fenti kód az alábbi eredményt szolgáltatja az XML-ben:
<DirectoryList dir="F:\So\Cso\0239\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);
xtw.WriteElementString("Created", fsi.CreationTime.ToString());
xtw.WriteElementString("LastAccess", fsi.LastAccessTime.ToString());
xtw.WriteElementString("LastWrite", fsi.LastWriteTime.ToString());
xtw.WriteElementString("IsFile", ((fsi.Attributes & FileAttributes.Directory) > 0) ? "False" : "True");
xtw.WriteElementString("IsDir", ((fsi.Attributes & FileAttributes.Directory) > 0) ? "True" : "False");
xtw.WriteElementString("ReadOnly", ((fsi.Attributes & FileAttributes.ReadOnly) > 0) ? "True" : "False");
xtw.WriteEndElement();
}
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.
StringReader sr = new StringReader(sw.ToString());
XmlDocument xd = 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 static string GetDirInString(string directory)
{
string s = "";
XmlDocument xd = GetDirContent(directory);
if (xd != null)
{
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.
StringWriter sw = new StringWriter();
xd.Save(sw);
s = sw.ToString();
}
return s;
}
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 static DataSet GetDirInDataset(string directory)
{
string s = GetDirInString(directory);
XmlDataDocument xdd = new XmlDataDocument();
xdd.DataSet.ReadXml(new StringReader(s));
return xdd.DataSet;
}
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 void button1_Click(object sender, System.EventArgs e)
{
textBox2.Text = ListDirToXml.GetDirInString(textBox1.Text);
dataGrid1.DataSource = ListDirToXml.GetDirInDataset(textBox1.Text);
dataGrid1.DataMember = "FileSystemInfo";
}