《Linux C编程实战》笔记:文件的移动和删除

本节只有两个函数。

rename函数

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

rename会将参数oldpath所指定的文件名称改为参数newpath所指定的文件名称,若newpath所指定的文件已存在,则原文件会被删除;

成功返回0,失败返回-1;

示例程序1

#include
#include 
#include
#include
#include
#include
#include
#include
//我的示例程序的头文件一般都有多余的,按照需求加就行
int main(int argc,char **argv){
    if(argc<3){
        printf("my_mv\n");
        exit(0);
    }
    if(rename(argv[1],argv[2])<0){
        perror("rename");
        exit(1);
    }
    return 0;
}

  这里我们新建两个文件,

并且在1里输入1234,2里面输入4321;

然后执行

《Linux C编程实战》笔记:文件的移动和删除_第1张图片

原来的1自然是没了

原来的2也被删除了,现在的2是1的内容,符合上面描述的。

unlink函数

文件的删除可以使用unlink系统调用,目录文件的删除则需要使用rmdir系统调用,而一个通用的既能删除文件又能删除目录的系统调用是remove。remove实际上在内部封装了unlink和rmdir:当需要删除的是文件就调用unlink,当需要删除的是目录时,就调用rmdir。

#include 
int unlink(const char *pathname);
int remove(const char *pathname);

这里就介绍unlink。

unlink系统调用从文件系统中删除一个文件,如果文件的链接数位0且没有进程打开这个文件,则文件被删除且其占用的磁盘空间被释放。如果文件的链接数虽然为0,但是有进程打开了这个文件,则文件暂不删除,知道所有打开该文件的进程结束时文件才被删除,利用这一点可以确保即使程序崩溃时,它锁创建的临时文件也不会遗留下来。

参数pathname若指向一个符号链接,则该链接被删除。若参数 pathname指向一个socket(套接字文件)、FIFO(命名管道)或设备文件时,该名字被删除,但已经打开这些文件的进程仍然可以使用这些特殊文件。

成功返回0,失败返回-1.

示例程序2

include
#include
#include 
#include
#include
#include
#include
#include
#include
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也不会留下来

你可能感兴趣的:(c语言,笔记,linux)