第五届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语言的理解和使用,这也是我参加这个比赛最想得到的东西。

 

原文地址:https://www.cnblogs.com/lknlfy/p/3021612.html