首先第一篇先讲一讲launcher最核心的功能---下载功能。
这个部分估计得好几篇才能写完,东西比较多也比较杂,慢慢来吧,我的东西也在继续改进中。。。。。。
从web上下载文件需要用到几个类,HttpWebRequest(http请求)、HttpWebResponse(http应答),Stream(文件流),大致流程就是先创建一个请求,然后等待web服务器应答,这时候它会去找这个网址存在不存在,如果不存在就会报错,所以最好是放在try/catch块中防止程序崩掉。然后你就可以创建一个web请求流文件了。注意这里要创建两个流文件,一个是从web上获取应答的,一个是创建一个本地文件用于写入你请求到的数据们~~~然后就等着它获取数据吧。这里一定要注意的是因为是文件操作所以文件打开一次就要关闭一次,一定要关闭一定要关闭一定要关闭重要的事情说三遍,如果你不关闭的话就会出现数据丢失。
具体的就上代码吧,因为我自己也是这样,看人家的博文长篇大论没有代码的话结果就是依旧不会~~~
HttpWebRequest Myrqt = (HttpWebRequest)HttpWebRequest.Create(URL); HttpWebResponse Myrpe = (HttpWebResponse)Myrqt.GetResponse(); totalBytes = Myrpe.ContentLength; //从web响应上得到的总字节数,这个是为了做进度条 Stream st = Myrpe.GetResponseStream(); //从web请求创建流 Stream so = new FileStream(filePath + "\\" + FileName, FileMode.Create);//创建写文件流 byte[] by = new byte[1024]; int osize = st.Read(by, 0, (int)by.Length); while (osize > 0) { so.Write(by, 0, osize); osize = st.Read(by, 0, (int)by.Length); } so.Close(); st.Close();
现在一个文件的下载功能就做好了,但是我们不可能只下载一个文件,总不可能把所有文件的url都写一遍然后请求下载吧,这样如果web服务器上增加了新文件,整个launcher就得重新改了。。。。。。这就涉及到了我们之前所说的配置文件,配置文件有两个字段是必须要的,一个就是文件的路径,加上了你的web服务器的url就能变成下载地址了,一个是MD5码。
所以我们现在要跳到配置文件的生成上了吗?!好像这样有点乱又好像很有逻辑的样子~
好吧,我们先说说配置文件。
我这里所使用的配置文件是xml文件,当然你也可以用txt啊excel表啊,只是写入方法和读取方法不一样而已,我只讲xml文件,其他大家自己去探索吧。(其实是因为其它我也没用过不知道~~~)
我们需要用到两个namespace,System.Xml和System.IO,好吧只要你有文件操作必然要用到System.IO这个namespace的。现在我们假设你所有的要上传到web服务器的文件全部放在一个文件夹下,什么?不在一个文件夹下?那就放到一起吧,何苦为难你自己。。。。。。我们暂时把这个文件叫做总文件夹。
具体怎么创建我就不写了,主要是在写入的过程中你需要遍历文件夹中的所有文件包含其子文件,这需要用到递归,找到文件之后就创建一个节点,然后把它的FileInfo.DirectoryName作为你的节点的一个字段放入你的xml文件中,然后计算出它的MD5码作为另一个字段也放入这个节点下,然后就能看到效果啦。
但是这样你会发现一个问题,你的路径里面多了一段你的总文件夹的绝对路径,然而我们并不需要,总不会传到web上路径还带个盘目录吧,所以我们需要移除这一段。大家肯定说直接replace成空就好了啊,但是这里还有一个问题,如果你的总文件夹路径是直接写在代码里的话(例如D:\\myfile),在你的xml文件里的路径就会变成D:\myfile,这样你直接移除的话他就会找不到啦,所以你必须先把“\\”替换成@“\”(它是个转意符,要让它变成字符的话就要加@),然后再移除,“//”也一样,要转换成@“\”,不过你也可以试试直接传@“D:\mfile”,我没试过,或许可行?
这里就不上代码了,如果不会的话可以问我,我是不会告诉你们的~哈哈哈,没有啦,如果你是C#程序员,你一定比我清楚,如果你不是,度娘一定比我清楚~但是如果说你是窗体程序,总文件夹的路径是从窗口输入的话就不存在这个问题啦,它会自己识别成“\”的。。。。。。。
下面就是计算MD5码的方式。
public string CalculateMD5(string fileName) //计算MD5码,参数为文件名,返回值为MD5码 { try { FileStream file = new FileStream(filePath + "//" + fileName, FileMode.Open); System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); byte[] retVal = md5.ComputeHash(file); file.Close(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < retVal.Length; i++) { sb.Append(retVal[i].ToString("x2")); } return sb.ToString(); } catch (Exception ex) { throw new Exception("GetMD5HashFromFile() fail,error:" + ex.Message); } }
好啦,这一篇就到这了,我们下一篇再继续说~~~
转载请注明出处:http://www.cnblogs.com/shellxi/p/5553566.html