最近在做一个更新程序,主要是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服务器,还是其他?有什么解决办法。

解决方案 »

  1.   

    readStream = new StreamReader(responseStream, System.Text.Encoding.Default);
     ???
    这里有可能要调试下,搞不好出在这里了。
      

  2.   

    谢谢您的关注。
    没有问题呀,编译都能过。而且目前就下载.exe文件,和.txt文件,dll类库文件还没试,如果这里有问题,就会报错或txt文件就没数据。
      

  3.   

    找到解决方案了:
        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