我的C語言學習曆程:進階篇

來源:互聯網
上載者:User

從“壓縮管理器”向“檔案管理工具”進化

到了0.87版,我已經將程式的名字改成“檔案管理工具”,因為那時我覺得,PC版的7-zip都有檔案管理工具的功能,同是壓縮軟體的“壓縮管理”也應該具備檔案管理工具的功能,就這樣,我又開始寫代碼,為了實現檔案管理工具。

先看看一些:

檔案管理工具0.87版的主介面直接顯示空間資訊,原始碼修改自之前的“壓縮管理”中的直接選取菜單,第一張圖中顯示的空間資訊有誤,在後來的更新中才解決掉這個問題,“本地磁碟”的背景為紅色,表示當前選中的是“本地磁碟”,按下↓鍵可以選中“儲存卡”,儲存卡的檢測,我是直接讀取根目錄下的proc檔案夾中的某個檔案實現的,儲存卡處於移除狀態,該檔案內容為REMOVE,儲存卡為插入狀態,內容就會是INSIDE。

讓getch函數支援方向鍵,我採用的方法是:接受第一個按鍵索引值後,建立一個線程,用於再次接受按鍵索引值,等1000毫秒後,終止這個線程,之後,將子線程擷取的索引值與剛剛得到的索引值相加,就得到了一個新的索引值,改進版的getch函數的原始碼在這裡:http://blog.csdn.net/liuchao35758600/article/details/6419499

第二張圖是更新後的效果。上面一排的文字是功能選項,最初只有三個,日後的更新中新增至5個;

按F鍵即可顯示字元下拉式功能表,具體看第三張圖,下拉式功能表中的選項也有對應的快速鍵,但在後來的更新中已經去掉快速鍵了。

實現這些字元介面,使用了逸出序列,具體可見此貼:http://club.noahedu.com/viewthread.php?tid=118019&highlight=%D7%AA%D2%E5

使用printf函數列印\e[y;xH,就可以將終端的游標定位到y行x列,例如:printf("\e[1;1H");將游標定位到第1行第1列,這時,後面列印的內容就會從這個位置開始顯示。

要實現檔案管理工具的檔案瀏覽功能,首先要能讀取檔案目錄資訊,以“linux 遍曆檔案目錄 C”為關鍵詞在網上搜尋,找到個合適的代碼就複製過來了。

windows 7系統中的資源管理員,可以顯示當前檔案夾下有多少檔案夾和檔案,我也模仿實現了這個功能,修改遍曆檔案目錄的原始碼,加入檔案夾和檔案計數功能。

檔案清單中應該要顯示檔案大小,於是就用stat函數在擷取檔案清單後擷取每個檔案的大小。

檔案清單中應該要按順序顯示,檔案夾排前面,檔案排後面,我在網上搜尋了一下,發現scandir函數產生的檔案清單是自動經過排序的,而這個檔案清單是用malloc分配的記憶體儲存的,需要free掉;產生的檔案清單是檔案和檔案夾混合的,需要將檔案夾和檔案分離出來,用for迴圈判斷檔案清單中的檔案的屬性,這個時候我用的是二維數組儲存的,靜態記憶體,編譯出來的檔案也很大。

考慮到瀏覽的檔案目錄內的檔案和檔案夾會很多,用靜態記憶體隱藏檔列表,儲存的數量是有限的,聽說有動態記憶體,網上搜尋了一下,用malloc函數分配記憶體,free函數釋放記憶體,就這樣,我把隱藏檔列表及各個檔案的大小的二維數組改成了二維指標,已知檔案總數、檔案夾數、檔案數、每個檔案的檔案名稱、每個檔案的大小,分配記憶體也就很好分配,用完後,用free函數釋放掉,free函數要和malloc函數成對使用,用了多少次malloc函數就需要用多少次free函數。

至於檔案操作,前期版本只支援單檔案操作,後來的更新中,實現了多檔案操作,具體如所示:

可以標記多個檔案,標記的檔案儲存體在二維數組中,同時用一個變數儲存已標記的檔案的總數。

檔案管理工具的介面中的左下角顯示的內容是變化的,標記檔案時顯示“已標記N個檔案”,移動/複製檔案時顯示"將XXX檔案(或者N個項目)移動/複製至...",沒有任何操作時,顯示“N個檔案夾,M個檔案”,實現這個字元介面,主要用的是字串處理函數,用sprintf函數產生介面每一行的內容,之後再用printf函數顯示,沒有用system函數調用clear命令清屏,因為這會有閃爍,影響效果,用了逸出序列的游標定位功能,將要顯示的內容覆蓋當前顯示的內容。

有的人可能會想,內容有長有短,為什麼這個字元UI沒有變形?

如果看過之前描述“壓縮管理”的功能的那部分,應該可以知道,只是進行了字串處理,字串長度少於指定長度則用N個空格填補,多餘則截取字串。

有的時候截取的字串的末尾會亂碼,那是因為把漢字截成兩半了,半個漢字無法顯示,只能顯示成框框,為瞭解決這個問題,我是用了一種方法:

由於GB2312編碼的漢字在char型字串是佔兩個位元組,每個位元組的值都是負數,並且,這個負數都是成對存在,這樣,就能很好的處理漢字問題了。

檔案的複製/移動/粘貼功能,我參考了windows 7系統中的資源管理員,畢竟它是我模仿的對象,見:

win7的資源管理員在複製/移動檔案時會顯示進度條以及相關資訊,這個功能,經過思考,可以用C語言實現,用到的就是基本數學中的加減乘除。

初始形態:

經過完善後:

在複製/移動過程中,會碰到同名檔案,win7的資源管理員會顯示這樣的介面:

要模仿實現,也很簡單,用stat函數擷取檔案大小和修改日期,之後對比,體積大的就顯示“(較大)”,最近修改的就顯示“(較新)”,效果如所示:

檔案資訊查看功能,也模仿了win7的資源管理員:

使用這些功能有時會遇到段錯誤(Segmentation Fault),解決這些問題也用了大量時間。

在檔案管理工具的N次更新中,添加了檔案關聯功能,這樣就可以調用其它程式開啟檔案。

這個關聯資訊的顯示列表,我用了排序函數,把二維數組重新排序,之後再顯示,排序的函數,網上搜尋的,具體在哪裡也不清楚了。

檔案管理工具包含了“壓縮管理”的功能,並且,能更好的發揮7-zip的強大功能,具體見及其說明:

使用檔案管理工具,可以將多個檔案壓縮成壓縮檔,解壓檔案時,可以選擇任意位置作為解壓目錄。

第一張圖是將檔案壓縮成壓縮檔時顯示的介面,可以命名壓縮檔的名稱以及使用的壓縮格式。

第二張圖是開啟壓縮檔時顯示的介面,只有4個選項:開啟、解壓、更新、測試,開啟就是調用7zip顯示檔案清單;選擇解壓,檔案管理工具會進入目前的目錄,可以正常瀏覽檔案目錄,按V鍵確定當前位置為解壓位置。(看第三張圖)

“壓縮管理”中的壓縮格式的配置功能得到完善,通過按↑鍵和↓鍵使游標">>"移動來實現選項的選擇,按確定鍵可選中這個選項。

“壓縮管理”中的IPK安裝功能也進行了完善,新增了IPK安裝記錄,實現這個功能,我還特意研究了學習機,學習機的IPK包安裝程式是ipkg-cl,通過調用它來實現IPK包的安裝,安裝後,會將IPK包資訊記錄在status檔案內,我的“檔案管理工具”讀取這個檔案的內容並處理一下就可以了,具體處理方法就不說了。

在檔案管理工具中開啟ipk安裝包時,會先讀取ipk包的資訊,之後提示是否安裝該安裝包。(參考第二張圖)

如果已經安裝過,會提示是替換還是先卸載再安裝。(參考第三張圖)

可以查看這個安裝包的資訊,資訊儲存在control檔案內,調用7z命令從安裝包中解壓指定檔案,然後讀取,如果沒有這個檔案,就不會顯示安裝包的資訊。(參考第四張圖)

安裝後的IPK包,查看資訊時,會顯示該安裝包安裝後佔用的空間,ipk包安裝後,會自動產生ipk包內的檔案清單,只需要讀取這個檔案清單,並累計大小即可得出佔用空間大小。

小結

初步瞭解了如何遍曆檔案目錄,如何擷取檔案名稱,如何擷取檔案的絕對路徑,但還是需要藉助網路。

瞭解了7z命令的更多參數的功能及用法。

接觸了指標,因為考慮到檔案目錄內的檔案時多時少,為了減少不必要的記憶體開銷,就使用了指標,用malloc函數實現動態記憶體分配,用free函數釋放記憶體,但有時還是出現段錯誤(Segmentation Fault)。

進一步掌握了逸出字元的用法。

修改了網友分享的getch函數,這個getch函數是類比實現的,為的是實現無回顯接受按鍵輸入。

發現線程間的全域變數不同步,子線程頻繁修改全域變數,而主線程擷取的全域變數的值不與子線程修改的值同步。

還沒接觸結構體,結構體是在高三暑期的時候學到的。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.