现在百度云下载限速使得很多用户头疼,会员一个月30不得不说有点太黑了。所以Github上就有老哥用Go语言开发了BaiduPCS-Go工具(Github地址:https://github.com/iikira/BaiduPCS-Go)突破百度云的限速。但是对于一般的小白来说,这个工具使用太晦涩难懂了。所以我用C#给这个工具写了一个UI,添加了一些基本功能,使得使用尽量方便一点。这个项目的所有源码,我都托管在了在了Github上。地址是https://github.com/HallDaveNineteenNintysix/BaiduPCS-Go_Visible_tool 。在此文章我说一下整体的设计逻辑和代码。
原工具:纯命令行,交互性不好,并且对小白来说很复杂。
本软件:设计了UI,使得主要功能操作简便。软件UI逻辑很简单,只添加了基本的功能和按钮。缺点就是还不够美观。
作为一个网盘下载工具,最重要的就是下载的功能实现。原工具是命令行,所以下载需要输入一串命令,比较不方便,对于小白来说更是无从下手。所以我们使用Process来创建进程并且进行交互。
登录功能:我们创建进程后,使用参数“login”后,需要按提示输入账号密码以及验证码。
Process P = new Process();
P.StartInfo.FileName = "BaiduPCS-Go.exe";
P.StartInfo.Arguments="login";
P.Start();
登出功能:同理,登出也类似上面,但是我们不需要看到进程,因为这个过程不需要输入内容,所以只需要参数“logout”就行了
DialogResult dr = MessageBox.Show("确认退出?", "提示", MessageBoxButtons.OKCancel);
//确认退出
if (dr == DialogResult.OK) {
P.StartInfo.Arguments = "logout";
P.StartInfo.CreateNoWindow = true;
P.Start();
P.StandardInput.WriteLine("y");
P.Close();
MessageBox.Show("退出成功!", "提示");
}
注意此处由于使用了标准输入输出流,所以需要重定向:
P.StartInfo.RedirectStandardInput = true;
P.StartInfo.RedirectStandardOutput = true;
//原工具使用的是UTF8,所以重定向时需要指定UTF8以防止程序乱码
P.StartInfo.StandardOutputEncoding = System.Text.Encoding.UTF8;
显示文件:只有一个参数“ls”,并且重定向后读取标准输出就行了。
P.StartInfo.Arguments = "ls";
P.Start();
TextBox1.Text=P.StandardOutput.ReadToEnd();
下载文件:下载的命令是“d File_Dir / File_Name”
P.StartInfo.Arguments = "d " + textDowns.Text;
//由于需要开到下载进程,所以让进程窗口可见
P.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
P.Start();
切换路径:路径切换使用“cd dir”就行了,回主目录的dir是“/”.
P.StartInfo.Arguments = "cd " + textDir.Text;
P.Start();
截取文件(夹)名称:这个程序最复杂也是最重要的地方就是文件名的获取。原工具使用不方便的一点也是在这里。我, 需要通过读入标准输出流,按行读入后使用string.Substring(index,length),分割出文件名。根目录下index是42,其他目录下是40.以下是分割的代码。判断当前目录的方法类似,然后添加个判断把line.Length>40就行了。
StringReader sr = new StringReader(FileNames);
while ((line = sr.ReadLine()) != null)
{
if (line.Length > 42)
//这一行判断是否是文件名行,非文件名行length都小于42/40,因为其他行会导致Substring异常。
{
//GetFile/FolderName
line = line.Substring(41, line.Length - 41);
//从第42位截取到字符串尾部。
}
}
获取文件(夹)名把得到的文件名添加到ListBox,并且在选取ListBox.Items后添加到文本框。
this.listBox1.Items.Add(line);
//由于最后一行总是显示当前目录信息也会显示到ListBox,所以删除最后一项。
this.listBox1.Items.RemoveAt(this.listBox1.Items.Count-1);
本软件的设计和实现是没有什么复杂的地方的。只要善于动脑分析,每一部分都很容易实现出来。
在此也感谢原作者iikira的BaiduPCS-Go。因为本软件的所有功能都是基于这个工具实现的。
作者:HallDave
2018-09-01