我正在为游戏开发一个启动器/更新程序。 updater从服务器上的xml文件获取它的数据。直到现在我的代码(其中有一些来自其他代码的引用)工作得很好。我测试了它并且它下载了文件就好了,但是,我用来测试它的文件是jpg的。启动器需要下载的实际文件是一系列字符,例如:(e)xP7,iIlM7Q8 =& @ vR2-sv~] 9.5 下载这些时,每次都会抛出异常。我对C#并不擅长,所以我觉得我总是在找到答案的地方寻求帮助。 ;)
我的XML示例:
<theupdates>
<update>
<version>1.1</version>
<file>(e}xP7,iIlM7Q8=&@vR2-sv~]9.5.$}t]8</file>
<path>http://test.m-containers.com/Updates/</path>
</update>
<update>
<version>1.1</version>
<file>;V;xP,S]PXKr8;{(8HO2NJ H-g;PAo_yTuIV</file>
<path>http://test.m-containers.com/Updates/</path>
</update>
<update>
<version>1.1</version>
<file>^_HZpQ;Xpi{QS`Ku,}@#B}JYW}Q+;gdO0</file>
<path>http://test.m-containers.com/Updates/</path>
</update>
<update>
<version>1.1</version>
<file>{G'A4l7O8]~nb(a!mrK5hE)o</file>
<path>http://test.m-containers.com/Updates/</path>
</update>
</theupdates>
我的c#代码示例:
string Root = AppDomain.CurrentDomain.BaseDirectory;
XDocument serverXml = XDocument.Load(@"http://test.m-containers.com/Updates/Updates.xml");
foreach (XElement update in serverXml.Descendants("update"))
{
string version = update.Element("version").Value;
string file = update.Element("file").Value;
string path = update.Element("path").Value;
string sUrlToReadFileFrom = path + "V" + version + "/" + file;
string sFilePathToWriteFileTo = Root + "\\Resource\\" + file;
Uri url = new Uri(sUrlToReadFileFrom);
System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);
System.Net.HttpWebResponse response = (System.Net.HttpWebResponse)request.GetResponse();
response.Close();
Int64 iSize = response.ContentLength;
Int64 iRunningByteTotal = 0;
using (System.Net.WebClient client = new System.Net.WebClient())
{
using (System.IO.Stream streamRemote = client.OpenRead(new Uri(sUrlToReadFileFrom)))
{
using (Stream streamLocal = new FileStream(sFilePathToWriteFileTo, FileMode.Create, FileAccess.Write, FileShare.None))
{
int iByteSize = 0;
byte[] byteBuffer = new byte[iSize];
while ((iByteSize = streamRemote.Read(byteBuffer, 0, byteBuffer.Length)) > 0)
{
streamLocal.Write(byteBuffer, 0, iByteSize);
iRunningByteTotal += iByteSize;
double dIndex = (double)(iRunningByteTotal);
double dTotal = (double)byteBuffer.Length;
double dProgressPercentage = (dIndex / dTotal);
int iProgressPercentage = (int)(dProgressPercentage * 100);
Downloader.ReportProgress(iProgressPercentage);
}
streamLocal.Close();
}
streamRemote.Close();
}
}
}
有没有办法拥有它,基本上,当它读取这些字符时不会发脾气,或者可能更合理,更好的方法来解决这个问题?
我感谢任何人都可以提供的任何见解。
答案 0 :(得分:1)
有没有办法拥有它,基本上,当它读取这些字符时不会发脾气,或者可能更合理,更好的方法来解决这个问题?
是。使其成为有效的XML文件。这不是有效的XML:
<file>(e}xP7,iIlM7Q8=&@vR2-sv~]9.5.$}t]8</file>
&
应为&
。
我的猜测是服务器没有使用正确的XML API来生成XML - 它只是以愚蠢的方式写出文本。永远不要那样做。在操作XML时,总是使用XML API,因此它会为您处理这类事情。
你不应该必须在客户端上解决这个问题 - 为什么阅读这些数据的所有内容都应该包含一个破碎的作者?目前尚不清楚你是否掌控了服务器代码(在这种情况下你应该修改它)或者它是否是第三方代码(在这种情况下你应该非常大声地对它们大喊大叫)。无论哪种方式,当公然不公开某些东西时,只是一个坏主意。