持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第30天,点击查看活动详情
创建目录MKDIR
// 根据绝对路径的文件名或目录名逐级的创建目录。
// pathorfilename:绝对路径的文件名或目录名。
// bisfilename:说明pathorfilename的类型,true-pathorfilename是文件名,否则是目录名,缺省值为true。
// 返回值:true-创建成功,false-创建失败,如果返回失败,原因有大概有三种情况:1)权限不足; 2)pathorfilename参数不是合法的文件名或目录名;3)磁盘空间不足。
bool MKDIR(const char *filename,bool bisfilename)
{
// 检查目录是否存在,如果不存在,逐级创建子目录
char strPathName[301];
int ilen=strlen(filename);
for (int ii=1; ii<ilen;ii++)
{
if (filename[ii] != '/') continue;
memset(strPathName,0,sizeof(strPathName));
strncpy(strPathName,filename,ii);
if (access(strPathName,F_OK) == 0) continue;
if (mkdir(strPathName,0755) != 0) return false;
}
if (bisfilename==false)
{
if (access(filename,F_OK) != 0)
{
if (mkdir(filename,0755) != 0) return false;
}
}
return true;
}
access/mkdir
#include<unistd.h>
int access(const char* pathname, int mode);
参数介绍:
pathname 是文件的路径名+文件名
mode:指定access的作用,取值如下
F_OK 值为0,判断文件是否存在
X_OK 值为1,判断对文件是可执行权限
W_OK 值为2,判断对文件是否有写权限
R_OK 值为4,判断对文件是否有读权限
注:后三种可以使用或“|”的方式,一起使用,如W_OK|R_OK 返回值:成功0,失败-1
获取目录信息
dirent
1包含头文件
#include <dirent.h>
2、struct dirent 结构
struct dirent
{
long d_ino; /* inode number 索引节点号 */
off_t d_off; /* offset to this dirent 在目录文件中的偏移 */
unsigned short d_reclen; /* length of this d_name 文件名长 */
unsigned char d_type; /* the type of d_name 文件类型 */
char d_name [NAME_MAX+1]; /* file name (null-terminated) 文件名,最长255字符 */
}
使用:
DIR *dp = opendir(src); //打开目录src,并拷贝到(DIR定义)目录dp
struct dirent *dirp; //dirp指向结构dirent(dirp命名自定义)
dirp = readdir(dp); //返回参数dp目录流的下个目录进入点
dirp -> d_name; //通过dirp 指向(->)文件名(d_name),从而获取dp/src的文件名
获取属性时通过“->”实现: dirp -> d_name / dirp -> d_type / dirp -> d_reclen
struct stat
1、需要包含头文件
#include <sys/types.h>
#include <sys/stat.h>
2、我们使用最多的属性是st_mode.通过着属性我们可以判断给定的文件是一个普通文件还是一个目录,连接等等.可以使用下面几个宏来判断:
S_ISLNK(st_mode)是否是一个连接.
S_ISREG(st_mode)是否是一个常规文件.
S_ISDIR(st_mode)是否是一个目录
S_ISCHR(st_mode)是否是一个字符设备.
S_ISBLK(st_mode)是否是一个块设备
S_ISFIFO(st_mode)是否是一个FIFO文件.
S_ISSOCK(st_mode)是否是一个SOCKET文件.
使用:
struct stat info; //info指向结构stat(info命名自定义)
bzero(&info, sizeof(info)); //初始化为0
stat(argv[1], &info); //函数 stat,用来获取文件argv[1]的属性
if(S_ISREG(info.st_mode)) // 判断文件的类型
获取属性时通过“.”实现: info.st_mode / info.st_size / info.st_ctime
DIR *dir;
const char* t= "/tmp/root";
dir=opendir(t);
struct dirent *st_fileinfo;
while ((st_fileinfo=readdir(dir)) != 0)
{
// 以"."打头的文件不处理
if (st_fileinfo->d_name[0]=='.') continue;
printf("%s\n",st_fileinfo->d_name);
}
函数DIR* opendir(const char* pathname),打开文件目录,返回DIR结构体的指针。
具体使用函数:strcut dirent* readdir(DIR* dp);
void rewinddir(DIR *dp);
int closedir(DIR *dp);
long telldir(DIR *dp);
void seekdir(DIR* dp, long loc);
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;
通过readdir函数读取到的文件名存储在结构体dirent的d_name中,而函数 int stat(const char *file_name, struct stat *buf);的作用就是获取文件名为d_name的文件的详细信息
strcut stat {
mode_t st_mode;//文件访问权限
ino_t st_ino;//索引节点号
dev_t st_dev;//文件使用的设备号
dev_t st_rdev;//设备文件的设备号
nlink_t st_nlink;//文件的硬连接数
uid_t st_uid;//所有者用户识别号
gid_t st_gid;//组识别号
off_t st_size;//以字节为单位的文件容量
time_t st_atime;//最后一次访问文件的时间
time_t st_mtime;//最后一次修改该文件的时间
time_t st_ctime;//最后一次改变该文件状态的时间
blksize_t st_blksize;//包含该文件的磁盘块的大小
blkcnt_t st_blocks;//该文件所占用的磁盘块
}