白话Linux下C编程(三)文件入门(3):目录操作

白话Linux下C编程(三)文件入门(3):目录操作

在我们编写程序的时候,有时候会要得到我们当前的工作路径。C库函数提供了getcwd来解决这个问题。

#include <unistd.h>;

char *getcwd(char *buffer,size_t size);

我们提供一个size大小的buffer,getcwd会把我们当前的路径考到buffer中。如果buffer太小,函数会返回-1和一个错误号。

Linux提供了大量的目录操作函数,我们学习几个比较简单和常用的函数。

#include <dirent.h>;

#include <unistd.h>;

#include <fcntl.h>;

#include <sys/types.h>;

#include <sys/stat.h>;

int mkdir(const char *path,mode_t mode);

DIR *opendir(const char *path);

struct dirent *readdir(DIR *dir);

void rewinddir(DIR *dir);

off_t telldir(DIR *dir);

void seekdir(DIR *dir,off_t off);

int closedir(DIR *dir);

struct dirent {

long d_ino;

off_t d_off;

unsigned short d_reclen;

char d_name[NAME_MAX+1]; /* 文件名称 */

mkdir很容易就是我们创建一个目录,opendir打开一个目录为以后读做准备。readdir读一个打开的目录。rewinddir是用来重读目录的和我们学的rewind函数一样。closedir是关闭一个目录。telldir和seekdir类似与ftee和fseek函数。

下面我们开发一个小程序,这个程序有一个参数。如果这个参数是一个文件名,我们输出这

个文件的大小和最后修改的时间,如果是一个目录我们输出这个目录下所有文件的大小和修改时间。

#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 statstatbuf;

if(stat(filename,&statbuf)==-1)

{

printf("Getstat 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("%ssize:%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;

if(argc!=2)

{

printf("Usage:%sfilename/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("OpenDirectory %s Error:%s/n",

argv[1],strerror(errno));

exit(1);

}

while((direntp=readdir(dirp))!=NULL)

if(get_file_size_time(direntp-<d_name)==-1)break;

closedir(dirp);

exit(1);

}

或许是某座闻名遐迩的文化古城。我们可以沿途用镜头记录彼此的笑脸,

白话Linux下C编程(三)文件入门(3):目录操作

相关文章:

你感兴趣的文章:

标签云: