c++操作目录

102 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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;//该文件所占用的磁盘块
}