前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >文件、目录_文件目录表

文件、目录_文件目录表

作者头像
全栈程序员站长
发布于 2022-09-20 10:19:39
发布于 2022-09-20 10:19:39
2.3K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

4.1 文件

4.1.1 文件命名

文件是一种抽象机制,它提供了一种方式用来存储信息以及在后面进行读取。可能任何一种机制最重要的特性就是管理对象的命名方式。

对用户来说,文件的时间必须隐藏信息的保存方式和位置以及磁盘的实际工作。

文件命名规则对于不同的操作系统来说是不一样的,但是所有现代操作系统都允许使用 1 – 8 个字母的字符串作为合法文件名。

扩展名

含义

file.bak

备份文件

file.c

C源程序

file.f77

Fortran 77程序

file.gif

Compuserve 图形转换格式图像

file.hlp

帮助文件

file.html

万维网超文本标记语言文档

file.mpg

用MPEG标准编码的电影

file.o

目标文件(编译器输出,但未连接)

file.ps

Postscript文件

file.tex

用于TEX格式化程序的输入

file.txt

一般文档文件

file.zip

压缩存档

4.1.2 文件结构

文件可以按几种不同方式构成。通常的三种

  • 字节序列
  • 记录序列

对于无结构的字节序列,操作系统不知道也不关心文件中是什么。它所看到的全部都是字节。任何意义都必须由用户级程序指定。UNIX和Windows都是用盖房似乎

记录序列把文件看作定长的记录序列

树:用于商业数据处理

三种类型的文件 a. 字节序列 b. 记录序列 c. 树

4.1.3 文件类型

一种分类:

  • 普通文件:包含用户信息的文件
    • ASCII文件:可显示和打印
    • 二进制文件:有一定的内部结构,如可执行文件等
  • 目录:系统文件,用于维护文件系统的结构

UNIX的一种分类:

  • 字符特殊文件:与I/O相关的,用于建模诸如终端、打印机和网络等的串行I/O设备
  • 块特殊文件:用于磁盘建模

a. 可执行文件 b. 存档文件

4.1.4 文件存取

早期的操作系统只提供顺序存取(sequential access)。在这些系统中,进程可以从文件开始处顺序读取文件中所有字节或者记录,但不能够略过某些内容,也不能够非顺序读取。

用磁盘存储文件后,我们可以非顺序地读取文件中的字节或记录,或者根据关键字而不是位置来存取记录。能够以任何顺序读取的文件叫做随机存取文件(random access file)

顺序存取

  • 从起点读取所有字节/记录
  • 不能跳过,可以倒带或者倒退
  • 对于磁带媒介比较方便

随机存取

  • 以任意次序读取字节/记录
  • 数据库系统的根本所在
  • 可以下列方式读取文件
    • 移动文件标记(seek),然后读取
    • 读取,然后移动文件标记

4.1.5 文件属性

含义

保护

谁能访问该文件,以何种方式访问

口令

访问该文件所需口令

创建者

文件创建者的ID

拥有者

当前拥有者

只读标志

0表示读写,1表示只读

隐藏标志

0表示正常,1表示不在列表中显示

系统标志

0表示正常文件,1表示系统文件

存档标志

0表示已备份过,1表示需要备份

ASCII/二进制

0表示ASCII文件,1表示二进制文件

随机存取标志

0表示只能顺序存取,1表示随机存取

临时标志

0表示正常,1表示在进程退出时删除文件

锁标志

0表示未锁,非零表示已锁

记录长度

一条记录的字节数

关键字位置

每条记录中关键字偏移

关键字长度

关键字域的字节数

创建时间

文件创建的日期和时间

最后存取时间

文件最后存取的日期和时间

最后修改时间

文件最后修改的日期和时间

当前长度

文件字节数

最大长度

文件最大允许字节数

4.1.6 文件操作

文件用于存储信息便于以后检索。不同系统提供了不同的操作进行存储和检索。下面是一些与文件有关的最常用的系统调用:

  1. CREATE: 创建没有任何数据的文件。
  2. DELETE: 删除文件以释放磁盘空间。
  3. OPEN :将文件属性和磁盘地址表载入主存,便于以后系统调用的快速存取。
  4. CLOSE: 关闭文件以释放内部表空间。
  5. READ:从文件中读取数据。一般,读出的数据来自当前位置。调用者必须指明需要读取多少数据,并且提供存放这些数据的缓冲区。
  6. WRITE:向文件中写入数据,写操作一般也是从当前位置开始。如果当前位置是文件末尾,文件长度增加。如果当前位置在文件中间,则现有数据被重写,并且永远丢失了。
  7. APPEND: 该调用是WRITE的限制形式,它只能在文件末尾添加数据。
  8. SEEK: 把当前位置指针指向文件中特定位置。
  9. GET ATTRIBUTES: 读取文件属性。
  10. SET ATTRIBUTES: 设置文件属性。
  11. RENAME: 改变现有文件的文件名。
使用文件系统调用的实例
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <fcntl.h>  //fcntl.h是unix标准中通用的头文件,其中包含的相关函数有open,fcntl,shutdown,unlink,fclose等
#include <unistd.h> //是C和C++程序设计语言中提供对POSIX操作系统API的访问功能的头文件的名称

#define BUF_SIZE 4096
#define OUTPUT_MODE 0700
int main(int argc, char *argv[])
{
    int in_fd, out_fd, rd_count, wt_count;
    char buffer[BUF_SIZE];
    if (argc != 3)
        exit(1);
    in_fd = open(argv[1], O_RDONLY); //O_RDONLY 以只读方式打开文件
    if (in_fd < 0)
        exit(2);
    out_fd = creat(argv[2], OUTPUT_MODE);
    if (out_fd < 0)
        exit(3);

    while (1)
    {
        rd_count = read(in_fd, buffer, BUF_SIZE);
        if (rd_count <= 0)
            break;
        wt_count = write(out_fd, buffer, rd_count);
        if (wt_count <= 0)
            exit(4);
    }
    close(in_fd);
    close(out_fd);
    if (rd_count == 0)
        exit(0);
    else
        exit(5);
    return 0;
}

4.2 目录

为了记录文件信息,文件系统通常有目录或者文件夹

在许多系统中,目录本身就是文件

目录包括其组织、属性以及作用于其上的操作

4.2.1 一级目录系统

目录系统的最简单形式就是使用一个目录包含所有的文件

有时候,称之为根目录,不过,由于只有一个目录,名字无关紧要

在早期的个人计算机上,这种系统非常普遍,部分原因是只有一个用户

非常有趣的是,世界上最大的超级计算机CDC 6600,对于所有文件也只有一个目录,尽管它同时有多个用户使用

这个决断无疑是想保持软件设计的简单

单层目录系统

  • 单层目录系统包含的4个文件,分别属于不同的人A、B和C

双层目录系统

图中字母表示目录和文件的所有者

4.2.2 层次目录系统

双层目录系统消除了不同用户之间的文件名冲突,但仍然难以使有很多文件的用户感到满意

用户常常需要把文件按某种逻辑方式组织起来

最终我们需要的是一般的层次(即目录树)。采用层次结构,每个用户可以拥有多个所需的目录,自然地组织他们的文件。

目录树

4.2.3 路径名

使用目录树来组织文件系统时,需要某种方法指明文件名。

  1. 第一种是每个文件都赋予一个绝对路径名(absolute path name),它由从根目录到文件的路径组成。绝对路径名总是从根目录开始,并且是唯一的。如果路径名的第一个字符是分隔符,那么这个路径就是绝对路径。
  2. 另一种文件名是相对路径名(relative path name)。它常和工作目录(也称作当前目录)的概念一起使用。用户可以指定一个目录作为当前的工作目录。这时,所有的路径名,如果不是从根目录开始,都是相对于工作目录的。相对路径往往更加方便,但是,它实现的功能和绝对路径完全一样。

绝对路径实例:

  1. 文件mailbox:/usr/ast/mailbox
  2. 文件dict:/usr/lib/dict

相对路径实例:

  1. 当前目录:/ 相对路径:usr/lib/dict
  2. 当前目录:/usr 相对路径:lib/dict
  3. 当前目录:/usr/lib 相对路径:dict
  4. 当前目录:/usr/ast 相对路径:../lib/dict

每个目录中有两个特殊的目录项:

  1. .(一个点):当前目录
  2. ..(两个点):父目录

4.2.4 目录操作

相对于文件的系统调用而言,各个系统中用于管理目录的系统调用差别更大。

  1. CREATE:创建目录。除了目录项“.”和“..”之外,目录内容为空。目录项“.”和“..”是系统自动放在目录中的。
  2. DELETE:删除目录。只有空目录可以被删除。只含有目录项“.”和“..”的目录都认为是空目录,这两个目录项是不能被删除的。
  3. OPENDIR:目录内容可被读取。同打开和读取文件一样,在读目录之前,必须打开目录。
  4. CLOSEDIR:关闭该目录以释放内部表空间。
  5. READDIR:返回打开目录的下一个目录项。
  6. RENAME:更改目录名。
  7. LINK:链接技术允许文件出现在多个目录中。这个系统调用指定一个存在的文件和一个路径名,并建立从文件到路径所指定的名字的链接。这样,同一文件可以在多个目录中出现。
  8. UNLINK:删除目录项。如果被解链的文件只出现在一个目录中,它从文件系统中被删除。如果它出现在多个目录中,只删除指定的路径名,其他路径名依然保留下来。

以上列出了最主要的系统调用。但还有一些其他调用,比如管理与目录相关的保护信息的系统调用。

4.3 文件系统的实现

以上从用户角度考察文件和目录

以下从实现者角度考察文件系统

用户关心的是文件时怎样命名的、可以进行哪些操作、目录树时怎么样的以及类似的界面问题

而实现者感兴趣的时文件和目录时怎样存储的、磁盘空间时怎样管理的以及怎样使系统有效而可靠地工作等

4.3.1 文件系统布局

MBR:磁盘的0号扇区叫做MBR(Master Boot Record,主引导记录),用于启动计算机

分区表:位于MBR的尾部。多数磁盘可以划分为一个或多个分区,该表给出了每个分区的起点和重点地址。表中有一个分区被标记为活动的

计算机启动:BIOS读取并执行MBR,MBR程序首先确定活动分区,读入其第一块,即引导块(boot block),并执行它。引导快中的程序载入包含该分区中的操作系统

不同的文件系统磁盘布局不相同

4.3.2 文件的实现

连续分配

最简单的分配方案是把每个文件作为连续数据块存储在磁盘上。所以,在块大小为1K的磁盘上,50K的文件要连续分配50个连续的块

该分配方案有两大优势

  • 首先,简单、容易实现,记录每个文件用到的磁盘块简化为只需记住一个数字即可,也就是第一块的磁盘地址
  • 其次,性能较好,在一次操作中,就可以从磁盘上读出整个文件

缺点:不能预知文件的长度,会造成磁盘碎片

适用于CD-ROM,文件长度已知且在使用中不会改变

目录项:文件名+起始块号+长度

a. 分配给7个文件的连续磁盘空间 b. 文件D、F被删除后的磁盘状态

链表分配

存储文件的第二种方法是为每个文件构造磁盘块的链表。每个块的第一个字作为指向下一块的指针,块的其他部分存放数据。

优点:这类方法可以利用每个磁盘块。不会因为磁盘碎片而浪费存储空间

缺点:指针占用块空间;顺序读取文件非常方便,但是随机存取相当缓慢

将文件保存为磁盘块的链表

目录项:文件名+起始块号+长度

使用内存表的链表分配

链表分配使用内存中的一个文件分配表

i-节点

记录各个文件分别包含哪些磁盘块的方法是给每个文件赋予一张称为i-节点的小表,其中列出了文件属性和文件中各块在磁盘上的地址

目录项:文件名+I节点号

UNIX V7文件系统

UNIX的i-节点

4.3.3 目录的实现

打开文件时,操作系统利用用户给出的路径名找到相应目录项,目录项提供了查找文件磁盘块所需要的信息。中目录系统的主要功能是把ASCII文件名映射成查找文件数据所需的信息。

目录项的设计

  • 文件名
  • 磁盘地址
  • 文件属性
固定长度目录项

a. 包含固定大小项的简单目录,目录项中有磁盘地址和属性 b. 目录中的每一项只是对i-节点的引用

长度不固定的目录项

在目录中处理长文件名的两种方法 a. 行方式 b. 堆方法

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/167059.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
操作系统之文件管理
按文件性质和用途分类(UNIX),一般分为普通文件、目录文件、特殊文件(设备文件)、管道文件、套接字
JavaEdge
2021/02/23
8190
操作系统之文件管理
昨晚上群友问我,你知道啥是文件吗?于是就有了今天的文章
所有的应用程序都需要存储和检索信息。当进程运行时,它能够在自己的存储空间内存储一定量的信息。然而,存储容量受虚拟地址空间大小的限制。对于一些应用程序来说,存储空间的大小是充足的,但是对于其他一些应用程序,比如航空订票系统、银行系统、企业记账系统来说,这些容量又显得太小了。
乔戈里
2020/03/26
6950
昨晚上群友问我,你知道啥是文件吗?于是就有了今天的文章
简直不要太硬了!一文带你彻底理解文件系统
所有的应用程序都需要存储和检索信息。进程运行时,它能够在自己的存储空间内存储一定量的信息。然而,存储容量受虚拟地址空间大小的限制。对于一些应用程序来说,存储空间的大小是充足的,但是对于其他一些应用程序,比如航空订票系统、银行系统、企业记账系统来说,这些容量又显得太小了。
cxuan
2020/03/26
5910
简直不要太硬了!一文带你彻底理解文件系统
低调的 Linux 文件系统家族
在 Linux 中,最直观、最可见的部分就是 文件系统(file system)。下面我们就来一起探讨一下关于 Linux 中国的文件系统,系统调用以及文件系统实现背后的原理和思想。这些思想中有一些来源于 MULTICS,现在已经被 Windows 等其他操作系统使用。Linux 的设计理念就是 小的就是好的(Small is Beautiful) 。虽然 Linux 只是使用了最简单的机制和少量的系统调用,但是 Linux 却提供了强大而优雅的文件系统。
cxuan
2020/09/28
1K0
低调的 Linux 文件系统家族
操作系统之文件管理
按文件性质和用途分类(UNIX),一般分为普通文件、目录文件、特殊文件(设备文件)、管道文件、套接字
JavaEdge
2018/05/16
2.6K0
只会建文件的你,考虑过文件系统设计吗?来看一下
在对文件有了基本认识之后,现在是时候把目光转移到文件系统的实现上了。之前用户关心的一直都是文件是怎样命名的、可以进行哪些操作、目录树是什么,如何找到正确的文件路径等问题。而设计人员关心的是文件和目录是怎样存储的、磁盘空间是如何管理的、如何使文件系统得以流畅运行的问题,下面我们就来一起讨论一下这些问题。
淘课之家
2020/03/20
5520
只会建文件的你,考虑过文件系统设计吗?来看一下
操作系统之文件管理
将文件属性从外存拷到内存中打开文件表的一表目中 将其编号返回给用户。 系统可利用该编号到打开文件表中去查找。
JavaEdge
2018/05/16
1.6K0
其他篇之操作系统——文件管理
文件管理是操作系统的功能之一,由于系统的内存有限并且不能长期存储,故平时总是把数据以文件的形式存储在外存中,需要时再将其调入内存。文件管理的主要内容有:
一半是我
2020/04/30
1.9K0
操作系统核心原理-6.外存管理(下)文件系统
  磁盘具有大容量、低成本以及持久化的特点,即使发生断电,磁盘上的数据也不会丢失。但是,对于一般用户而言,使用磁盘是非常苦难的,因为他们不知道如何驱动一个磁盘,以及计算数据在磁盘上的存放位置。从上一篇《磁盘基础》可以知道,了解磁盘的各项技术细节将使用户不堪重负。
Edison Zhou
2018/08/20
5500
操作系统核心原理-6.外存管理(下)文件系统
《Linux操作系统编程》 第五章 文件和文件系统: 了解文件和文件系统的概念和特性,掌握Linux文件系统的基本操作
​ 掌握:文件的访问权限及表示方式,目录操作(当前路径、读取目录项),属性获取以及文件类型。
猫头虎
2024/04/08
2550
《Linux操作系统编程》 第五章 文件和文件系统: 了解文件和文件系统的概念和特性,掌握Linux文件系统的基本操作
操作系统复习笔记——第十章 文件系统接口
10.2 访问方法 10.2.1 顺序访问 最为简单的访问方式是顺序访问。文件信息按顺序,一个记录接着一个记录地加以处理。这种访问模式最为常用,例如,编辑器和编译器通常按这种方式访问文件。 基于磁带模型 10.2.2 直接访问 另一方式是直接访问(或相对访问)。文件由固定长度的逻辑记录组成,以允许程序按任意顺序进行快速读和写。直接访问方式是基于文件的磁盘模型,这是因为磁盘允许对任意文件块进行随机读和写。对直接访问,文件可作为块或记录的编号序列。因此,可先读取块14,再读块53
种花家的奋斗兔
2020/11/13
5760
区块链开发之Go语言—文件系统
处理的文件名 path库 filepath库 查看文件的元信息 os.Stat os.Lstat 操作临时文件区域 os.TempDir os — 平台无关的操作系统功能实现 os 封装了系统无关的实现。在实际编程中,我们应该总是优先使用 os 中提供的功能,而不是 syscall。 文件 I/O 了解IO需要参照Unix文件系统的概念。 在 Unix 系统调用中,所有执行 I/O 操作以文件描述符,一个非负整数(通常是小整数),来指代打开的文件。 文件描述符用以表示所有类型的已打开文件,包括管道(pipe
linxinzhe
2018/04/10
1.3K0
探索Linux世界:初次接触和基本指令(文件操作)
如果在使用 ls 命令时不指定目录或文件名,它将默认列出当前工作目录下的文件和子目录,相当于ls .
是Nero哦
2024/03/05
1970
探索Linux世界:初次接触和基本指令(文件操作)
文件系统考古:1974-Unix V7 File System
有时,进步难以察觉,特别是当你正身处其中时。而对比新旧资料之间的差异,寻找那些推动变革的信息源,我们就可以清晰地看到进步的发生。在Linux(以及大部分Unix系统)中,都可以印证这一点。
Juicedata
2023/05/27
2570
文件系统考古:1974-Unix V7 File System
文件系统:隐匿在 Linux 背后的机制
在 Linux 中,最直观、最可见的部分就是 文件系统(file system)。下面我们就来一起探讨一下关于 Linux 中国的文件系统,系统调用以及文件系统实现背后的原理和思想。这些思想中有一些来源于 MULTICS,现在已经被 Windows 等其他操作系统使用。Linux 的设计理念就是 小的就是好的(Small is Beautiful) 。虽然 Linux 只是使用了最简单的机制和少量的系统调用,但是 Linux 却提供了强大而优雅的文件系统。
cxuan
2020/09/04
7700
文件系统:隐匿在 Linux 背后的机制
操作系统入门(六)文件管理
-文件是在逻辑上具有完整意义的信息集合,它有一个名字作标识 -文件系统是操作系统中负责管理和存取文件的程序模块,也称为信息管理系统
看、未来
2020/08/25
1.1K0
xv6(13) 文件系统:文件描述符&系统调用
本文需要接着系统调用,也是接着 $xv6$ 文件系统的最后一层,讲述各种具体的文件系统调用是怎么实现的,文件描述符,$inode$,文件之间到底有什么关系,创建打开关闭删除文件到底是何意义,文件删除之后数据就不存在了吗,链接又作何解释等等问题,看完本文相信你能找到答案。
rand_cs
2023/12/06
6500
xv6(9) 文件系统理论部分
文件系统是操作系统的重要组成部分,是对文件的组织管理,本文就主要讲述磁盘上的文件是如何组织的和文件操作两个部分,废话不多说直接来看。
rand_cs
2023/12/06
3600
MIT 6.S081 教材第八章内容 -- 文件系统 -- 02
术语inode(即索引结点)可以具有两种相关含义之一。它可能是指包含文件大小和数据块编号列表的磁盘上的数据结构。或者“inode”可能指内存中的inode,它包含磁盘上inode的副本以及内核中所需的额外信息。
大忽悠爱学习
2023/10/11
5320
MIT 6.S081 教材第八章内容 -- 文件系统 -- 02
这些操作系统的概念,保你没听过!
大部分操作系统提供了特定的基础概念和抽象,例如进程、地址空间、文件等,它们是需要理解的核心内容。下面我们会简要介绍一些基本概念,为了说明这些概念,我们会不时的从 UNIX 中提出示例,相同的示例也会存在于其他系统中,我们后面会进行介绍。
cxuan
2020/02/19
3660
这些操作系统的概念,保你没听过!
推荐阅读
相关推荐
操作系统之文件管理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验