本节只有两个函数。
rename函数
#include <stdio.h>
int rename (const char *oldpath, const char *newpath);
rename会将参数oldpath所指定的文件名称改为参数newpath所指定的文件名称,若newpath所指定的文件已存在,则原文件会被删除;
成功返回0,失败返回-1;
示例程序1
#include<cstring>
#include <cstdio>
#include<ctime>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<cerrno>
//我的示例程序的头文件一般都有多余的,按照需求加就行
int main(int argc,char **argv){
if(argc<3){
printf("my_mv<old file><new file>\n");
exit(0);
}
if(rename(argv[1],argv[2])<0){
perror("rename");
exit(1);
}
return 0;
}
这里我们新建两个文件,
并且在1里输入1234,2里面输入4321;
然后执行
原来的1自然是没了
原来的2也被删除了,现在的2是1的内容,符合上面描述的。
unlink函数
文件的删除可以使用unlink系统调用,目录文件的删除则需要使用rmdir系统调用,而一个通用的既能删除文件又能删除目录的系统调用是remove。remove实际上在内部封装了unlink和rmdir:当需要删除的是文件就调用unlink,当需要删除的是目录时,就调用rmdir。
#include <unistd.h>
int unlink(const char *pathname);
int remove(const char *pathname);
这里就介绍unlink。
unlink系统调用从文件系统中删除一个文件,如果文件的链接数位0且没有进程打开这个文件,则文件被删除且其占用的磁盘空间被释放。如果文件的链接数虽然为0,但是有进程打开了这个文件,则文件暂不删除,知道所有打开该文件的进程结束时文件才被删除,利用这一点可以确保即使程序崩溃时,它锁创建的临时文件也不会遗留下来。
参数pathname若指向一个符号链接,则该链接被删除。若参数 pathname指向一个socket(套接字文件)、FIFO(命名管道)或设备文件时,该名字被删除,但已经打开这些文件的进程仍然可以使用这些特殊文件。
成功返回0,失败返回-1.
示例程序2
include<iostream>
#include<cstring>
#include <cstdio>
#include<ctime>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<cerrno>
using namespace std;
//自定义错误处理函数
void my_err(const char *err_string,int line){
fprintf(stderr,"line:%d ",line);
perror(err_string);
exit(1);
}
int main(){
int fd;
char buf[32];
if((fd=open("temp",O_RDWR|O_CREAT|O_TRUNC,S_IRWXU))<0)
my_err("open",__LINE__);
if(unlink("temp")<0)
my_err("unlink",__LINE__);
printf("file unlinked\n");
if(write(fd,"temp",5)<0)
my_err("write",__LINE__);
if((lseek(fd,0,SEEK_SET))==-1)
my_err("lseek",__LINE__);
if(read(fd,buf,5)<0)
my_err("read",__LINE__);
printf("%s\n",buf);
return 0;
}
运行结果:
因为该程序打开了temp文件,所以即使已经调用unlink,还是等读写完成之后才把unlink删除。
这样的好处是程序如果在unlink之后崩溃,在程序结束时,temp也不会留下来