文章目录
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中方式之一进行指定:
- 如果times参数是一个空指针,则访问时间和修改时间两者都设置为当前时间。
- 如果times参数指向两个timespec结构的数组,任一数组元素的tv_nsec字段的值为UTIME_NOW,相应的时间戳就设置为当前时间,忽略相应的tv_sec字段。
- 如果times参数指向两个timespec结构的数组,任一数组元素的tv_nsec字段的值为UTIME_OMIT,相应的时间戳保持不变,忽略相应的tv_sec字段。
- 如果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;
}
结果: