(2.5)文件和目录操作——Linux目录操作
原创
©著作权归作者所有:来自51CTO博客作者喜欢打篮球的普通人的原创作品,请联系作者获取转载授权,否则将追究法律责任
文章目录
- 1.ls -l功能分析
- 2.获取当前工作路径:getcwd()
- 3.获取当前工作路径:get_current_dir_name(void)
- 4. Dir结构体
- 5.打开目录
- 6.关闭目录
- 7.Dirent结构体
- 8.读取目录文件
1.ls -l功能分析
- 文件属性
- 文件类型与文件访问权限
- 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是一个无效的目录流