第五届SeedCoder编程大赛---简易网络硬盘
本着打酱油的心态,参加了学校微软俱乐部举办的第五届SeedCoder编程大赛,本来以为题目很难的,到赛题发布时才发现原来是做一个类似于网络硬盘的东西。心里一想,SQLite和boa服务器我本科的时候用过, html也有接触过,心想应该不难,于是就重拾之前学过的东东开始了这4天来的“奋斗”。下面是该作品的说明书内容,算是一个总结吧。
一、编译和测试环境
Linux:Ubuntu10.04-desktop-i386
gcc:4.4.3
SQlite:sqlite-autoconfig-3071601
Boa:boa-0.94.13
cgic:cgic205
浏览器:Google Chrome 25.0.1364.160;搜狗浏览器4.0.2
二、编译说明
所有程序的编译请在root用户下进行。
2.1 SQlite编译
进入源码根目录,执行以下命令:
#./configure
#make
#make install
#ldconfig
即可编译安装好SQlite数据库。
2.2 Boa编译
首先安装依赖工具bison和flex。
#apt-get install bison flex
(1)修改src/compat.h
找到
#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff
修改成
#define TIMEZONE_OFFSET(foo) (foo)->tm_gmtoff
(2)修改 src/log.c
注释掉
if (dup2(error_log, STDERR_FILENO) == -1)
{
DIE("unable to dup2 the error log");
}
为:
/*
if (dup2(error_log, STDERR_FILENO) == -1)
{
DIE("unable to dup2 the error log");
}
*/
(3)修改src/boa.c
注释掉下面两句话:
if (passwdbuf == NULL)
{
DIE(”getpwuid”);
}
if (initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1)
{
DIE(”initgroups”);
}
为:
/*
if (passwdbuf == NULL)
{
DIE(”getpwuid”);
}
if (initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1)
{
DIE(”initgroups”);
}
*/
注释掉:
if (setuid(0) != -1)
{
DIE(”icky Linux kernel bug!”);
}
为:
/*
if (setuid(0) != -1)
{
DIE(”icky Linux kernel bug!”);
}
*/
修改完后进入src目录,执行
#./configure
#make
即可生成boa可执行文件。把它拷贝到/usr/sbin目录下。
2.3 Boa配置
将boa根目录下的boa.conf文件拷贝到/etc/boa目录下,然后修改整个文件的内容为:
Port 80
User 0
Group 0
ErrorLog /var/log/boa/error_log
ServerName LKN
DocumentRoot /root/www
DirectoryIndex index.html
KeepAliveMax 1000
KeepAliveTimeout 10
MimeTypes /etc/mime.types
DefaultType text/plain
CGIPath /bin:/usr/bin:/usr/local/bin
ScriptAlias /cgi-bin/ /root/www/cgi-bin/
2.4 cgic编译
cgic不需要编译安装,只需要将其cgic.c和cgic.h文件拷贝到整个源程序的目录下即可。
2.5 整个源程序编译
进入源码目录source,执行make命令即可编译整个源程序,成功编译后会生成可执行文件msfile。
三、程序设计说明
3.1程序设计基本思想
本程序本着易于实现的思想,利用Linux的文件查找功能将一个目录下所有文件列举出来(不含隐藏文件和隐藏目录),再将该目录下的所有文件输出到浏览器供用户查看和操作。其中sqlite数据库用来记录最近一次的目录路径和操作(复制或剪切),cgic用来与boa服务器进行交互。程序一开始执行时先读取数据库信息,初始化两个全局变量,然后判断用户是否进行了操作,最后将操作结果返回给浏览器,因此每次操作完成后会自动刷新浏览器页面。
3.2程序流程图
3.3程序功能
(1)可以上传和下载文件(包含日期和文件大小)
(2)可以查看某个文件并选择下载。
(3)可以删除某个文件或文件夹。
(4)可以新建文件夹。
(5)可以在不同文件夹中移动文件或文件夹。
(6)可视化下载界面。
(7)WEB页面访问方式。
(8)欢迎界面、背景音乐。
(9)操作记录。每次打开浏览器时显示最近一次所在的目录的内容。
(10)操作提示。复制、剪切文件或文件夹都会有提示。
四、测试和使用说明
首先运行boa服务器,因为之前已经将boa可执行文件拷贝到/usr/sbin目录下了,所以可以在任意目录下执行下面的命令来启动boa。
#boa
成功运行如下:
(1)欢迎界面(我测试时使用chrome浏览器演示这个功能,搜狗浏览器的话要允许弹窗)
在chrome浏览器输入服务器的IP地址(我的是192.168.0.111),回车后会弹出一个页面,如下图,此时还会听到背景音乐。蓝色名字的代表文件夹,黑色名字的代表文件。
显示的文件和文件夹是我测试时放的。另外一个页面是欢迎界面,如下:
(2)文件上传和下载(搜狗浏览器)
点击页面中的“选择文件”按钮会弹出一个文件选择框,在windows下选择一个文件(excel.txt)后再点击“上传”按钮即可将文件上传到msFile网盘。
上传前:
上传后:
点击hello.patch后的“下载”按钮即可下载当前页面下的hello.patch文件。下载完成:
(3)删除文件或文件夹(搜狗浏览器)
点击hello.patch后面的“删除”按钮即可删除当前目录下的hello.patch文件。删除后:
点击hehe后面的“删除”按钮即可删除整个hehe目录。删除后:
(4)新建文件夹(搜狗浏览器)
在“新建文件夹”按钮前输入要新建的文件夹的名字,再点击“新建文件夹”按钮即可在当前目录下新建一个文件夹。例如创建mstest文件夹:
(5)查看某个文件夹(搜狗浏览器)
页面中蓝色字体的为文件夹,点击其后面的“打开”按钮即可进入该文件夹。例如打开haha文件夹:
点击“返回上一级”按钮即可返回到上一级目录(根目录下没有这个功能)。
(6)移动文件或文件夹(搜狗浏览器)
点击文件或文件夹后面的“复制”或“剪切”按钮后会有提示:
然后进入目的文件夹后,点击“粘贴”按钮即可完成文件或文件夹的复制或剪切。只需复制一次便可在多处粘贴(剪切没有这个功能)。
以上功能的测试结果都可通过查看Linux下的/root/www/msfile目录里的内容来确认。
/root/www/msfile目录是整个网盘的根目录。
总结:
一开始是想使用数据库来记录网盘上的所有文件的,后来发现这种方法不但复杂而且不太合理,最终使用了遍历Linux下某个文件的所有文件的方法来实现。匆匆忙忙把这个比赛做完了,至于美不美观,这一点都不重要,至少对我来说是这样的。对文件的操作其实可以只使用一条工具栏和checkbox来实现,而不用每一个文件都对应“剪切”、“复制”等这些按钮,由于对html、javascript了解不深并且这并不是我的兴趣所在,所以就没去优化了。收获最大的还是对C语言的理解和使用,这也是我参加这个比赛最想得到的东西。