(1)判断文件是否可以进行某种操作
intaccess(const char *pathname,int mode)
mode可是是R_OK文件可以读,W_OK文件可以写,X_OK文件可以执行,F_OK文件存在.这几个或组合,当测试成功时 ,函数返回0,否则如果有一个条件不符时,返回-1.
如果要获取其他属性时可以使用函数stat或者fstat
#include<sys/stat.h>;
#include<unistd.h>;
intstat(const char *file_name,struct stat *buf);
intfstat(int filedes,struct stat *buf);
structstat {
dev_tst_dev; /* 设备 */
ino_tst_ino; /* 节点 */
mode_tst_mode; /* 模式 */
nlink_tst_nlink; /* 硬连接 */
uid_tst_uid; /* 用户 ID*/
gid_tst_gid; /* 组 ID*/
dev_tst_rdev; /* 设备类型 */
off_tst_off; /* 文件字节数 */
unsignedlong st_blksize; /* 块大小 */
unsignedlong st_blocks; /* 块数 */
time_tst_atime; /* 最后一次访问时间*/
time_tst_mtime; /* 最后一次修改时间*/
time_tst_ctime; /* 最后一次改变时间(指属性)
};
stat用来判断没有打开的文件,fstat用来判断打开的文件。
S_ISLNK(st_mode):是否是一个连接.S_ISREG是否是一个常规文件.S_ISDIR是否是一个目 录 S_ISCHR是否是一个字符设备.S_ISBLK是否是一个块设备 S_ISFIFO是否 是一个 FIFO文 件.S_ISSOCK是否是一个 SOCKET文件.
(2)目录操作
intmkdir(const char *path,mode_t mode);
DIR*opendir(const char *path);
structdirent *readdir(DIR *dir);
voidrewinddir(DIR *dir);
off_ttelldir(DIR *dir);
voidseekdir(DIR *dir,off_t off);
intclosedir(DIR *dir);
structdirent {
longd_ino;
off_td_off;
unsignedshort d_reclen;
chard_name[NAME_MAX+1]; /* 文件名称*/
mkdir很容易就是我们创建一个目录,opendir打开一个目录为以后读做准备.readdir读一 个打开的目录.rewinddir是用来重读目录的和.closedir是关闭 一个目录.
实例:
#include<unistd.h>
#include<stdio.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<dirent.h>
#include<time.h>
staticint get_file_size_time(const char * filename){
structstat statbuf;
if(stat(filename,&statbuf)==-1){
printf("Getstat on %s\n ERROR",
filename);
return-1;
}
if(S_ISDIR(statbuf.st_mode))
return1;
if(S_ISREG(statbuf.st_mode)){
printf("%ssize:%ld bytes\tmodified at %s",
filename,statbuf.st_size,ctime(&statbuf.st_mtime));
printf("-------------------------------------\n");
intr_ok;
intw_ok;
intx_ok;
intf_ok;
r_ok=access(filename,R_OK);
w_ok=access(filename,W_OK);
x_ok=access(filename,X_OK);
f_ok=access(filename,F_OK);
printf("判断权限(-1代表否0代表是):读操作:%d,写操作:%d,可执行:%d,存在:%d\n",
r_ok,w_ok,x_ok,f_ok);
return0;
}
}
intmain(int argc,char **argv){
DIR* dirp;
structdirent * direntp;
intstats;
if(argc!=2){
printf("usage:%sfilename\n\a",argv[0]);
return1;
}
stats=get_file_size_time(argv[1]);
if(stats==0||stats==-1)
return0;
if((dirp=opendir(argv[1]))==NULL){
printf("opendir %s Error \n",
argv[1]);
return0;
}
while((direntp=readdir(dirp))!=NULL){
if(get_file_size_time(direntp->d_name)==-1)
break;
}
closedir(dirp);
return0;
}