1、检查文件是否存在
access:按照实际用户ID和实际组进行访问权限测试
#include <unistd.h>
int access(const char* pathname, int mode);
pathname:文件路径
mode:
- F_OK:测试文件是否存在
- R_OK:测试读权限
- W_OK:测试写权限
- X_OK:测试执行权限
返回:0表示不存在
2、检查目录是否存在
opendir:打开文件目录,成功返回指针,否则返回NULL
if (opendir(dir_path) == NULL)
printf("dir not exist!\n");
else
printf("dir exist!\n");
3、stat系列函数
头文件:#include <sys/stat.h> #include <unistd.h>
函数定义: int stat(const char* file_name, struct stat* buf);
函数说明:通过文件名file_name获取文件信息,并保存在buf指向的结构体stat中
返回值:成功返回0,失败返回-1,错误代码保存在errno
错误代码:
- ENOENT:参数file_name指定的文件不存在
- ENOTDIR:目录存在但并非真正的目录(那是什么目录?)
- ELOOP:file_name有过多符号连接问题,上限为16个
- EFAULT:参数buf为无效指针,指向无法存在的内存空间
- EACCESS:存取文件时被拒绝
- ENOMEM:核心内存不足
- ENAMETOOLONG:参数file_name的路径名称太长
struct stat {
mode_t st_mode; // file type & mode(permissions)
ino_t st_ino; // i-node number(serial number)
dev_t st_dev; // device number(filesystem)
dev_t st_rdev; // device number for specials files
nlink_t st_nlink; // number of links
uid_t st_uid; // user ID of owner
gid_t st_gid; // group ID of owner
off_t st_size; // size in bytes, for regular files
time_t st_atime; // time of last access
time_t st_mtime; // time of last modification
time_t st_ctime; // time of last file status change
long st_blksize; // best I/O block size
long st_blocks; // number of 512-byte blocks allocated
};
st_mode:
S_IFMT 0170000 文件类型的位遮罩
S_IFSOCK 0140000 scoket
S_IFLNK 0120000 符号连接
S_IFREG 0100000 一般文件
S_IFBLK 0060000 区块装置
S_IFDIR 0040000 目录
S_IFCHR 0020000 字符装置
S_IFIFO 0010000 先进先出
S_ISUID 04000 文件的(set user-id on execution)位
S_ISGID 02000 文件的(set group-id on execution)位
S_ISVTX 01000 文件的sticky位
S_IRUSR(S_IREAD) 00400 文件所有者具可读取权限
S_IWUSR(S_IWRITE)00200 文件所有者具可写入权限
S_IXUSR(S_IEXEC) 00100 文件所有者具可执行权限
S_IRGRP 00040 用户组具可读取权限
S_IWGRP 00020 用户组具可写入权限
S_IXGRP 00010 用户组具可执行权限
S_IROTH 00004 其他用户具可读取权限
S_IWOTH 00002 其他用户具可写入权限
S_IXOTH 00001 其他用户具可执行权限
参考:
http://blog.csdn.net/tigerjibo/article/details/11695763#
http://www.cnblogs.com/Anker/p/3349672.html