本帖最后由 _菜鸟玩手机 于 2014-7-1 16:36 编辑
作为一名程序猿,我玩了好几天荣耀立方,然后抱着探索的想法来玩荣耀立方,虽然失败了,但是还是要把探索的过程发出来,结果不重要重要的是过程。大家集思广益争取多玩出几种可能。好了,不多说了,下面我给大家分享我的教程吧,希望高手指导一二。 我的思维是这样的:荣耀立方的硬盘有1T,空间非常大,而且通过工具就可以在电脑上看到立方的盘,然后可以把立方的空间一部分作为FTP,然后通过代码来检测,如果网盘中有新的文件,那么就直接下载到本地。 想到这里,我就开始着手配置环境并且写代码了。 1.配置本机FTP环境 这里配置FTP环境没什么难度,度娘一下“FTP搭建”然后跟着教程一步一步做下去就行,这里就不再赘述,这里主要放在代码上。 2.用代码实现: 首先我没把路由盘作为FTP,现在本地建立做测试用。(从这里我就错了)不过最后效果还是不错,可以将本地一个FTP中的文件夹中的文件下载(如果有新文件也下载),下面来展示一下效果图。
特别说明:效果图显示的是从电脑上的测试文件夹下载文件到FTP文件夹,这样是成功的! 但是当在程序中把测试文件夹建立在华为路由网盘中,就会失败,下载不到,显示不到权限。 代码开发环境: VS2012 C#语言 由于时间紧迫和个人能力有限,这次探索第七个失败了,但是我相信有大神可以将我的程序修改并成功。朋友们不懂得可以问我,和我交流。 部分核心代码:(如想看源码请在楼下留言留下邮箱)时间紧迫,代码没加注释望谅解! private void DownloadMutifiles(string subFolder) { string ftpUrl = this.Configuration.LocalAddress.ToString(); string downUrl = "ftp://" + ftpUrl + @"/" + subFolder + @"/" string saveUrl = this.Configuration.DownAddress; List<string> files = new List<string>(); List<string> directories = new List<string>(); GetFileList(files, directories, downUrl); foreach (var filename in files) { if (_fileList.Contains(filename)) { continue; } _fileList.Add(filename); DownLoadFile(downUrl + filename, saveUrl + filename); Console.WriteLine(filename); } foreach (var item in directories) { DownloadMutifiles(subFolder + item); } }
public void DownLoadFile(string downloadUrl, string saveFileUrl) { Stream responseStream = null; FileStream fileStream = null; StreamReader reader = null; try { FtpWebRequest downloadRequest = (FtpWebRequest)WebRequest.Create(downloadUrl); downloadRequest.Method = WebRequestMethods.Ftp.DownloadFile; string ftpUser = this.Configuration.UserName; string ftpPassWord = this.Configuration.UserPassWord; downloadRequest.Credentials = new NetworkCredential(ftpUser, ftpPassWord); FtpWebResponse downloadResponse = (FtpWebResponse)downloadRequest.GetResponse(); responseStream = downloadResponse.GetResponseStream(); fileStream = File.Create(saveFileUrl); byte[] buffer = new byte[1024]; int bytesRead; while (true) { bytesRead = responseStream.Read(buffer, 0, buffer.Length); if (bytesRead == 0) break; fileStream.Write(buffer, 0, bytesRead); } if (this.Configuration.FileCallback != null) { this.Configuration.FileCallback(saveFileUrl); } } catch (WebException ex) { int count = 1; if (count < 4) { Thread.Sleep(1000); DownLoadFile(downloadUrl, saveFileUrl); } } finally { if (reader != null) { reader.Close(); } if (responseStream != null) { responseStream.Close(); } if (fileStream != null) { fileStream.Close(); } } } public static string[] GetFilesList(string url) { string[] downloadFiles; StringBuilder result = new StringBuilder(); FtpWebRequest reqFTP; try { reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(url)); reqFTP.UseBinary = true; reqFTP.Credentials = new NetworkCredential("Administrator", "123123"); reqFTP.Method = WebRequestMethods.Ftp.ListDirectory; WebResponse response = reqFTP.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
string line = reader.ReadLine(); while (line != null) { result.Append(line); result.Append("\n"); line = reader.ReadLine(); } // to remove the trailing ´\n´ result.Remove(result.ToString().LastIndexOf(´\n´), 1);
reader.Close(); response.Close(); return result.ToString().Split(´\n´); } catch (Exception ex) { // System.Windows.Forms.MessageBox.Show(ex.Message); Console.Write(ex); downloadFiles = null; return downloadFiles; } } 最后,非常感谢大家,虽然探索失败了,但是我觉得过程要比结果更为重要,希望大家支持我!
|