应用程序的想法很简单,应用程序给出了一个路径,并且应用程序将每个文件的路径写入XML,我面临的问题是文件名可能有无效字符并且使应用程序停止工作,这里是我用来将文件信息解析为XML的代码:
// the collecting details method
private void Get_Properties(string path)
{
// Load the XML File
XmlDocument xml = new XmlDocument();
xml.Load("Details.xml");
foreach (string eachfile in Files)
{
try
{
FileInfo Info = new FileInfo(eachfile);
toolStripStatusLabel1.Text = "Adding : " + Info.Name;
// Create the Root element
XmlElement ROOT = xml.CreateElement("File");
if (checkBox1.Checked)
{
XmlElement FileName = xml.CreateElement("FileName");
FileName.InnerText = Info.Name;
ROOT.AppendChild(FileName);
}
if (checkBox2.Checked)
{
XmlElement FilePath = xml.CreateElement("FilePath");
FilePath.InnerText = Info.FullName;
ROOT.AppendChild(FilePath);
}
if (checkBox3.Checked)
{
XmlElement ModificationDate = xml.CreateElement("ModificationDate");
string lastModification = Info.LastAccessTime.ToString();
ModificationDate.InnerText = lastModification;
ROOT.AppendChild(ModificationDate);
}
if (checkBox4.Checked)
{
XmlElement CreationDate = xml.CreateElement("CreationDate");
string Creation = Info.CreationTime.ToString();
CreationDate.InnerText = Creation;
ROOT.AppendChild(CreationDate);
}
if (checkBox5.Checked)
{
XmlElement Size = xml.CreateElement("Size");
Size.InnerText = Info.Length.ToString() + " Bytes";
ROOT.AppendChild(Size);
}
xml.DocumentElement.InsertAfter(ROOT, xml.DocumentElement.LastChild);
// +1 step in progressbar
toolStripProgressBar1.PerformStep();
success_counter++;
Thread.Sleep(10);
}
catch (Exception ee)
{
toolStripProgressBar1.PerformStep();
error_counter++;
}
}
toolStripStatusLabel1.Text = "Now Writing the Details File";
xml.Save("Details.xml");
toolStripStatusLabel1.Text = success_counter + " Items has been added and "+ error_counter +" Items has Failed , Total Files Processed ("+Files.Count+")";
Files.Clear();
}
以下是生成详细信息后XML的外观:
<?xml version="1.0" encoding="utf-8"?>
<Files>
<File>
<FileName>binkw32.dll</FileName>
<FilePath>D:\ALL DLLS\binkw32.dll</FilePath>
<ModificationDate>3/31/2012 5:13:56 AM</ModificationDate>
<CreationDate>3/31/2012 5:13:56 AM</CreationDate>
<Size>286208 Bytes</Size>
</File>
<File>
我想要解析为XML而没有问题的字符示例:
BX] GC ^ O ^ _nI_C {jv_rbp&amp;1b_Hâ&amp; psolher d)做ိiniᖭ
icon_Áq偩侉₳㪏ံぞ鵃_䑋屡1]
MAnaFor줡
编辑[已解决的问题]
我所要做的就是: 1-将文件名转换为UTF8-Bytes 2-将UTF8-Bytes转换回字符串
以下是方法:
byte[] FilestoBytes = System.Text.Encoding.UTF8.GetBytes(Info.Name);
string utf8 = System.Text.Encoding.UTF8.GetString(FilestoBytes);
答案 0 :(得分:3)
目前尚不清楚你的哪些角色遇到了问题。只要您使用XML API(而不是尝试直接自己编写XML), 就可以使用任何有效的文本(破坏的代理对可能会导致问题),但是除了制表符,回车符和换行符之外,有效的是Unicode代码点小于空格(U + 0020)。它们根本不是用XML来满足的。
答案 1 :(得分:2)
可能是xml格式错误。 Xml文件在没有转义的情况下不能包含某些字符。 例如,这是无效的:
<dummy>You & Me</dummy>
相反,你应该使用:
<dummy>You & Me</dummy>
XML中的非法字符是&amp;,&lt;和&gt; (以及“或'在属性中)
答案 2 :(得分:1)
XML中的非法字符是&amp;,&lt;和&gt; (以及“或'在属性中)
在Windows上的文件系统中,您只能拥有&amp;并且'文件名中不允许使用文件名(&lt;,&gt;,“)
保存XML时,您可以转义这些字符。例如&amp;您需要&