首页 > 其他分享 >C语言目录和文件操作扩展

C语言目录和文件操作扩展

时间:2022-11-22 22:35:59浏览次数:43  
标签:文件 stat const 扩展 st char C语言 目录


文章目录

  • ​​一、access库函数​​
  • ​​二、stat库函数​​
  • ​​1、stat结构体​​
  • ​​2、stat库函数​​
  • ​​三、utime库函数​​
  • ​​四、rename库函数​​
  • ​​五、remove库函数​​
  • ​​六、课后作业​​
  • ​​七、获取视频教程​​
  • ​​八、版权声明​​


本章节扩展一些目录和文件操作的更多知识,因为这些知识涉及到时间操作,所以放在时间操作之后的章节中介绍。

一、access库函数

access函数用于判断当前操作系统用户对文件或目录的存取权限。

包含头文件:

#include <unistd.h>

函数声明:

int access(const char *pathname, int mode);

参数说明:

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

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函数主要用于判断文件或目录是否是存在。

二、stat库函数

1、stat结构体

struct 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 最近一次被更改的时间, 此参数会在文件所有者、组、 权限被更改时更新
};

struct stat结构体的成员变量比较多,对程序员来说,重点关注st_mode、st_size和st_mtime成员就可以了。注意st_mtime是一个整数表达的时间,需要程序员自己写代码转换格式。

st_mode成员的取值很多,或者使用如下两个宏来判断。

S_ISREG (st_mode) 是否为一般文件 
S_ISDIR (st_mode) 是否为目录

2、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。

示例(book145.c)

/*
* 程序名:book145.c,此程序演示目录和文件的存取权限和状态信息
* 作者:C语言技术网(www.freecplus.net) 日期:20190525
*/
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>

// 本程序运行要带一个参数,即文件或目录名
int main(int argc,char *argv[])
{
if (argc != 2) { printf("请指定目录或文件名。\n"); return -1; }

if (access(argv[1],F_OK) != 0) { printf("文件或目录%s不存在。\n",argv[1]); return -1; }

struct stat ststat;

// 获取文件的状态信息
if (stat(argv[1],&ststat) != 0) return -1;

if (S_ISREG(ststat.st_mode)) printf("%s是一个文件。\n",argv[1]);
if (S_ISDIR(ststat.st_mode)) printf("%s是一个目录。\n",argv[1]);
}

运行效果

C语言目录和文件操作扩展_头文件

三、utime库函数

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

包含头文件:

#include <utime.h>

函数声明:

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

函数说明:utime()用来修改参数filename 文件所属的inode存取时间。如果参数times为空指针(NULL),
则该文件的存取时间和更改时间全部会设为目前时间。结构utimbuf 定义如下:

struct utimbuf
{
time_t actime;
time_t modtime;
};

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

四、rename库函数

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

包含头文件:

#include <stdio.h>

函数声明:

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

参数说明:

oldpath 文件或目录的原名。

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

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

五、remove库函数

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

包含头文件:

#include <stdio.h>

函数声明:

int remove(const char *pathname);

参数说明:

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

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

六、课后作业

1)继续丰富您的函数库,用mkdir创建目录的时候,例如mkdir("/tmp/aaa/bbb/ccc",0755);,如果上级目录不存在(/tmp/aaa或/tmp/aaa/bbb不存在),是无法创建/tmp/aaa/bbb/ccc目录的,这不是程序员想要的,我们要再写一个函数,如果上级目录不存在,就创建上级目录,一级一级的创建,函数的声明如下:

int MKDIR(const char *pathname);

2)编写一个获取文件时间的函数,声明如下:

// 获取文件的时间,即modtime
void FileMTime(const char *in_FullFileName,char *out_ModTime);

out_ModTime的格式是"yyyy-mm-dd hh24:mi:ss"。

3)编写一个获取文件大小的函数,声明如下:

// 获取文件的大小,返回字节数
int FileSize(const char *in_FullFileName);

4)rename函数有一个不足,如果目标文件名目录newpath的上级目录不存在,函数返回失败,重写一个新的RENAME函数,如果newpath的上级目录不存在,先创建newpath的上级目录,再rename,函数的声明如下:

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

5)utime函数的第二个参数是一个结构体utimbuf,不方便使用,在实际开发中,我们更希望是一个字符串格式的时间,如:“2019-02-08 12:05:02”,重写一个utime函数,功能与utime相同,但是把第二个参数改为字符串格式的时间,函数的声明如下:

int UTIME(const char *filename, const char *strtime);

七、获取视频教程

八、版权声明

作者:码农有道

如果文章有错别字,或者内容有错误,或其他的建议和意见,请您留言指正,非常感谢!!!


标签:文件,stat,const,扩展,st,char,C语言,目录
From: https://blog.51cto.com/u_13748800/5878567

相关文章

  • C语言时间操作
    文章目录​​一、time_t别名​​​​二、time库函数​​​​三、tm结构体​​​​四、localtime库函数​​​​五、mktime库函数​​​​在这里插入图片描述六、程序睡眠​......
  • C语言获取系统错误
    文章目录​​一、strerror函数​​​​二、errno的细节​​​​1、调用库函数失败不一定会设置errno​​​​2、errno不能作为调用库函数失败的标志​​​​3、程序员可以不......
  • C语言编译预处理
    文章目录​​一、预处理指令​​​​二、包含文件​​​​三、宏定义指令​​​​1、无参数的宏​​​​2、带参数的宏​​​​四、条件编译​​​​1、#ifdef​​​​2、#i......
  • C语言gdb调试
    文章目录​​一、gdb的安装​​​​二、调试前的准备​​​​三、基本调试命令​​​​四、课后作业​​​​五、获取视频教程​​​​六、版权声明​​程序员写在编写程序......
  • C语言makefile文件
    文章目录​​一、makefile的编写​​​​二、make命令​​​​三、makefile文件中的变量​​​​四、应用经验​​​​五、课后作业​​​​六、获取视频教程​​​​七、版......
  • C语言数据类型
    文章目录​​一、基本类型​​​​1、字符型(char)​​​​2、整型(int)​​​​3、浮点型(float)​​​​二、字符串​​​​三、构造类型​​​​四、指针类型​​​​五、其它......
  • C语言学习笔记---static关键字
    1、static修饰局部变量在函数体内,只初始化一次,被static声明过的局部变量在调用过程中值不变。原因:在任意函数内定义局部变量,存储在线程中的栈区,出函数时自动摧毁,所以在每......
  • c语言的钩子与C++的策略模式
    1.c语言钩子:特性模块:功能函数,调用注册函数主线模块:注册函数,定义钩子(通常是全局变量),调用钩子 2.c++策略模式:特性模块:从策略基类派生一个新特性类,实例化对象并调用se......
  • 这是注册博客的第一天,哈哈哈,我希望把我学到的编程内容记录下来,同时分享给和现在的我一
    #include<stdio.h>voidbubble_sort(intsz,intarr[])//不能只是intarr[],两个int间用逗号隔开{//先确定冒泡排序的趟数inti=0;for(i=0;i<sz-1;i++){intj=0;intflag=1......
  • 【linux基础(二)】Linux文件(目录)命名规则
    在Linux系统中,一切都是文件,既然是文件,就必须要有文件名。同其他系统相比,Linux操作系统对文件或目录命名的要求相对比较宽松。Linux系统中,文件和目录的命名规则如下:除......