niples
17-03-2008, 09:38
Salve a tutti,
vi scrivo per un aiuto su un programmino che sto realizzando.
La classe che vi incollo sotto scansiona le directory del filesystem partendo da una cartella iniziale (StartFolder) e crea un file XML con l'albero delle cartelle fino alla profondità massima.
Vorrei modificarla in modo da passargli anche un valore int che indica il livello delle cartelle da scansionare. Ovvero se l'int =0 lui crea il file XML con il solo nodo ROOT equivalente alla prima cartella (la StartFolder per intenderci), se l'int = 1 scende l'albero di un livello, se l'int = 2 di 2 livelli e così via.
Ho fatto qualche prova ma non riesco ad ottenere il risultato desiderato.
qualcuno può darmi una mano?
grazie infinite
namespace ScansioneCartelle
{
/// <summary>
/// Summary description for FileSystemInfoLister.
/// </summary>
public class FileSystemInfoListerLivello {
XmlDocument xmlDoc;
public FileSystemInfoListerLivello() {
xmlDoc = new XmlDocument();
}
public XmlDocument GetFileSystemInfoList(string StartFolder) {
try{
XmlDeclaration xmlDec = xmlDoc.CreateXmlDeclaration("1.0", "", "yes");
xmlDoc.PrependChild ( xmlDec );
XmlElement nodeElem = XmlElement("folder",new DirectoryInfo(StartFolder).Name);
xmlDoc.AppendChild(AddElements(nodeElem,StartFolder));
}
catch(Exception ex) {
xmlDoc.AppendChild(XmlElement("error",ex.Message));
return xmlDoc;
}
return xmlDoc;
}
private XmlElement AddElements(XmlElement startNode, string Folder){
try{
DirectoryInfo dir = new DirectoryInfo(Folder);
DirectoryInfo[ subDirs = dir.GetDirectories() ;
foreach (DirectoryInfo sd in subDirs) {
XmlElement folderElem = XmlElement("folder",sd.Name);
startNode.AppendChild(AddElements(folderElem,sd.FullName));
}
return startNode;
}
catch(Exception ex) {
return XmlElement("error",ex.Message);
}
}
private XmlAttribute XmlAttribute(string attributeName, string attributeValue){
XmlAttribute xmlAttrib = xmlDoc.CreateAttribute(attributeName);
xmlAttrib.Value = FilterXMLString(attributeValue);
return xmlAttrib;
}
private XmlElement XmlElement(string elementName, string elementValue){
XmlElement xmlElement = xmlDoc.CreateElement(elementName);
xmlElement.Attributes.Append(XmlAttribute("name", FilterXMLString(elementValue)));
return xmlElement;
}
private string FilterXMLString(string inputString){
string returnString = inputString;
if (inputString.IndexOf("&") > 0){
returnString = inputString.Replace("&","&");
}
if (inputString.IndexOf("'") > 0){
returnString = inputString.Replace("'","'");
}
return returnString;
}
}
}
Richiamo GetFileSystemInfoList con questo codice e salvo il risultato in un file XML:
string pathRisultati = arrivo + "/" + nomefile + ".xml";
StreamWriter sw = File.CreateText(pathRisultati);
FileSystemInfoListerLivello dl = new FileSystemInfoListerLivello();
sw.Write(dl.GetFileSystemInfoList(partenza).InnerXml);
sw.Close();
vi scrivo per un aiuto su un programmino che sto realizzando.
La classe che vi incollo sotto scansiona le directory del filesystem partendo da una cartella iniziale (StartFolder) e crea un file XML con l'albero delle cartelle fino alla profondità massima.
Vorrei modificarla in modo da passargli anche un valore int che indica il livello delle cartelle da scansionare. Ovvero se l'int =0 lui crea il file XML con il solo nodo ROOT equivalente alla prima cartella (la StartFolder per intenderci), se l'int = 1 scende l'albero di un livello, se l'int = 2 di 2 livelli e così via.
Ho fatto qualche prova ma non riesco ad ottenere il risultato desiderato.
qualcuno può darmi una mano?
grazie infinite
namespace ScansioneCartelle
{
/// <summary>
/// Summary description for FileSystemInfoLister.
/// </summary>
public class FileSystemInfoListerLivello {
XmlDocument xmlDoc;
public FileSystemInfoListerLivello() {
xmlDoc = new XmlDocument();
}
public XmlDocument GetFileSystemInfoList(string StartFolder) {
try{
XmlDeclaration xmlDec = xmlDoc.CreateXmlDeclaration("1.0", "", "yes");
xmlDoc.PrependChild ( xmlDec );
XmlElement nodeElem = XmlElement("folder",new DirectoryInfo(StartFolder).Name);
xmlDoc.AppendChild(AddElements(nodeElem,StartFolder));
}
catch(Exception ex) {
xmlDoc.AppendChild(XmlElement("error",ex.Message));
return xmlDoc;
}
return xmlDoc;
}
private XmlElement AddElements(XmlElement startNode, string Folder){
try{
DirectoryInfo dir = new DirectoryInfo(Folder);
DirectoryInfo[ subDirs = dir.GetDirectories() ;
foreach (DirectoryInfo sd in subDirs) {
XmlElement folderElem = XmlElement("folder",sd.Name);
startNode.AppendChild(AddElements(folderElem,sd.FullName));
}
return startNode;
}
catch(Exception ex) {
return XmlElement("error",ex.Message);
}
}
private XmlAttribute XmlAttribute(string attributeName, string attributeValue){
XmlAttribute xmlAttrib = xmlDoc.CreateAttribute(attributeName);
xmlAttrib.Value = FilterXMLString(attributeValue);
return xmlAttrib;
}
private XmlElement XmlElement(string elementName, string elementValue){
XmlElement xmlElement = xmlDoc.CreateElement(elementName);
xmlElement.Attributes.Append(XmlAttribute("name", FilterXMLString(elementValue)));
return xmlElement;
}
private string FilterXMLString(string inputString){
string returnString = inputString;
if (inputString.IndexOf("&") > 0){
returnString = inputString.Replace("&","&");
}
if (inputString.IndexOf("'") > 0){
returnString = inputString.Replace("'","'");
}
return returnString;
}
}
}
Richiamo GetFileSystemInfoList con questo codice e salvo il risultato in un file XML:
string pathRisultati = arrivo + "/" + nomefile + ".xml";
StreamWriter sw = File.CreateText(pathRisultati);
FileSystemInfoListerLivello dl = new FileSystemInfoListerLivello();
sw.Write(dl.GetFileSystemInfoList(partenza).InnerXml);
sw.Close();