linux c学习笔记----目录文件的操作(opendir,readdir,closedir)
2015-03-02 09:36
549 查看
http://lobert.iteye.com/blog/1706165
注:为什么要说目录文件?其实在linux中目录也是一种文件,只是它的内容是上级的目录和当前目录下的文件信息等,详情可以看看相关深入的书籍
opendir(打开目录)
closedir(关闭目录)
下面我们开发一个小程序,这个程序有一个参数.如果这个参数是一个文件名,我们输出这
个文件的大小和最后修改的时间,如果是一个目录我们输出这个目录下所有文件的大小和
修改时间.
C代码
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <time.h>
static int get_file_size_time(const char *filename) {
struct stat statbuf;
if (stat(filename, &statbuf) == -1) {
printf("Get stat on %s Error:%s\n",
filename, strerror(errno));
return (-1);
}
if (S_ISDIR(statbuf.st_mode))return (1);
if (S_ISREG(statbuf.st_mode))
printf("%s size:%ld bytes\tmodified at %s",
filename, statbuf.st_size, ctime(&statbuf.st_mtime));
return (0);
}
int main(int argc, char **argv) {
DIR *dirp;
struct dirent *direntp;
int stats;
char buf[80];
if (argc != 2) {
printf("Usage:%s filename\n\a", argv[0]);
exit(1);
}
if (((stats = get_file_size_time(argv[1])) == 0) || (stats == -1))exit(1);
if ((dirp = opendir(argv[1])) == NULL) {
printf("Open Directory %s Error:%s\n",
argv[1], strerror(errno));
exit(1);
}
while ((direntp = readdir(dirp)) != NULL){
sprintf(buf,"%s/%s",argv[1],direntp->d_name);
if (get_file_size_time(buf) == -1)break;
}
closedir(dirp);
exit(1);
}
注:为什么要说目录文件?其实在linux中目录也是一种文件,只是它的内容是上级的目录和当前目录下的文件信息等,详情可以看看相关深入的书籍
opendir(打开目录)
相关函数 | open,readdir,closedir,rewinddir,seekdir,telldir,scandir |
表头文件 | #include<sys/types.h> #include<dirent.h> |
定义函数 | DIR * opendir(const char * name); |
函数说明 | opendir()用来打开参数name指定的目录,并返回DIR*形态的目录流,和open()类似,接下来对目录的读取和搜索都要使用此返回值。 |
返回值 | 成功则返回DIR* 型态的目录流,打开失败则返回NULL。 |
错误代码 | EACCESS 权限不足 EMFILE 已达到进程可同时打开的文件数上限。 ENFILE 已达到系统可同时打开的文件数上限。 ENOTDIR 参数name非真正的目录 ENOENT 参数name 指定的目录不存在,或是参数name 为一空字符串。 ENOMEM 核心内存不足。 |
readdir(读取目录) |
相关函数 | open,opendir,closedir,rewinddir,seekdir,telldir,scandir |
表头文件 | #include<sys/types.h> #include<dirent.h> |
定义函数 | struct dirent * readdir(DIR * dir); |
函数说明 | readdir()返回参数dir目录流的下个目录进入点。 结构dirent定义如下 struct dirent { ino_t d_ino; ff_t d_off; signed short int d_reclen; unsigned char d_type; har d_name[256; }; d_ino 此目录进入点的inode d_off 目录文件开头至此目录进入点的位移 d_reclen _name的长度,不包含NULL字符 d_type d_name 所指的文件类型 d_name 文件名 |
返回值 | 成功则返回下个目录进入点。有错误发生或读取到目录文件尾则返回NULL。 |
附加说明 | EBADF参数dir为无效的目录流。 |
相关函数 | opendir |
表头文件 | #include<sys/types.h> #include<dirent.h> |
定义函数 | int closedir(DIR *dir); |
函数说明 | closedir()关闭参数dir所指的目录流。 |
返回值 | 关闭成功则返回0,失败返回-1,错误原因存于errno 中。 |
错误代码 | EBADF 参数dir为无效的目录流 |
范例 | 参考readir()。 |
个文件的大小和最后修改的时间,如果是一个目录我们输出这个目录下所有文件的大小和
修改时间.
C代码
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <time.h>
static int get_file_size_time(const char *filename) {
struct stat statbuf;
if (stat(filename, &statbuf) == -1) {
printf("Get stat on %s Error:%s\n",
filename, strerror(errno));
return (-1);
}
if (S_ISDIR(statbuf.st_mode))return (1);
if (S_ISREG(statbuf.st_mode))
printf("%s size:%ld bytes\tmodified at %s",
filename, statbuf.st_size, ctime(&statbuf.st_mtime));
return (0);
}
int main(int argc, char **argv) {
DIR *dirp;
struct dirent *direntp;
int stats;
char buf[80];
if (argc != 2) {
printf("Usage:%s filename\n\a", argv[0]);
exit(1);
}
if (((stats = get_file_size_time(argv[1])) == 0) || (stats == -1))exit(1);
if ((dirp = opendir(argv[1])) == NULL) {
printf("Open Directory %s Error:%s\n",
argv[1], strerror(errno));
exit(1);
}
while ((direntp = readdir(dirp)) != NULL){
sprintf(buf,"%s/%s",argv[1],direntp->d_name);
if (get_file_size_time(buf) == -1)break;
}
closedir(dirp);
exit(1);
}
相关文章推荐
- linux c下目录文件的操作(opendir,readdir,closedir)
- Linux下目录文件的操作(opendir,readdir,closedir) 以及DIR,dirent,stat等结构体详解
- Linux C/C++ ----目录文件的操作(opendir,readdir,closedir)
- opendir、readdir和closedir(PHP操作目录和文件)
- linux 目录操作函数opendir readdir closedir,文件stat
- 目录操作函数opendir、readdir和closedir
- 文件操作opendir()/readdir()/closedir()/stat()
- 文件操作opendir()/readdir()/closedir()/stat()
- php读取目录文件函数is_dir(),opendir(),readdir(),closedir()
- perl中目录句柄的操作(opendir, readdir, closedir)
- 文件操作opendir()/readdir()/closedir()/stat() .
- Linux 文件操作函数 opendir()、readdir()、closedir()、stat()
- linux C 遍历目录及其子目录 opendir -> readdir -> closedir .
- linux C 遍历目录及其子目录 opendir -> readdir -> closedir
- opendir 、closedir 、readdir 目录函数
- linux C 遍历目录及其子目录 opendir -> readdir -> closedir
- Linux中读取目录: opendir,fdopendir,readdir,rewinddir,closedir,telldir,seekdir
- linux中文件操作 opedir->readdir->closedir
- 文件系统中opendir 和 readdir , closedir用法
- is_dir(),opendir(),readdir()简单遍历目录下的文件