最近在做一个更新程序,主要是Ftp下载完成程序更新任务,下面是开发环境,和测试环境
开发环境:
开发工具:Visual Studio 2010
系统环境:windows server 2008(64)
Ftp:本机windows server 2008下搭建的Ftp服务器测试环境:
本机,win 7虚拟机(本机中安装)、.exe程序和.txt文本文件,
.exe文件是也在同样的平台下写的一个输出小程序(编译时目标平台选的是“Any CPU”)。我遇到的问题是:
从Ftp中下载下来的程序(.exe)不能使用,下面是提示:
本机提示为:"此文件的版本与正在运行的windows版本不兼容。请检查计算机的系统信息以了解需要x86还是x64...."。
在win 7虚拟机中却报: "Program too big to fit into memory"。
在上面两个测试环境中.txt文本文件能下载并里面有数据。可奇怪的是,我在本机中直接运行(.exe),没有任何错误提示,而且用达到预期的结果,但通过更新程序就报上面的的提示:“此文件的版本与正在运行的……”.
在win7虚拟机中,如果不通过更新程序,直接从Ftp上下载下来,运行没有错误,但通过更新程序却报上面提到的错误:“Program too big...”
下面是我主要用到的代码:
Stream responseStream = null;
StreamReader readStream = null;
StreamWriter writeStream = null;
FtpWebRequest ftpReq = null;
FtpWebResponse webRes = null;
string userName = updaterXmlFiles.GetNodeValue("//Account/UserName"); //XML中ft中登录名
string passWord = updaterXmlFiles.GetNodeValue("//Account/Pwd"); //XML中ft中登录密码
foreach (ListViewItem item in lvUpdateList.Items)
{
try
{
ftpReq = (FtpWebRequest)FtpWebRequest.Create(updateFileUrl);//uri
ftpReq.Credentials = new NetworkCredential(userName,passWord);//ftp用户名与密码
ftpReq.UseBinary = true;
ftpReq.Method = WebRequestMethods.Ftp.DownloadFile; //指定操作
webRes = (FtpWebResponse)ftpReq.GetResponse(); responseStream = webRes.GetResponseStream();
readStream = new StreamReader(responseStream, System.Text.Encoding.Default);
writeStream = new StreamWriter(tempUpdatePath + item.Text.Trim(), false);
writeStream.Write(readStream.ReadToEnd());
}
catch
{}
finally
{
if (responseStream == null)
{
responseStream.Flush(); responseStream.Close(); responseStream.Dispose();
}
if (readStream == null)
{
readStream.Close(); readStream.Dispose();
}
if(writeStream == null)
{
writeStream.Flush();writeStream.Close(); writeStream.Dispose();
}
}
}呵呵,不好意思,篇幅可能有点长,我想请问一下各位大侠 :这个问题出在什么地方,代码?Ftp服务器,还是其他?有什么解决办法。
开发环境:
开发工具:Visual Studio 2010
系统环境:windows server 2008(64)
Ftp:本机windows server 2008下搭建的Ftp服务器测试环境:
本机,win 7虚拟机(本机中安装)、.exe程序和.txt文本文件,
.exe文件是也在同样的平台下写的一个输出小程序(编译时目标平台选的是“Any CPU”)。我遇到的问题是:
从Ftp中下载下来的程序(.exe)不能使用,下面是提示:
本机提示为:"此文件的版本与正在运行的windows版本不兼容。请检查计算机的系统信息以了解需要x86还是x64...."。
在win 7虚拟机中却报: "Program too big to fit into memory"。
在上面两个测试环境中.txt文本文件能下载并里面有数据。可奇怪的是,我在本机中直接运行(.exe),没有任何错误提示,而且用达到预期的结果,但通过更新程序就报上面的的提示:“此文件的版本与正在运行的……”.
在win7虚拟机中,如果不通过更新程序,直接从Ftp上下载下来,运行没有错误,但通过更新程序却报上面提到的错误:“Program too big...”
下面是我主要用到的代码:
Stream responseStream = null;
StreamReader readStream = null;
StreamWriter writeStream = null;
FtpWebRequest ftpReq = null;
FtpWebResponse webRes = null;
string userName = updaterXmlFiles.GetNodeValue("//Account/UserName"); //XML中ft中登录名
string passWord = updaterXmlFiles.GetNodeValue("//Account/Pwd"); //XML中ft中登录密码
foreach (ListViewItem item in lvUpdateList.Items)
{
try
{
ftpReq = (FtpWebRequest)FtpWebRequest.Create(updateFileUrl);//uri
ftpReq.Credentials = new NetworkCredential(userName,passWord);//ftp用户名与密码
ftpReq.UseBinary = true;
ftpReq.Method = WebRequestMethods.Ftp.DownloadFile; //指定操作
webRes = (FtpWebResponse)ftpReq.GetResponse(); responseStream = webRes.GetResponseStream();
readStream = new StreamReader(responseStream, System.Text.Encoding.Default);
writeStream = new StreamWriter(tempUpdatePath + item.Text.Trim(), false);
writeStream.Write(readStream.ReadToEnd());
}
catch
{}
finally
{
if (responseStream == null)
{
responseStream.Flush(); responseStream.Close(); responseStream.Dispose();
}
if (readStream == null)
{
readStream.Close(); readStream.Dispose();
}
if(writeStream == null)
{
writeStream.Flush();writeStream.Close(); writeStream.Dispose();
}
}
}呵呵,不好意思,篇幅可能有点长,我想请问一下各位大侠 :这个问题出在什么地方,代码?Ftp服务器,还是其他?有什么解决办法。
???
这里有可能要调试下,搞不好出在这里了。
没有问题呀,编译都能过。而且目前就下载.exe文件,和.txt文件,dll类库文件还没试,如果这里有问题,就会报错或txt文件就没数据。
Control.CheckForIllegalCrossThreadCalls = false;
Stream responseStream = null;
FtpWebRequest ftpReq = null;
FtpWebResponse ftpRes = null;
FileStream fileStr = null; string userName = updaterXmlFiles.GetNodeValue("//Account/UserName"); //ftp登录用户名
string passWord = updaterXmlFiles.GetNodeValue("//Account/Pwd"); //ftp登录密码
foreach (ListViewItem item in lvUpdateList.Items)
{
try
{
string UpdateFile = item.Text.Trim();
string updateFileUrl = "ftp://" + updateUrl + "//" + item.Text.Trim();
ftpReq = (FtpWebRequest)FtpWebRequest.Create(updateFileUrl);//uri
ftpReq.Credentials = new NetworkCredential(userName, passWord);//用户名与密码
ftpReq.EnableSsl = false;
ftpReq.UseBinary = true;
ftpReq.KeepAlive = false;
ftpReq.Method = WebRequestMethods.Ftp.DownloadFile; //指定操作
ftpRes = (FtpWebResponse)ftpReq.GetResponse();
string s = tempUpdatePath;
responseStream = ftpRes.GetResponseStream();
int bufferSize = 2048;
byte[] buffer = new byte[bufferSize];
fileStr = new FileStream(tempUpdatePath + item.Text.Trim(), FileMode.Create);
int readCount;
readCount = responseStream.Read(buffer, 0, bufferSize); while (readCount > 0)
{
fileStr.Write(buffer, 0, readCount);
readCount = responseStream.Read(buffer, 0, bufferSize);
}
responseStream.Close();
fileStr.Close();
ftpRes.Close();
item.SubItems[2].Text = "√";//成功
}
catch
{
item.SubItems[2].Text = "×";//失败
}
finally
{
if (responseStream != null)
{
responseStream.Flush(); responseStream.Close(); responseStream.Dispose();
}
if (fileStr != null)
{
fileStr.Close(); fileStr.Dispose();
}
if (ftpRes != null)
{
ftpRes.Close();
}
} }
参考自http://topic.csdn.net/u/20100514/18/7527fd77-0f4a-4e6e-8615-328146c99db8.html