APUE读书笔记(七)函数futimens和各种目录操作函数

1 函数futimens、utimensat和utimes

一个文件的访问和修改时间可以用这三个函数更改。

1.1 函数原型

/*futimens和utimensat函数都包含在POSIX.1中*/
#include<sys/stat.h>
int futimens(int fd,const struct timespec times[2]);
int utimensat(int fd,const char *path,const struct timespec times[2],int flag);

/*utimes函数包含在XSI扩展选项中*/
#include<sys/time.h>
int utimes(const char *pathname,const struct timeval times[2]);

1.2 参数说明

times:times数组参数的第一个元素包含访问时间,第二个元素包含修改时间。
fd:文件描述符

struct timespec结构的时间戳可以按下列4中方式之一进行指定:

  1. 如果times参数是一个空指针,则访问时间和修改时间两者都设置为当前时间。
  2. 如果times参数指向两个timespec结构的数组,任一数组元素的tv_nsec字段的值为UTIME_NOW,相应的时间戳就设置为当前时间,忽略相应的tv_sec字段。
  3. 如果times参数指向两个timespec结构的数组,任一数组元素的tv_nsec字段的值为UTIME_OMIT,相应的时间戳保持不变,忽略相应的tv_sec字段。
  4. 如果times参数指向两个timespec结构的数组,且tv_nsec字段的值为不是2和3中的情况,相应的时间戳设置为相应的tv_sec和tv_nsec字段的值

1.3 返回值

若成功,返回0;若出错,返回-1。

2 函数mkdir、mkdirat

用mkdir和mkdirat函数创建目录

2.1 mkdir函数原型

#include<sys/stat.h>
int mkdir(const char *pathname,mode_t mode);
int mkdirat(int fd,const char *pathname,mode_t mode);

2.2 参数说明

pathname:文件路径名
mode: 指定的文件访问权限,由进程的文件模式创建屏蔽字修改

2.3 返回值

这两个函数创建一个新的空目录。其中.和…目录项时自动创建的。
若成功,返回0;若出错,返回-1。

3 函数rmdir

用rmdir函数可以删除一个空目录。空目录是只包含.和…这两项的目录。

3.1 rmdir函数原型

#include<unistd.h>
int rmdir(const char *pathname);

3.2 参数说明

pathname:文件路径

3.3 返回值

如果调用此函数使目录的链接数计数成为0,并且也没有其他进程打开此目录,则释放由此目录占用的空间。
如果在链接计数达到0时,有一个或多个进程打开此目录,则在此函数返回前删除最后一个链接及.和…项。另外,在此目录中不能再创建新文件。但是在最后一个进程关闭它之前并不释放此目录。
若成功,返回0;若出错,返回-1。

4 读目录的各项操作函数

4.1 各种函数原型

#include<dirent.h>
/*以下两个函数返回值:若成功,返回指针;若出错,返回NULL
*dopendir:提供了一种方法,可以把打开文件描述符转换成目录处理函数需要的DIR结构
**/
DIR *opendir(const char *pathname);
DIR *fdopendir(int fd);

/*下面函数返回值:若成功,返回指针;若在目录尾或出错,返回NULL
*读目录下的文件,若成功读下一个文件,直到目录尾
**/
struct  dirent *readdir(DIR *dp);

/*用来设置参数dir目录流目前的读取位置为原来开头的读取位置*/
void rewinddir(DIR *dp);

/*下面函数返回值:若成功,返回0;若出错,返回-1*/
void closedir(DIR *dp);

/*下面函数返回值:与dp关联的目录中的当前位置
*函数的返回值记录着一个目录流的当前位置。
**/
long telldir(DIR *dp);

/*seekdir()用来设置参数dir 目录流目前的读取位置, 在调用readdir()时便从此新位置开始读取. 
参数loc 代表距离目录文件开头的偏移量。*/
void seekdir(DIR *dp,long loc);			

4.2 dirent结构

dirent结构与实现有关,定义在头文件<dirent.h>中。

struct dirent
{
   ino_t 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 []; /* file name (null-terminated) */
}

注意,d_name项的大小并没有指定,但必须保证它能包含至少NAME_MAX(一般为255)个字节(不包含终止null字节)。因为文件名是以null字节结束的,所以在头文件中如何定义数组d_name并无多大关系,数组大小并不能表示文件名的长度。

4.3 DIR结构

DIR结构是一个内部结构,上述7个函数用这个内部结构保存当前正在被读的目录的有关信息。

struct __dirstream
{
	void *__fd; /* `struct hurd_fd' pointer for descriptor.   */
	char *__data; /* Directory block.   */
	int __entry_data; /* Entry number `__data' corresponds to.   */
	char *__ptr; /* Current pointer into the block.   */
	int __entry_ptr; /* Entry number `__ptr' corresponds to.   */
	size_t __allocation; /* Space allocated for the block.   */
	size_t __size; /* Total valid data in the block.   */
	__libc_lock_define (, __lock) /* Mutex lock for this structure.   */
};
typedef struct __dirstream DIR;

4.4 示例——遍历某一目录所有目录项

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<dirent.h>
#include<sys/stat.h>

int main(int argc,char *argv[]){
        DIR *dir;
        struct dirent *read_ptr;
        long offset;

        //打开目录
        dir = opendir("../data");

        while((read_ptr = readdir(dir)) != NULL){ //循环读取目录中的目录项
                offset = telldir(dir); //记录当前偏移量
                printf("%ldth file,filename:%s\n",offset,read_ptr->d_name);
        }

        //关闭目录
        closedir(dir);
        return 0;
}

结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值