1. 程式人生 > 其它 >學習筆記4(必做)20191216趙子瑜

學習筆記4(必做)20191216趙子瑜

第七八章 檔案操作和使用系統呼叫進行檔案操作

本章介紹各種檔案系統。多種操作的作業系統級別,如檔案儲存,檔案系統功能,系統呼叫和使用者命令的儲存裝置準備。和各種SH指令碼操作。全身解釋的各種操作,包括在主要空間的讀/寫檔案的流量。截至驅動程式級別的I / O的結束

講述的低級別的檔案操作,例如磁碟分割槽,分割槽表程式例項中,檔案的檔案格式的分割槽,和磁碟分割槽坐騎。介紹了Linux系統,它包含的資料系統結構的ext2檔案系統。檔案系統EXT2顯示用於超級塊,組描述符,索引塊,節點的節點,並且內容目錄的示例程式。

程式設計專案轉換ext2檔案/ 3檔案系統,並計劃在本章中所描述的技術,轉換名路徑索引節點,並列印資訊。

一:檔案操作級別:

Linux提供目錄和檔案級別的許可權管理。每個檔案和目錄都有一個owner(所有者)和一個group(使用者組)。一個檔案或目錄可以對owner、所屬group中的使用者和其他所有使用者開放不同的許可權。

對於一個檔案,“r”代表讀許可權,“w”代表寫許可權。
對於一個目錄,“r”代表檢視目錄下內容的許可權,“w”代表在目錄中建立或刪除新的檔案或目錄的許可權,“x”代表訪問該目錄的子目錄的許可權。

和許可權有關的是“drwxr-xr-x”、“root”和“root”這三個欄位。其中:

第一個欄位“drwxr-xr-x”包含了下面資訊:
第一個字元顯示該行末尾的路徑是檔案還是目錄:
如果第一個字元是“d”代表該路徑對應一個目錄;
如果第一個字元是“-”則代表該路徑對應一個檔案。
後九個字元可分為三組三個的字元:
第一組的三個字元代表該路徑的owner的許可權;
第二組的三個字元代表該路徑所屬的group的許可權;
第三組的三個字元代表所有其他使用者對該路徑擁有的許可權。
每組三個字元中的第一個對應“r”,第二個對應“w”,第三個對應“x”,如果對應的位置顯示是字
母,則代表對應使用者有字母所代表的許可權,如果是“-”則代表沒有許可權。
作業系統下檔案系統的“rwx”許可權可以用數字表示——比如“rwxrwxrwx” =777,“rwxr-xr-x” = 755等等。rwxrwxrwx表示的二進位制為:111 111 111=7 7 7,表示owner的許可權為rwx,group的許可權為rwx,其他使用者的許可權為rwx。
第二個欄位“root”對應著該行末尾路徑的owner。
第三個四段“root”對應該行末尾路徑所屬的group。
二:低級別檔案操作(此處結合實踐內容)

1 開啟檔案
f=open(r'D:\脫產5期內容\day09\a.txt',mode='rt',encoding='utf-8')
print(f)

2 讀/寫檔案
data=f.read()/write()

3 關閉檔案
f.close() # 向作業系統傳送指令,讓作業系統關閉開啟的檔案,回收作業系統資源
print(f)
f.read()

控制檔案讀寫操作的模式
r(預設):只讀模式,以該模式開啟檔案,當檔案不存在時則報錯,當檔案存在時檔案指標在檔案開頭
with open('a.txt',mode='rt',encoding='utf-8') as f:
read()
f.readable()是否可讀?
f.writable() 是否可寫?

f.readline()一次讀取一行

for line in f:

print(line) 可以使用for迴圈列印檔案內容

readlines()將檔案所有內容讀入一個列表中,且每一行為一個元素,包括換行符\n

w: 只寫模式,以該模式開啟檔案,當檔案不存在時建立一個空文件,當檔案存在時清空檔案內容,檔案指標在檔案開頭
writable()是否可寫

在打開了檔案不關閉的情況下,連續的寫入,新寫的內容總是跟在老內容之後

三.EXT2檔案系統

D-Recovery For Linux是在windows平臺下安裝使用,對EXT2/EXT3/EXT4檔案系統的分割槽進行讀取並進行資料恢復,具備如下功能:1、 掃描並恢復丟失的EXT2/EXT3/EXT4檔案系統分割槽,也就是分割槽表恢復。2、 EXT2/EXT3/EXT4超級塊損壞,可以通過掃描找出超級塊備份。若超級塊備份全部損壞,可以虛構超級塊相關資訊虛擬出分割槽資訊。 3、 能自動識別採用LVM管理方式的硬碟分割槽。LVM管理是LINUX下常用的磁碟分割槽管理方式,通過對LVM結構的解析,在軟體中模擬LINUX下LVM管理分割槽方式讀取分割槽資訊。4、 LINUX下大於2TB的分割槽通常採用GPT分割槽管理方式進行分割槽,D-Recovery For Linux能識別GPT分割槽,並能匯出資料。5、 對於EXT3/EXT4檔案系統下的刪除恢復,通過分析journal日誌檔案,提取被刪除的檔案資訊。6、 手工構建inode資訊,匯出相應檔案。7、 磁碟映象功能(可以把磁碟映象到新的磁碟,也可以把磁碟映象成一個檔案)。

四:1.刪除檔案:

int unlink(const char *pathname); 刪除pathname

目錄下的檔案其實就是該目錄下有指標指向了檔案在磁碟中的位置,刪除檔案就是講指向該檔案的連結串列結點刪除。

2.讀取目錄:
①.開啟目錄:DIR* opendir(const char* name);

返回值是一個指向dir結構體的指標,用於讀取目錄資料。失敗返回NULL

②.讀取目錄下的檔案:struct dirent* readdir(DIR* dirp)

返回一個目錄項的資訊,包括檔案的inode節點號和檔名,目錄指標指向下一個目錄項;

③:關閉目錄:int close(DIR* dirp);

疑問:

當時疑惑如何獲取當前檔案的檔名、行號等資訊
發現編譯器有幾個內建的巨集可以比較方便的得到當前的檔案資訊;

比較重要的就是檔名:__FILE__;

行號:__LINE__;

既然C標準庫和系統呼叫都能夠操作檔案,那麼應該選擇哪種操作呢?考慮的因素如下:

  • 使用系統呼叫會影響系統的效能。執行系統呼叫時,Linux需要從用 戶態切換至核心態,執行完畢再返回使用者程式碼,所以減少系統呼叫能減 少這方面的開銷。如庫函式寫入資料的檔案操作fwrite最後也是執行了write系統 呼叫,如果是寫少量資料的話,直接執行write可能會更高效,但如果是頻繁的寫入操作,由於f write的緩衝區可以減少呼叫write的次數,這種情況下使用fwrite能更節省時間。

  • 硬體本身會限制系統呼叫本身每次讀寫資料塊的大小。如針對某種存 儲裝置的write函式每次可能必須寫4kB的資料,那麼當要寫入的實際資料小於4kB時,write也只能 按4kB寫入,浪費了部分空間,而帶緩衝區的fwrite函式面對這種情況,會盡量在滿足資料長度要求時才執行系統呼叫,減少空間開銷。

  • 也正是由於庫函式帶緩衝區,使得我們無法清楚地知道它何時才會真正地把內容寫入到硬體上,所以在需 要對硬體進行確定的控制時,我們更傾向於執行系統呼叫。