文章目录

  • ​​1.ls -l功能分析​​
  • ​​2.获取当前工作路径:getcwd()​​
  • ​​3.获取当前工作路径:get_current_dir_name(void)​​
  • ​​4. Dir结构体​​
  • ​​5.打开目录​​
  • ​​6.关闭目录​​
  • ​​7.Dirent结构体​​
  • ​​8.读取目录文件​​

1.ls -l功能分析

(2.5)文件和目录操作——Linux目录操作_错误代码

  • 文件属性
  • 文件类型与文件访问权限
  • ls -l的程序设计

2.获取当前工作路径:getcwd()

  • buf为空,size为0可以动态分配空间,函数会根据路径字符串的长度来自动分配缓冲区,并将分配的字符串缓冲区的指针,作为函数返回值,需要注意的是:在使用完以后释放缓冲区,以免出现内存泄漏的问题。
头文件: unistd.h

函数声明: char *getcwd(char *buf,size_t size);

函数说明:
将当前的工作目录绝对路径字符串复制到参数buf所指的缓冲区, 参数size为buf缓冲区大小。

返回值:
成功调用返回指向buf的指针, 失败返回NULL

示例程序
#define MAX_SIZE 255
char path[MAX_SIZE];
getcwd(path, sizeof(path));
puts(path);

3.获取当前工作路径:get_current_dir_name(void)

头文件: unistd.h

函数声明: char * get_current_dir_name(void);

函数说明:

调用后会返回一个字符串指针, 指向当前工作目录绝对路径字符串

返回值:
成功则返回字符串指针, 失败则返回空, 错误代码存放于errno中

4. Dir结构体

类似于file,是一个内部的结构,常用的目录操作都会使用该目录结构来保存当前正在被读取的
目录的有关信息。
struct __dirstream
{
void *__fd;目录描述符信息
char *__data;
int __entry_data;
char *__ptr;
int __entry_ptr;
size_t __allocation;
size_t __size;
__libc_lock_define (, __lock)
};
typedef struct __dirstream DIR;

5.打开目录

头文件: sys/types.h dirent.h

函数声明: DIR *opendir(const char *path);

函数说明: 打开参数name指定的目录

返回值: 成功则返回DIR形态的目录流, 失败则返回空, 错误代码存放于errno中

错误代码:
EACCESS, 代表权限不足, 也就是对这个目录没有执行权限。
EMFILE表示目前同时打开这个文件的进程数目已经到达了系统上限。
ENFILE代表已经达到系统可以同时打开的文件数上限。
ENOTDIR代表参数name指向的不是一个真正的目录。
EOENT表示参数name指向的目录不存在, 或者参数name是一个空的字符串。
ENOMEM表示核心内存不足。

6.关闭目录

头文件: sys/types.h dirent.h

函数声明: int closedir(DIR *dir);

函数说明:
关闭参数dir指定的目录

返回值:
关闭成功就返回0, 失败的话就返回-1, 错误原因存于errno中

错误代码:
EBADF, 代表参数dir是一个无效的目录流

7.Dirent结构体

  • 该结构体包含了其他文件的名字,以及指向与这些文件有关的指针;它不仅仅指向目录,还指向目录中的具体文件;
  • 只起到索引的作用;
struct dirent
{
ino_t d_ino; i节点号
off_t d_off; 在目录文件中的偏移
usigned short d_reclen; 文件名长度
unsigned char d_type; 文件类型
char d_name[256];文件名
}

8.读取目录文件

头文件: sys/types.h dirent.h

函数声明: struct dirent *readdir(DIR *dirp);

函数说明:
读取目标流dir标识的目录

返回值:
每执行一次readdir, 这个函数返回指向当前读取目录项结构的指针, 有错误发生或读取到目录文件尾的
时候就返回NULL

错误代码:
EBADF, 代表参数dir是一个无效的目录流