fatfs文件系统中dir_sdi函数说明

本文详细解析fatfs文件系统中的dir_sdi函数,该函数用于设置目录条目索引值。讨论了fat16和fat32/exfat文件系统的不同处理方式,并介绍了如何计算目录条目在扇区和簇中的位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//设置目录条目索引值。
//返回0表示成功
//返回非0表示错误
/*
dp为目录对象。
ofs为目录条目的偏移量,单位为字节。
n = ofs / SZDIRE:表示第n个条目,n从0开始。

首先ofs不能超过目录存储的最大字节数。MAX_DIR_EX/MAX_DIR
其次,ofs必须是SZDIRE的倍数

fat16是固定位置根目录:通过DBR中根目录首扇区号获得
fat32/exfat根目录位置:通过DBR中提供的根目录首蔟号获得

给定ofs值需要计算:
1、蔟号:ofs指定的目录条目在哪个蔟
2、扇区号:ofs指定的目录条目在哪个扇区
3、扇区中偏移量:ofs在扇区中偏移了几个条目

获取上述信息,可将扇区内容读到win中,根据偏移量可以找到对应条目(32字节)

fat16文件系统:
由于根目录不在数据区,因此蔟号为0
根目录的起始扇区号:fs->dirbase
ofs对应扇区号:起始扇区号 + 扇区偏移量 = fs->dirbase + ofs / SS(fs)
扇区内偏移量:ofs % SS(fs)

fat32/exfat文件系统:
根目录的起始蔟号:fs->dirbase
ofs对应蔟号:通过在fat表中蔟链查找到ofs对应的蔟(ofs/每蔟字节数)
扇区号:通过clst2sect函数得到蔟首扇区号
ofs % 每蔟字节数 = 对应蔟号中的偏移字节数
对应蔟号中的偏移字节数 / SS(fs)为蔟内扇区偏移量
扇区内偏移量:对应蔟号中的偏移字节数 % SS(fs)为扇区内条目偏移字节
*/

static FRESULT dir_sdi (	/* FR_OK(0):succeeded, !=0:error */
	DIR* dp,//目录对象。/* Pointer to directory object */
	DWORD ofs//目录表偏移量。/* Offset of directory table */
)
{
   
	DWORD csz, clst;
	FATFS *fs = dp->obj.fs;

//偏移量不能超过最大目录数
//偏移量必须是32的倍数
	if (ofs >=
### Shell 脚本中 `dir` 命令的作用与用法 #### 1. **`dir` 命令的基本介绍** 在 Unix 和 Linux 系统中,`dir` 命令实际上是 `ls` 命令的一个变体。它的主要功能是用来显示目录的内容列表[^3]。尽管 `dir` 命令的行为类似于 `ls`,但它并不是标准 POSIX 工具的一部分,因此其行为可能因操作系统或 shell 实现的不同而有所差异。 以下是 `dir` 命令的一些典型特点: - 默认情况下,`dir` 显示的信息包括文件名、权限、大小和修改时间。 - 它可以接受许多选项参数,这些选项与 `ls` 类似,用于控制输出格式和内容。 #### 2. **常用语法** `dir` 命令的基本形式如下所示: ```bash dir [OPTION]... [FILE]... ``` 其中 `[OPTION]` 是可选的标志参数,用于调整命令的行为,而 `[FILE]` 则是要查看的目标文件或目录。 #### 3. **常见的选项及其用途** | 参数 | 描述 | |--------------|----------------------------------------------------------------------| | `-l` | 使用长格式列出文件信息,包括权限、链接数、所有者、组、大小和日期等。 | | `-a` | 显示所有文件,包括隐藏文件(以`.`开头的文件)。 | | `-R` | 递归地列出子目录中的内容。 | | `-h` | 以人类易读的方式显示文件大小(例如 K, M, G 单位)。 | #### 4. **示例代码** 下面是一些具体的使用案例: ##### 示例 1:列出当前目录下所有的文件和子目录 ```bash dir ``` ##### 示例 2:以长格式显示文件详情 ```bash dir -l ``` ##### 示例 3:递归列出某个目录下的所有内容 ```bash dir -R /path/to/directory ``` ##### 示例 4:结合通配符查找特定类型的文件 假设我们需要找到扩展名为 `.txt` 的所有文件,则可以运行以下命令: ```bash dir *.txt ``` #### 5. **注意事项** 需要注意的是,在某些现代发行版中,`dir` 可能只是一个指向 `ls` 的符号链接,这意味着它们实际上共享相同的底层实现[^4]。在这种情况下,`dir` 的行为完全由 `ls` 控制,并且支持几乎相同的一系列选项。 --- ### 结合用户提到的 `dist_dir` 变量的理解 从之前的讨论来看,`dist_dir` 是一个变量,通常用来存储路径字符串。例如: ```bash dist_dir=/home/dev/code/ui/dist ``` 在这个上下文中,“`dir`” 并不特指 `dir` 命令本身,而是作为一个缩写代表 “directory”,即目录的概念。换句话说,`dist_dir` 表达的意思是分发版本所在的目录位置[^5]。 随后通过类似这样的方式更新 Nginx 配置文件中的根路径字段: ```bash string_command="s!^ *root .*;! root ${dist_dir};!" sed -i "$string_command" /etc/nginx/sites-available/default ``` 这里借助了 `sed` 流编辑器完成替换操作,最终实现了动态注入新的目录地址到服务器配置的目的。 --- ### 总结 综上所述,`dir` 在不同场景下具有双重身份:一方面作为独立命令存在,另一方面也可能仅作为一种惯用术语象征着某类实体对象——比如文件夹结构等等。理解这一点有助于更好地把握脚本设计意图以及相关技术细节。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值