如题,部分代码如下:long fileLength;
                string server = string.Format(@"{0}/Update/AutoUpdate.xml", ConfigurationManager.AppSettings["ServerUpdateAddress"]);
                string client = string.Format("{0}\\{1}", Directory.GetCurrentDirectory(), ConfigurationManager.AppSettings["ClientUpdateAddress"]);
                WebRequest request = WebRequest.Create(server);
                WebResponse response = request.GetResponse();
                fileLength = response.ContentLength;
                Stream stream = response.GetResponseStream();
                StreamReader reader = new StreamReader(stream);
                byte[] byteData = new byte[fileLength];
                //int allDataLength = byteData.Length;
                //int startDataLength = 0;                FileStream file = new FileStream(client, FileMode.OpenOrCreate);
                file.Write(byteData, 0, byteData.Length);
                file.Flush();                stream.Close();
                reader.Close();
                file.Close();
主要是从服务器端读取文件写入到本地的一个文件夹中,server变量是服务器url地址,client是本地存放文件的地址

解决方案 »

  1.   

    根据错误提示很明显client的值是"",为空
      

  2.   

    to herojams:
      额,那个路径太长了,所以我省略掉了,不是空的
      

  3.   

    to robin871014:
      具体有示例代码吗?我没做过这种,是第一次做,请指点一下
      另外,这个问题要怎么解决才好,我在网上看的都是这样写的代码~~为什么我这里会出这种问题呢?写到本地难道文件夹还要设置权限,应该不用吧,那每次安装程序之后不是都要到安装目录里把文件夹设置权限,这样很不人性化啊
      
      

  4.   

    to JGood:
      这个我可以肯定,文件夹是空的~~
      

  5.   

    WebRequest request = WebRequest.Create(server);
    ====>
    你要把文件保存到哪里去?ftp? 
      

  6.   

    to JGood:
      server是服务器端空间文件的url,如:http://www.mymange.cn/Update/AutoUpdate.xml
      要把这个xml文件保存到本地电脑上的Update文件夹中
      

  7.   

    server是服务器端空间文件的url,如:http://www.mymange.cn/Update/AutoUpdate.xml
      要把这个xml文件保存到本地电脑上的Update文件夹中
    ====>
    这样我觉得不太可行,我没有看到过直接使用一个http网址来向其写数据的。但可以通过C#发送Http请求,把数据Post到指定站点上。但这样做似乎太麻烦。要把这个xml文件保存到本地电脑上的Update文件夹中
    ====> 为什么不直接Save到本地电脑上的Update文件夹呢?
      

  8.   


    什么方法能Save到本地电脑上,我在网上找了好久才找到上面那个方法,别的没见过
      

  9.   

    代码看不出问题,应该还是权限的问题。
    写到本地文件夹也要设置权限,这样做并非不人性化,而是出于安全性的考虑。IIS用Network Service这个账号运行,所以你检查下client目录是否有NetworkService这个账号的写权限。直接下载保存的方法是WebClient.DownloadFile方法,像这样写
    new WebClient().DownloadFile(server,client);
    你可以试下,不过这个方法差不多只是把你写的那几句话打包封装了一下,如果还是出错,基本上就可以肯定是权限问题了。
      

  10.   

    to jshi123:
      我觉得应该不是权限的问题吧,我把FileStream对象写为FileStream(client,FileMode.Create, FileAccess.Read, FileShare.ReadWrite);这样就没出错,但是创建出来的文件里面都是空值
      

  11.   

    to chen_ya_ping:
      我用FileStream对象的Write方法写入数据啦,数据是从byte[] byteData = new byte[fileLength];的数据写入的,我跟踪到这里,变量不是空的,说明里面是有值的
      

  12.   

    我把代码修改了一下,缺少了读取数据的步骤,但是还是同样的错误提示long fileLength;
                    string server = string.Format(@"{0}/Update/AutoUpdate.xml", ConfigurationManager.AppSettings["ServerUpdateAddress"]);
                    string client = string.Format("{0}\\{1}", Directory.GetCurrentDirectory(), ConfigurationManager.AppSettings["ClientUpdateAddress"]);
                    WebRequest request = WebRequest.Create(server);
                    WebResponse response = request.GetResponse();
                    fileLength = response.ContentLength;
                    Stream stream = response.GetResponseStream();
                    StreamReader reader = new StreamReader(stream);
                    byte[] byteData = new byte[fileLength];                stream.Read(byteData, 0, (int)fileLength);
                    //FileStream file = new FileStream(client, FileMode.OpenOrCreate);
                    FileStream file = new FileStream(client, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
                    file.Write(byteData, 0, byteData.Length);                file.Flush();
                    stream.Close();
                    reader.Close();
                    file.Close();
    不明白到底为什么会这样
      

  13.   

    把数据以文件的形式保存到一个url可以访问到的路径就可以让用户进行下载了。如果你的网站目录是d:\web,那么把数据保存到D:\Web\下,用户就可以下载了呀。
      

  14.   

    把那文件夹属性安全选项卡中添加everyone修改权限
      

  15.   

    我把客户端的路径改为这样,就可以了string client = string.Format("{0}\\{1}\\ZLXControl.GridSystem.pdb", Directory.GetCurrentDirectory(), ConfigurationManager.AppSettings["ClientUpdateAddress"]);服务器端的路径是这样string server = string.Format(@"{0}/Update/ZLXControl.GridSystem.pdb", ConfigurationManager.AppSettings["ServerUpdateAddress"]);
    就是要有文件名~~~但是如果我下载的是一个dll文件,覆盖掉原来的dll文件之后,程序就不能正常运行了,提示说该模块应该有一个程序集清单~~请问这又是怎么回事?
     分快没了,这个问题解决结贴的时候会追加分数给各位的,希望能解决这个问题~~
      

  16.   

    把SERVER的文件保存到客户端电脑上?这个得写activex来实现吧...不然只能让用户自行下载了。
      

  17.   

    ASP.NET实现迅雷下载文件
    http://hi.baidu.com/360desk/blog/item/4f4d61d7f583e42506088bb4.html
    讲的很详细你可以去看看
      

  18.   

    to robin871014
       你发那个是WEB的,我写的是WinForm的,那个是可以通用的吗?现在是能从服务器把文件读写下来到本地电脑,但是部分信息会丢失,就比如程序编译生成的dll文件,通过我那个代码读写下来的时候,就不能用了~~一般生成dll之后好像有个版本号,但是如果我那代码读写下来,那个版本号什么的就都没有了,我用记事本打开两个文件对比,坏的那个里面少了很多数据,但是两个文件大小都一样,好像读下来的时候很多都是空值了,不知道怎么回事?我是想把软件做成支持在线更新版本那样的,我的思路是我编译生成新的dll,然后上传到服务器空间,客户通过我的软件从服务器空间把dll文件下载到软件的安装目录覆盖掉原来的dll完成升级
      

  19.   

    to fhjzgsy
      晕啊大哥,你看下我25楼的回复吧
      

  20.   

    写入权限 将那个写入的文件夹的权限改为everyone 试试
      

  21.   


    dll文件要保证没有被加载,被加载以后是锁上的
      

  22.   


    这里的加载指的是运行EXE程序之后,程序在使用的意思吗?如果是这样,我在覆盖原来的DLL文件时会让程序关闭的
      

  23.   


    你随便找个什么程序看看,只要有自动更新的,都会有另外的APP。
    就是说有个主应用程序,还有一个update.exe.这是一个单独的应用程序。
    不可能主程序和app集成在一个程序中,因为只要主程序启动,就会调用引用的资源如DLL,等,这些资源北占用着怎么可能被替换呢
      

  24.   


    是的啊,就如你所说的那样,但是我是通过主程序调用Update.exe出来执行,同时关闭掉主程序,这个时候只有Update.exe在运行,而且dll文件只有主程序在用,升级的时候主程序已经被我关闭了,所以能替换掉唉,我晚上下班回家再捣鼓捣鼓吧
      

  25.   

    to jshi123
     我用你说的WebClient就没问题了,可以下载到本地~~~
    WebClient client = new WebClient();
                    client.Credentials = new NetworkCredential("****", "****");                client.DownloadFile("http://www.mymangeoo.cn/Update/ZLXControl.GridSystem.dll", string.Format("{0}\\Update\\ZLXControl.GridSystem.dll", Directory.GetCurrentDirectory()));
    这样是不是就证明不是权限的问题了?
      

  26.   

    证明不是写入权限的问题,这一点我看你上面的帖子自己也发现了。BTW. 在ASP.NET版发帖是关于Windowns应用的,最好声明一下,否则默认是会被当作WebForm的。权限问题只是针对IIS的Web应用才会比较容易发生问题,我看上面有很多人可能都是这样误会了。
      

  27.   

    to jshi123
      下次注意,唉,主要是到C#版块发,回复的人数要比这边少,我等不及呀,呵呵