1042 Quiz#3 資料匣與檔案

C++ 實習測試: 資料匣與檔案 類別製作
時間: 60分鐘 (10:20 上傳時間截止, 不管你做到什麼地方, 請一定要上傳; 後續如果全部完成, 可以 email 給我補交)

背景說明

Windows 系統裡有 cmd.exe, 讓你可以運用指令來操作檔案系統裡的資料匣和檔案資料, 執行起來如下圖:

上圖中顯示 C:\> 代表目前的預設的工作資料匣是 C 磁碟機的最上層資料匣, 你可以在這個視窗裡輸入一些基本的命令例如:

  1. dir: 可以看到目前預設資料匣裡所有的檔案和資料匣

    C:\> dir
    磁碟區 C 中的磁碟是 Sys1
    磁碟區序號: D073-1E85

    C:\ 的目錄

    2016/05/17 上午 12:38 341,909 DUMP49ac.tmp
    2014/12/01 下午 01:07 <DIR> Intel
    2014/12/17 下午 05:37 <DIR> MinGW
    2016/03/26 下午 02:38 <DIR> Perl64
    2016/04/16 上午 12:00 <DIR> Program Files
    2016/05/11 下午 05:08 <DIR> Program Files (x86)
    2015/01/19 下午 10:13 <DIR> Users
    2016/03/19 上午 12:26 <DIR> Windows
    1 個檔案 341,909 位元組
    7 個目錄 8,871,424,000 位元組可用

  2. mkdir: 可以建立一個新的資料匣

    C:\> mkdir tmp
    C:\> dir
    ...
    C:\tmp 的目錄
    ...
    2016/05/19 上午 12:17 <DIR> tmp
    ...
  3. cd: 可以更改目前的預設資料匣

    C:\> cd tmp
    C:\tmp> dir
    磁碟區 C 中的磁碟是 Sys1
    磁碟區序號: D073-1E85

    C:\tmp 的目錄

    2016/05/19 上午 12:17 <DIR> .
    2016/05/19 上午 12:17 <DIR> ..
    0 個檔案 0 位元組
    2 個目錄 8,861,945,856 位元組可用

    上面 <DIR> . 目錄代表目前的 C:\tmp 目錄, <DIR> .. 目錄代表上一層的 C:\ 目錄

  4. notepad a.txt: 執行 notepad(筆記本) 程式編輯一個 a.txt, 隨便輸入 "abcd", 然後存檔

    C:\tmp> dir
    磁碟區 C 中的磁碟是 Sys1
    磁碟區序號: D073-1E85

    C:\tmp 的目錄

    2016/05/19 上午 12:21 <DIR> .
    2016/05/19 上午 12:21 <DIR> ..
    2016/05/19 上午 12:21 4 a.txt

    看到 a.txt 檔案, 其中有 4 個位元組

  5. type a.txt 可以顯示文字檔案的內容

    C:\tmp> type a.txt
    abcd
  6. 重複上面幾個指令來建立第二層的目錄 c:\tmp\b\, 並且在裡面建立兩個文字檔案 c.txt, d.txt

    C:\tmp> mkdir b

    C:\tmp> cd b

    C:\tmp\b> notepad c.txt

    C:\tmp\b> notepad d.txt

    C:\tmp\b> dir
    磁碟區 C 中的磁碟是 Sys1
    磁碟區序號: D073-1E85

    C:\tmp\b 的目錄

    2016/05/19 上午 12:28 <DIR> .
    2016/05/19 上午 12:28 <DIR> ..
    2016/05/19 上午 12:27 10 c.txt
    2016/05/19 上午 12:28 12 d.txt
    2 個檔案 22 位元組
    2 個目錄 8,855,109,632 位元組可用

    我們由視窗系統的Windows 檔案總管介面裡也可以看到上面建立的目錄和檔案, 下圖顯示 C:\tmp 目錄中有 C:\tmp\b 目錄, 以及 a.txt 檔案



    下圖顯示 C:\tmp\b 目錄中有 c.txt 以及 d.txt 檔案


  7. del c.txt 命令可以刪除 c.txt 檔案

    C:\tmp\b> del c.txt
  8. del d.txt 命令可以刪除 d.txt 檔案, 不過我們先將預設目錄換到上一層再刪除 d.txt, 只是這時候需要把相對於預設目錄的路徑打全, 也就是 del b\d.txt 才能夠刪除 d.txt, 同時我們用 rmdir 命令把已經空掉的 C:\tmp\b 目錄也刪除

    C:\tmp\b> cd ..

    C:\tmp> dir
    磁碟區 C 中的磁碟是 Sys1
    磁碟區序號: D073-1E85

    C:\tmp 的目錄

    2016/05/19 上午 12:27 <DIR> .
    2016/05/19 上午 12:27 <DIR> ..
    2016/05/19 上午 12:21 4 a.txt
    2016/05/19 上午 12:51 <DIR> b
    1 個檔案 4 位元組
    3 個目錄 8,896,675,840 位元組可用

    C:\tmp> del b\d.txt

    C:\tmp> rmdir b

    C:\tmp>dir
    磁碟區 C 中的磁碟是 Sys1
    磁碟區序號: D073-1E85

    C:\tmp 的目錄

    2016/05/19 上午 12:52 <DIR> .
    2016/05/19 上午 12:52 <DIR> ..
    2016/05/19 上午 12:21 4 a.txt
    1 個檔案 4 位元組
    2 個目錄 8,896,634,880 位元組可用

作業四要建立上面的資料匣與檔案管理系統並且模擬cmd視窗中基本的操作命令

請注意只需要『模擬』, 不需要真的在作業系統上產生資料匣或是文字檔案

範例執行程式, 程式執行時印出下面的選單

============================
目前資料匣/root
請選擇下列操作命令:
1: 回到上一層資料匣
2: 進入下一層資料匣
3: 增加一檔案
4: 列印檔案內容
5: 增加一資料匣
6: 刪除檔案
7: 刪除資料匣及子資料匣
8: 搜尋檔案/資料匣
9: 列印目前資料匣內檔案
a: 列印目前資料匣內檔案(包含子資料匣)
b: 搜尋檔案內字串
c: 檔案或資料匣大小
d: 結束操作

假設我們執行下面的命令 (增加檔案時假設只有一列的資料)

5           ; 增加一資料匣
tmp         ; 資料匣名稱
2           ; 進入下一層資料匣
tmp         ; 資料匣名稱
3           ; 增加一檔案
a.txt       ; 檔案名稱
abcd        ; 檔案內容
5           ; 增加一資料匣
b           ; 資料匣名稱
2           ; 進入下一層資料匣
b           ; 資料匣名稱
3           ; 增加一檔案
c.txt
cdefgh
3           ; 增加一檔案
d.txt
12345678
1           ; 回到上一層資料匣
a           : 列印目前資料匣內檔案(包含子資料匣)
============================
/root/tmp
    b/
        c.txt
        d.txt
    a.txt
============================
d           ; 結束操作

這個測試裡請先實作下面簡化的功能, 在作業四中可以由它來衍生出比較好的設計:

請實作下列操作介面:

1: 回到上一層資料匣
2: 進入下一層資料匣
3: 增加一檔案
5: 增加一資料匣
a: 列印目前資料匣內檔案(包含子資料匣)
c: 檔案或資料匣大小
d: 結束操作

此程式需要設計資料匣的類別 Dir 以及檔案的類別 File, 資料匣裡面可以包含多個檔案以及多個子資料匣, 在 main() 函式裡應該要有一個 root 資料匣的物件, 代表檔案系統中最上層的資料匣, 還應該有一個 currentDir 的指標, 指向目前預設的資料匣物件, 上面的選項 1 與選項 2 就是在改變這個 currentDir 的指標, 增加檔案或是增加資料匣都需要在 Dir 物件中增加新的介面函式


參考下圖實作 File 以及 Dir 兩個類別的組合關係

File 類別需要紀錄檔案的名稱、檔案的內容 (假設是一列文字); Dir 類別需要紀錄資料匣的名稱、資料匣內有哪些檔案, 資料匣內有哪些子資料匣


檔案的大小就是檔案內文字的位元組數目, 資料匣的大小是所有子資料匣大小以及所有的檔案的大小的總和

將所完成的 project (只需保留 .cpp, .h, .sln 以及 .vcxproj 檔案即可; 刪除掉 .suo, .sdf, .filters, .users, debug\ 資料匣, 以及 ipch\ 資料匣下的所有內容) 以 zip/rar/7zip 程式將整個資料匣壓縮起來, 在「考試作業」繳交區選擇 Labtest3上傳

C++ 物件導向程式設計課程 首頁

製作日期: 05/18/2016 by 丁培毅 (Pei-yih Ting)
E-mail: pyting@mail.ntou.edu.tw TEL: 02 24622192x6615
海洋大學 電機資訊學院 資訊工程學系 Lagoon