儲存在硬碟等物理儲存器上的檔案如何進行讀取等操作?
如果我們直接對其進行讀寫等操作,也是可以滴,不過這就需要很費時費力,需要對硬體的物理構造有清楚的了解,很明顯,這很影響開發效率。當然也不排除某些特殊場合需要用到,但是大多數情況下,這種「低階的」操作,早已經被人們開發出來的乙個叫做「作業系統」的東西給替代。作業系統是對計算機硬體與軟體等資源進行管理的程式。想要對檔案進行讀取,對於非裸奔的計算機來說,通過作業系統這個中介來實現檔案的讀寫是很不錯的選擇!!
作業系統會提供介面函式,對於我們來說,一般只需要會用就足夠的,至於其內部具體實現,如果不是系統開發人員,不需要了解的很透。這不意味著不需要了解,如果大致明白其原理,還是可以進一步加深其理解的,不用去「死記」。那麼大致是個什麼原理呢?我也只是了解一些皮毛,這裡分享一下(以linux系統為例):
儲存在計算機硬體上的資料都是以二進位制的形式儲存。對於乙個檔案,包含兩部分,乙個是檔案屬性(如:檔名、檔案大小等),乙個是檔案內容(這就是檔案裡面所儲存的資訊)。對於這兩部分的儲存方式,如果是放在一起儲存,那麼你在索引資訊的時候,就會很難區分出檔案屬性與檔案信心的分界點在何處。如果你說可以給每乙個檔案型別乙個固定的檢索方式,就像解析一樣,我覺得那也是可以的,但是現實就是目前不流行這樣搞,而且還有一點是,如果規定了固定索引方式,那麼對於一些檔案操作可能會受到一定的限制,比如最直接便是就是建立鏈結。所以,一般來說,檔案屬性與檔案資訊這兩部分的資訊是分開儲存,檔案屬性稱之為inode結點,inode結點是乙個結構體,儲存了檔案屬性的相關資訊,在這個結構體的最後,是乙個指向檔案內容的指標。在讀取檔案資訊時,首先檢索的是檔案屬性的資訊,再通過那個指標檢索檔案內容。這樣似乎是更加簡介且方面的乙個方式。這便是檔案在硬體中的儲存方式。檔案進行操作,還只了解硬體方面的東西,但是還不夠,作業系統也發揮著重要的作用。當開啟乙個檔案時,系統就會建立乙個struct inode的結構體,這個結構體是唯一的,指向檔案的inode結點。同時,系統也會建立乙個struct file 型別的結構體(這個結構體只有在新的程序開啟時,才會建立),這個結構體裡面儲存的是檔案開啟的狀態標誌、檔案的偏移量,以及指向struct inode 結構體的指標,在往上一層,便是檔案表象,這是乙個陣列,陣列每一項值都對應於乙個指向struct file型別的指標。對於陣列,我們可以用下表訪問,這個下表,便是廣為人知的------->檔案描述符(file descriptor )。
檔案描述符適用於linux系統io,對於乙個已經開啟的檔案(非目錄檔案),我們只需要知道其檔案的描述符即可對其進行操作。對檔案的操作有:
開啟檔案:
讀寫檔案:
定位檔案:
關閉檔案:
對於這幾種檔案的操作,已經在之前的文章裡講過(linux應用開發之檔案io)
那麼問題來了,如果我需要在linux系統下讓windows開啟windows中的件,這改怎麼操作呢?系統io只適用於特性的系統(linux系統),所以,為了解決這一問題,人們規定了乙個標準,稱之為標準io,標準io是先將資料儲存在快取中,再通過呼叫系統io來對資料進行處理,這也是帶緩衝的io相比於系統io來說其效率更高。對於標準io,對檔案的操作也類似:
開啟檔案:
讀寫檔案:
定位檔案:
沖洗檔案:
關閉檔案:
總的來說分為這幾種,但是細分到具體的函式,有十幾個函式。
本文的主要是講述檔案io的理解,對於這十幾個函式,我將會另外作為乙個專題來講述。
系統io(檔案io)
檔案描述符 檔案描述符 已開啟檔案的標誌,是非負整形數,當前可以最小作為新檔案的檔案描述符,預設範圍0 1024 可更改 檔案開啟 int open const char pathname,int flags,mode t mode 1.pathname 要開啟檔案的路徑 2.flags 開啟方式 ...
標準檔案IO和系統檔案IO的區別
標準檔案io和系統檔案io的區別 標準檔案io fopen fclose fread fwrite fseek 系統檔案io open close read write lseek 區別 標準檔案io只能讀寫普通文字檔案和二進位制檔案 系統檔案io不僅可以讀寫普通檔案和二進位制檔案還可以讀寫系統底層...
Linux檔案系統I O
作為一名c 後台開發程式設計師,在這個領域需要不斷的學習進步,才能夠穩定前行。對於畢業工作了一年的我,在著期間,對於linux系統可以說是很少接觸,因為現在的專案主要是windows專案。但是,個人認為,作為後台開發工程師,linux系統的學習是必須的,最起碼要熟悉linux系統。而對於幾乎沒接觸過...