代碼示例支持 |
---|
平臺: Mac OS |
Python: 2.7.10 |
代碼示例: - wx: 菜單 - Python踩坑指南代碼示例 - github 見code_demo |
這期案例講的是Unix-Like系統中, 常聽到的一句話: 目錄也是個文件 或者 everything is a file.
剛接觸 Linux 文件系統的同窗有時候聽到這個很懵, 目錄怎麼是個文件呢?目錄不該該是內部包含文件的載體麼?node
分析主要從2個方面展開:python
ls
實際是使用大量文件系統標準接口實現的結果, 是處理事後的用戶程序若是你們已習慣了 Linux 系統中 ls
命令 (有時候因爲alias
存在, 實際是ls --color
), 容易產生一種錯覺:文件夾和文件這不是自然的被區分爲不一樣的類別了嗎?
git
實際不是這樣子的, ls
mkdir
touch
一類的文件系統操做命令實際上是經過調用文件系統接口實現的用戶態程序, 你本身利用python也能夠實現一個一摸同樣的.github
咱們來看一些使用 python 訪問文件系統的簡單例子:數據結構
from __future__ import print_function import os # 簡單文件寫 with open('./test', 'w+') as fhandle: fhandle.write('test\n') # 建立文件夾 dirname = os.path.abspath('./test_dir') if not os.path.exists(dirname): os.makedirs(dirname) for ind in range(0, 10): with open('{0}/test_file_{1}'.format(dirname, ind), 'w+') as fhandle: fhandle.write('1') dname = '{0}/test_dir_{1}'.format(dirname, ind) if not os.path.exists(dname): os.mkdir(dname) # 讀文件夾 for obj in os.listdir(dirname): objpath = os.path.join(dirname, obj) if os.path.isfile(objpath): print('{0} is a file'.format(objpath)) elif os.path.isdir(objpath): print('{0} is a dir'.format(objpath))
所以, 你們理解 ls
類耳熟能詳的 Linux 命令是通過代碼實現的用戶程序, 若是你想且有時間完成能夠實現一個 python 版 的ls
函數
更進一步的說, 對文件或者文件夾的操做本質上是用戶層的代碼實現調用了系統相關的接口. 這表明着文件夾和文件對系統來說, 就是數據組織上的不一樣 (數據結構的不一樣). 那數據或者文件數目是怎麼進行組織的?spa
想了解這個問題就要先了解 Linux 系統上的文件存儲層次, 以在 Linux 上掛載的文件系統進程讀寫爲例:unix
最上層, 用戶的程序進程 Process, 經過調用相似open write close 等通用系統函數讀寫所在掛載目錄的文件指針
物理介質層 (塊設備等), 真正的硬件設備層
而咱們要聚焦到 VFS 這層來看, 由於它:
只要明白了它如何組織文件/文件夾, 基本上就明白了人們常說 everything is a file 的意思.
具體到數據結構上, 要看虛擬文件系統上規定了針對文件系統的4類數據結構:
對VFS來說, 不管是存儲了具體字節數據的文件, 仍是文件夾, 本質都是個 inode 做元信息描述的邏輯結構.
無非文件夾不包括具體數據信息描述, 但包含一些指針 (指向該文件夾包含的一系列數據文件或者子文件夾). 相反, 一個指向數據的 inode 不包含子目錄或文件們.
基本瞭解了文件系統的組織方式後, 留幾個問題你們給你們作擴展思考?
關鍵字
一些能夠參考的資料
文件系統篇 Umask 到底影響了誰