c语言整理目录和文件的操作扩展

access库函数

 包含于#include<unistd.h>中

声明

int access(const char *pathname,int mode)

pathname  文件名或目录名,可以是当前目录的文件或目录,也可以是全路径

mode 需要判断的存取权限。

mode 需要判断的存取权限。在头文件unistd.h中的预定义如下:

#define R_OK 4     // R_OK 只判断是否有读权限
#define W_OK 2    // W_OK 只判断是否有写权限
#define X_OK 1     // X_OK 判断是否有执行权限
#define F_OK 0     // F_OK 只判断是否存在

返回值:

当pathname满足mode的条件时候返回0,不满足返回-1。     access函数主要用于判断文件或目录是否是存在。

测试:

#include<stdio.h>
#include<unistd.h>
int main()
{
    if(access("/root/zty",R_OK)==0)   printf("zty有读权限\n");
    if(access("/root/zty",W_OK)==0)   printf("zty有写权限\n");
    if(access("/root/zty",X_OK)==0)   printf("zty有执行权限\n");
    if(access("/root/zty",F_OK)==0)   printf("zty存在\n");
    return 0;
}
zty有读权限
zty有写权限
zty有执行权限
zty存在

stat库函数

stat结构体

struct stat
{
  dev_t st_dev;   // device 文件的设备编号
  ino_t st_ino;   // inode 文件的i-node
  mode_t st_mode;   // protection 文件的类型和存取的权限
  nlink_t st_nlink;   // number of hard links 连到该文件的硬连接数目, 刚建立的文件值为1.
  uid_t st_uid;   // user ID of owner 文件所有者的用户识别码
  gid_t st_gid;   // group ID of owner 文件所有者的组识别码
  dev_t st_rdev;  // device type 若此文件为设备文件, 则为其设备编号
  off_t st_size;  // total size, in bytes 文件大小, 以字节计算
  unsigned long st_blksize;  // blocksize for filesystem I/O 文件系统的I/O 缓冲区大小.
  unsigned long st_blocks;  // number of blocks allocated 占用文件区块的个数, 每一区块大小为512 个字节.
  time_t st_atime;  // time of lastaccess 文件最近一次被存取或被执行的时间, 一般只有在用mknod、 utime、read、write 与       tructate 时改变.
  time_t st_mtime;  // time of last modification 文件最后一次被修改的时间, 一般只有在用mknod、 utime 和write 时才会改变
  time_t st_ctime;  // time of last change i-node 最近一次被更改的时间, 此参数会在文件所有者、组、 权限被更改时更新
};

注意:st_mode       // time of last modification 文件最后一次被修改的时间, 一般只有在用mknod、 utime 和write 时才会改变

                               重要的是8-常规文件,,4-目录    可以使用两个宏来判断

                              S_ISREG(st_mode)是否为一般文件。

                              S_ISDIR(st_mode)是否为目录

           st_szie         // total size, in bytes 文件大小, 以字节计算

            st_mtime     // time of last modification 文件最后一次被修改的时间, 一般只有在用mknod、 utime 和write 时才会改变

                               注意st_mtime是一个整数表达的时间,需要自己写代码转换格式。

stat库函数

包含头文件

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

声明:

int stat(const char *path, struct stat *buf);

stat函数获取path指定文件或目录的信息,并将信息保存到结构体buf中,执行成功返回0,失败返回-1。

测试:

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<sys/stat.h>
#include<unistd.h>
int main(int argc,char *argv[])
{
  if(access(argv[1],F_OK)!=0)
    {
    printf("文件或者目录%s不存在\n",argv[1]);
    return -1;
    }
   struct tm *tt;
   struct stat ii;
   if(stat(argv[1],&ii)!=0)  return -1;
   //测试宏定义
   if(S_ISREG(ii.st_mode))
   printf("%s是一个文件\n",argv[1]);

   if(S_ISDIR(ii.st_mode))
   printf("%s是目录\n",argv[1]);

   tt=localtime(&ii.st_mtime);   //把整数时间,改成正常时间
   
   printf("文件名是%s,时间是%04u-%02u-%02u  %02u:%02u:%02u,size=%d\n",argv[1],tt->tm_year+1900,tt->tm_
mon+1,tt->tm_mday,tt->tm_hour,tt->tm_min,tt->tm_sec,ii.st_size);
    return 0;
}

 结果:

/root/zty是目录
文件名是/root/zty,时间是2019-05-24  10:05:55,size=4096

utime库函数

utime函数用于修改文件的存取时间和更改时间。

头文件:

#include <utime.h>

声明:

int utime(const char *filename, const struct utimbuf *times);

说明:utime()用来修改参数filename 文件/目录所属的inode 存取时间。

如果参数times为空指针(NULL), 则该文件的存取时间和更改时间全部会设为目前时间。

如果times不为空可以改为指定的时间。具体参考下面举例

结构utimbuf 定义如下:

struct utimbuf
{
  time_t actime;
  time_t modtime;
};      //成功返回0,失败返回-1。

测试:

当times参数为空时

#include<sys/stat.h>
#include<unistd.h>
#include<sys/stat.h>
#include<unistd.h>
int main(int argc,char *argv[])
{
  if(access(argv[1],F_OK)!=0)
    {
    printf("文件或者目录%s不存在\n",argv[1]);
    return -1;
    }
   utime(argv[1],0);    //修改所指定文件的最后一次文件内容改动的时间为当前时间
   struct tm *tt;
   struct stat ii;
   if(stat(argv[1],&ii)!=0)  return -1;
   //测试宏定义
   if(S_ISREG(ii.st_mode))
   printf("%s是一个文件\n",argv[1]);

   if(S_ISDIR(ii.st_mode))
   printf("%s是目录\n",argv[1]);

   tt=localtime(&ii.st_mtime);

   printf("文件名是%s,时间是%04u-%02u-%02u  %02u:%
02u:%02u,size=%d\n",argv[1],tt->tm_year+1900,tt->
tm_mon+1,tt->tm_mday,tt->tm_hour,tt->tm_min,tt->tm
_sec,ii.st_size);
    return 0;
-rwxr-xr-x 1 root root 8776 5月  19 10:05 /root/zty/1  //修改前
-rwxr-xr-x 1 root root 8776 5月  19 10:51 /root/zty/1   //修改后

当times参数不为空的时候

需要调用自定义函数

 

rename库函数

rename函数用于重命名文件或目录,相当于操作系统的mv命令,在程序中极少重命名目录,但是重命名文件是经常用到的功能。

#include <stdio.h>

声明:

int rename(const char *oldpath, const char *newpath);

说明:

oldpath 文件或目录的原名。

newpath 文件或目录的新的名称。

返回值:0-成功,-1-失败。

测试:

#include<stdio.h>
#include<stdlib.h>
int main ()
{
  rename("/root/zty/2.c","/root/zty/haha.c");

  return 0;
}

 已更改

remove库函数

remove函数用于删除文件或目录,相当于操作系统的rm命令。

包含头文件:

#include <stdio.h>

函数声明:

int remove(const char *pathname);

参数说明:

pathname 待删除的文件或目录名。

返回值:0-成功,-1-失败。

测试:

#include<stdio.h>
#include<stdlib.h>
int main ()
{
  remove("haha.c");
  return 0;
}

已经删除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值