这期案例讲的是 Unix-Like 系统中, 常听到的一句话: 目录也是个文件 或者 everything is a file. 和 Python 踩坑联系不紧密, 目标是方便大家理解 文件夹以及文件 在 类 Unix 系统上的读写方式.
刚接触 Linux 文件系统的同学有时候听到这个很懵, 目录怎么是个文件呢?目录不应该是内部包含文件的载体么?
分析主要从 2 个方面展开:
ls
实际是使用大量文件系统标准接口实现的结果, 是处理过后的用户程序如果大家已习惯了 Linux 系统中 ls
命令 (有时候由于alias
存在, 实际是ls --color
), 容易产生一种错觉:文件夹和文件这不是天然的被区分为不同的类别了吗?
实际不是这样子的, ls
mkdir
touch
一类的文件系统操作命令其实是通过调用文件系统接口实现的用户态程序, 你自己利用 python 也可以实现一个一摸一样的.
我们来看一些使用 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
更进一步的说, 对文件或者文件夹的操作本质上是用户层的代码实现调用了系统相关的接口. 这代表着文件夹和文件对系统来讲, 就是数据组织上的不同 (数据结构的不同). 那数据或者文件数目是怎么进行组织的?
想了解这个问题就要先了解 Linux 系统上的文件存储层次, 以在 Linux 上挂载的文件系统进程读写为例:
最上层, 用户的程序进程 Process, 通过调用类似 open write close 等通用系统函数读写所在挂载目录的文件
中间 Kernel VFS (Virtual Filesystem, 虚拟文件系统)
底层, Kernel 内核, 各个设备厂家不同的 VFS 实现嵌入 kernel 中以支持具体的读写等操作
物理介质层 (块设备等), 真正的硬件设备层
而我们要聚焦到 VFS 这层来看, 因为它:
只要明白了它如何组织文件 /文件夹, 基本上就明白了人们常说 everything is a file 的意思.
具体到数据结构上, 要看虚拟文件系统上规定了针对文件系统的 4 类数据结构:
对 VFS 来讲, 无论是存储了具体字节数据的文件, 还是文件夹, 本质都是个 inode 作元信息描述的逻辑结构.
无非文件夹不包括具体数据信息描述, 但包含一些指针 (指向该文件夹包含的一系列数据文件或者子文件夹). 相反, 一个指向数据的 inode 不包含子目录或文件们.
基本了解了文件系统的组织方式后, 留几个问题大家给大家做扩展思考?
关键字
一些可以参考的资料
文件系统篇 Umask 到底影响了谁
一些可以长期关注地方:
1
ps1aniuge 2019-09-23 12:38:40 +08:00
powershell (.net )没这问题。文件夹,文件,是不同对象。
|
2
Nitroethane 2019-09-23 12:52:00 +08:00
“只要明白了它如何组织文件 /文件夹, 基本上就明白了人们常说 everything is a file 的意思”
你怕是还不明白 everything is a file 的意思,每个打开的 socket 是一个 file,每个设备是一个 file,每个 pipe 也是 file,然而这些跟“它如何组织文件 /文件夹”没有关系 |
3
swulling 2019-09-23 13:13:21 +08:00
|
4
mythmgn OP @Nitroethane
文件系统中的 directory 是最容易来理解 everything is a file 的示例. (你说的 socket 也好, pipe 也好, 也都是的. 前几年一直在做分布式文件系统相关项目, 当然理解这些道理. ) 但请仔细看下我想表达的目标, 更多的针对 Directory 啊.... |
6
mythmgn OP @Nitroethane 像 pipe 可能还要分 named pipe, anonymous pipe. 存储方式在文件系统上还不一样. 但这不是重点, 写这个更多的针对人群是还不明白为啥文件夹也是文件? 这是为什么? :)
|