天天看點

作業系統實驗報告五

作業系統實驗報告五

                       姓名:許恺

                       學号:2014011329

                       日期:12.13

一.思路構想

關于這次的實驗我真的是摸不着頭腦,不知道到底讓做出一個什麼樣的東西來,感覺要求說的又清楚又模糊,聽過同學的解釋,應該是要做一個像Windows那樣的檔案系統,去管理我們有的10萬多個網頁,那既然是檔案管理系統,我就想到了以前做過的一個學生管理系統,應該差不多吧,雖然隻需要實作查詢功能,應該用終端實作就可以,是以我想的是用終端來實作流程的可視化,通過在記憶體中開辟巨大空間來實作檔案的管理。構造一個資料結構來存放檔案的屬性。

二.源代碼及結果貼圖

// webserver5.cpp : 定義控制台應用程式的入口點。
//

#include "stdafx.h"
#include "iostream"
#include "fstream"
#include "windows.h"
#include "string"
#include "time.h"
using namespace std;
struct FileStruct
{
    string Nam;    //檔案名稱
    FILETIME t;    //檔案建立時間,因使用需要,是以是FILETIME類型的
    string info;//檔案内容
};
struct FileStruct f[1000];
void Init1();
void ByName();
void ByTime();
string WORD2string(WORD w);
int main()
{
    int j;
    Init1();
    while (true)
    {
        cout << "請選擇檢索檔案方式:" << endl;//界面友好
        cout << "     1.檔案名檢索" << endl;
        cout << "     2.建立時間檢索" << endl;
        cout << "     0.退出系統" << endl;
        cin >> j;
        if (j == 0)  break;//0則退出
        else if (j == 1)//1則通過名字查詢
        {
            ByName();
        }
        else if (j == 2)//2則通過時間查詢
        {
            ByTime();
        }
        else {
            cout << "請選擇0,1,2中的一個!" << endl;
        }
    }
    return 0;
}
/*
***資料結構初始化
*/
void Init1()//我不明白為什麼到這就堆棧溢出了,彙編代碼也沒看懂
{
    int i;
    ifstream fp[1000];    //用10000個檔案讀的對象
    string which = "";
    string file[1000];
    LPCSTR s1;    //參數類型轉換
    WIN32_FIND_DATAA   filestruct;//搜尋檔案屬性
    handle_t  hf;    //句柄指針
    for (i = 0; i < 1000; i++)    //初始化,将1000個頁面的資訊讀到資料結構中
    {
        which = to_string(i);
        file[i] = "D:\\xukai\\學習\\作業系統實驗\\網頁\\" + which + ".html ";
        fp[i].open(file[i], std::ios::binary);
        //打開檔案失敗
        if (!fp[i].is_open())
        {
            cout << "請求檔案" << which + ".html" << "不存在" << endl;
        }
        else//打開檔案成功并讀取
        {
            f[i].Nam = which + ".html";
            s1= file[i].c_str();    //轉換參數類型
            //cout << s1<< endl;
            hf = FindFirstFileA(s1, &filestruct);//用一個特别的函數,在這裡我解決了函數參數類型問題,簡直太牛逼了!!!
            f[i].t = filestruct.ftLastWriteTime;//檔案上次修改時間     
            char buffer[1024];
            while (fp[i].good() && !fp[i].eof())
            {
                fp[i].getline(buffer, 1024);
                //将讀取的内容追加入info中
                f[i].info.append(buffer);
                buffer[0] = '\0'; 
            }
            fp[i].close();
        }
    }
    FindClose(hf);
}
/*
**通過檔案名搜尋檔案
*/
void ByName()
{
    string name;
    int i;
    cout << "請輸入要搜尋的檔案名:";
    cin >> name;
    for (i = 0; i < 1000; i++)
    {
        if (strcmp(name.c_str(), f[i].Nam.c_str()) == 0)//比較檔案名
        {
            cout << f[i].info << endl;//輸出檔案内容
            break;
        }
    }
    if (i == 1000) cout << "查無此檔案!或者輸入有誤" << endl;///報錯
}
/*
*****通過時間搜尋檔案
*/
void ByTime()
{
    string str, str1;//使用者輸入的時間字元串
    int i;
    //bool judge;  //判斷FileTimeToSystemTime函數是否成功
    SYSTEMTIME st;//用于類型轉換的
    cout << "請輸入要搜尋檔案的建立時間(格式為:YYYY-M-D):";
    cin >> str1;
    for (i = 0; i < 1000; i++)
    {
        FileTimeToSystemTime(&(f[i].t), &st);//将FILETIME轉換成SYSTEMTIME的
        //cout << judge << endl;
        st.wHour = (st.wHour+8) % 24;//解決類型轉換後慢8小時問題
        str = WORD2string(st.wYear) + "-" + WORD2string(st.wMonth) + "-" + WORD2string(st.wDay); /*調整格式轉化成string格式的*/
        //cout << str << endl;
        if (strcmp(str1.c_str(), str.c_str()) == 0)//比較找到檔案
        {
            cout << f[i].info << endl;
            break;
        }
    }
    if (i == 1000) cout << "查無此建立時間!或者輸入有誤" << endl;//報錯
}
/*
****WORD轉成string函數,自己寫的
*/
string WORD2string(WORD w)
{
    char tmpbuff[16];
    sprintf_s(tmpbuff, "%d", w);
    string res = tmpbuff;
    return res;
}      

我知道是因為我的靜态變量太大了,是以導緻了棧溢出,這個可以解決,但是下面的問題就解決不出來了:

作業系統實驗報告五

程式會在這裡死循環,我不太能看懂這裡的原因,是以報告就在這裡抛錨了。。GG

但是!!!!!!!!!!!!!!!

我的代碼又起死回生了23333!!

我知道問題的原因,于是我把資料改成了1000個,因為10000實在太大了,也怪我沒有用動态記憶體,于是我的代碼可以跑了,但是這還不算什麼,後面我又碰到了函數參數類型錯誤的問題,但是!!!都被我一一解決了,成就感爆棚!!無法描述我的喜悅和激動,恩就這樣。下面是我的結果貼圖:

作業系統實驗報告五
作業系統實驗報告五
作業系統實驗報告五
作業系統實驗報告五

三.分析與感悟

分析和感悟什麼的其實是有的,這次的報告實際上并不難,但是開始可能不太好了解他的意思,等我了解後就好寫了,占用的記憶體确實很大,也沒有用動态記憶體,很難的地方就是讀檔案的各種屬性,不過也學到好多,第二個難點就是将那個檔案的屬性再變成字元串,這大概就是最大的難點了吧,後來我避開了因為棧溢出而導緻的死循環問題,又查閱了大量資料解決了後面的bug,經曆千辛萬苦終于修成正果,這次的實驗真的是查了相當多的材料,學了好多東西,後面我會好好搞一下動态記憶體的東西,以後面對比較大的變量的時候可以遊刃有餘。程式設計真是件有趣的事情~

三.參考材料

1.

http://bbs.csdn.net/topics/390348063 提取檔案屬性

2.

http://blog.sina.com.cn/s/blog_4d1e14550100aui4.html

3.

https://technet.microsoft.com/zh-cn/library/system.io.file.getlastwritetime(v=vs.85).aspx?cs-save-lang=1&cs-lang=cpp#code-snippet-1

4.

http://blog.sina.com.cn/s/blog_793c41ec0100ve8w.html

5.

http://baike.baidu.com/link?url=_VqzJfwTXMv6D2ifOfTmFF7qhyWNXPOtMr1_9FqiA1I7uLwOWpXF4A8FgiRhmclUfNSSb4oX3hvLjfmqmz9enguPGTe7Cm70JDR6gDQhKQG

6.

http://blog.csdn.net/huapeng_guo/article/details/7614978

都是為了提取檔案的屬性

7.

http://bbs.csdn.net/topics/390747683

8.

http://blog.csdn.net/tracyzhongcf/article/details/3711684

9.

http://baike.baidu.com/link?url=PH__h-pRiHIa7ShO9NgnkP37X7wRWoqeBHQp_Ga2yHcVB2ujUryXQm1yIfreQqz2lAtjRLHvQNU2DRcxgnFPq0WACLLXr9vG1NGQHG2foLNM45lDTjVkwtS4y_L_RM6h

 以上都是為了解決時間轉字元串

10.

http://blog.csdn.net/renyhui/article/details/51165066

解決頭檔案問題

11.

http://vopit.blog.51cto.com/2400931/559787

12.

https://zhidao.baidu.com/question/210718525.html

13.

http://blog.csdn.net/brook0344/article/details/8126017

14.

http://blog.csdn.net/ldd530314297/article/details/42551793

15.

http://bbs.csdn.net/topics/390438875

16.

http://wuliang20080412.blog.163.com/blog/static/905220552010320018881/

 以上是為了解棧溢出問題

17.

http://weihe6666.iteye.com/blog/1440723

18.

https://zhidao.baidu.com/question/521221386.html?qbl=relate_question_3&word=WORD%20%D7%AA%CE%AAstring

WORD類型轉string類型

19.

http://bbs.csdn.net/topics/145726

20.http://baike.baidu.com/link?url=EYTiA-BaIjaJ60Mn_BXp6iNTF9K-DyZIWnvWMYSOkscQXCkw8AZqX1gv0fM0DDdWJgvb05_DEHL12xf9OtuWp505B2ng_vzM71jZUihgRLC   filetimetosystem函數的應用

21.

http://blog.sina.com.cn/s/blog_66ec4d660101bv9t.html

 FileTimeToSystemTime的注意事項

22.

http://bbs.csdn.net/topics/50035890

 filetimetosystem函數

23.

https://zhidao.baidu.com/question/324197690.html

 findfirstfile函數詳解

24.檢視函數定義

作業系統實驗報告五

繼續閱讀