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

     

  • 相关阅读:
    oracleI基础入门(6)sql语句Substring Crazy
    oracleI基础入门(7)table约束 Crazy
    oracleI基础入门(7)table视图 Crazy
    SQL附加分离数据库(命令)
    双截棍 C语言版 (超搞笑)
    AspNetPage分页(repeater),自己做的例子基本代码
    记录
    RegularExpressionValidator控件中正则表达式用法
    20 个经典的 Ajax + CSS 表格
    GridView各个事件中,怎样获取主键值
  • 原文地址:https://www.cnblogs.com/lknlfy/p/3021612.html
Copyright © 2011-2022 走看看