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

news2024/11/26 10:17:06

本节只有两个函数。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1317971.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mac安装软件显示文件已损坏处理方法

今天安装软件&#xff0c;突然遇到了文件已损坏&#xff0c;扔到废纸篓的情况&#xff0c;于是搜索了下解决办法&#xff0c;跟大家分享下&#xff0c;希望对你有所帮助 一、检查安全性设置 打开【设置】-【隐私与安全】&#xff0c;下拉找到安全性&#xff0c;将安全性更改为…

深度学习记录--参数与超参数

什么是超参数 在深度学习的神经网络图中&#xff0c;有一堆参数&#xff0c;这些参数分成了普通参数和特殊参数&#xff0c;其中特殊参数往往被称为超参数 超参数(hyper parameters),在某种程度上决定了普通的参数&#xff0c;并且是需要额外给出的 如下图 参数设定 对于超…

半导体设备之外延炉简述

半导体设备对整个半导体行业起着重要的支撑作用。因半导体制造工艺复杂&#xff0c;各个环节需要的设备也不同&#xff0c;从流程工序分类来看&#xff0c;半导体设备主要可分为晶圆制造设备&#xff08;前道工序&#xff09;、封装测试设备&#xff08;后道工序&#xff09;等…

【TB作品】51单片机读取重量和液位,OLED显示

代码打开下载&#xff1a; http://dt4.8tupian.net/2/28880a64b6666.pg3这段代码是为微控制器编写的&#xff0c;可能是基于8051架构&#xff0c;使用Keil C51编译器。该代码结合了OLED显示器、超声波距离传感器和基于HX711的称重传感器的功能。以下是主要组件及其功能的详细说…

常见Appium相关问题及解决方案

问题1&#xff1a;adb检测不到设备 解决&#xff1a; 1.检查手机驱动是否安装&#xff08;win10系统不需要&#xff09;&#xff0c;去官网下载手机驱动或者电脑下载手机助手来辅助安装手机驱动&#xff0c;安装完成后卸载手机助手&#xff08;防止接入手机时抢adb端口造成干…

【Linux】查看目录和更改目录

概览 常见一些目录命令如下&#xff1a; pwd&#xff1a;print working directory的缩写&#xff0c;打印出当前工作目录名 。ls&#xff1a;list的缩写&#xff0c;列出目录内容。file&#xff1a;确定文件类型。less&#xff1a;浏览文件内容。cd&#xff1a;change direct…

低代码发展现状调研和思考

低代码开发是近年来迅速崛起的软件开发方法&#xff0c;让编写应用程序变得更快、更简单。有人说它是美味的膳食&#xff0c;让开发过程高效而满足&#xff0c;但也有人质疑它是垃圾食品&#xff0c;缺乏定制性与深度。你认为低代码到底是美味的膳食还是垃圾食品呢&#xff0c;…

PMP项目管理 - 风险管理

系列文章目录 PMP项目管理 - 质量管理 PMP项目管理 - 采购管理 PMP项目管理 - 资源管理 PMP项目管理 - 风险管理 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in…

easy贪吃蛇

之前承诺给出一个贪吃蛇项目。 1.EasyX库认知 有关EasyX库的相关信息&#xff0c;您可以看一下官方的文档&#xff1a;EasyX官方文档。 这里我做几点总结&#xff1a; EasyX库就和名字一样&#xff0c;可以让用户调用一些简单的函数来绘制图像和几何图形利用EasyX库可以制作…

云渲染技术下的虚拟现实:技术探索与革新思考

虚拟现实&#xff08;含增强现实、混合现实&#xff09;是新一代信息技术的重要前沿方向&#xff0c;是数字经济的重大前瞻领域&#xff0c;将深刻改变人类的生产生活方式&#xff0c;产业发展战略窗口期已然形成。但是虚拟现实想要深入改变影响我们的生活&#xff0c;以下技术…

Linux_Docker图形化工具Portainer如何安装并结合内网穿透实现远程访问

文章目录 前言1. 部署Portainer2. 本地访问Portainer3. Linux 安装cpolar4. 配置Portainer 公网访问地址5. 公网远程访问Portainer6. 固定Portainer公网地址 前言 本文主要介绍如何本地安装Portainer并结合内网穿透工具实现任意浏览器远程访问管理界面。Portainer 是一个轻量级…

日志审计、数据库审计以及代码审计三者的区别与重要性

在当今的数字化时代&#xff0c;企业的信息安全和数据保护至关重要。为了确保这些安全&#xff0c;企业需要采取一系列的安全措施&#xff0c;其中包括日志审计、数据库审计和代码审计。尽管这三者都是为了增强企业的安全性&#xff0c;但它们各自的目标和重点却有所不同。 一、…

电子电器架构( E/E) 演化 —— 高速 大算力

电子电器架构( E/E) 演化 —— 高速 & 大算力 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要…

用23种设计模式打造一个cocos creator的游戏框架----(十九)备忘录模式

1、模式标准 模式名称&#xff1a;备忘录模式 模式分类&#xff1a;行为型 模式意图&#xff1a;在不破坏封装性的前提下捕获一个对象的内部状态&#xff0c;并在对象之外保存这个状态。这样以后就可以将对象恢复到原先保存的状态 结构图&#xff1a; 适用于&#xff1a; …

LCR 148. 验证图书取出顺序

解题思路&#xff1a; class Solution {public boolean validateBookSequences(int[] putIn, int[] takeOut) {Stack<Integer> stack new Stack<>();int i 0;for(int num : putIn) {stack.push(num); // num 入栈while(!stack.isEmpty() && stack.peek()…

Tekton 基于 cronjob 触发流水线

Tekton 基于 cronjob 触发流水线 Tekton EventListener 在8080端口监听事件&#xff0c;kubernetes 原生 cronjob 定时通过curl 命令向 EventListener 发送事件请求&#xff0c;触发tekton流水线执行&#xff0c;实现定时运行tekton pipeline任务。 前置要求&#xff1a; kub…

Linux系统编程(五):系统信息与资源

参考引用 UNIX 环境高级编程 (第3版)嵌入式Linux C应用编程-正点原子 1. 系统信息 1.1 系统标识 uname 系统调用 uname() 用于获取有关当前操作系统内核的名称和信息 #include <sys/utsname.h>// buf&#xff1a;struct utsname 结构体类型指针&#xff0c;指向一个 str…

【2023海光杯】“智能储物柜系统”电控部分

简单说明 在代码实现部分会给出设计理念和分析&#xff0c;整体资源可以直接下载压缩包&#xff08;手机端依然看不到&#xff0c;还是不知道为什么&#xff09;。 使用设备 按照题目要求需要制作16个储物格&#xff0c;对应16扇门。16扇门的开关可以用矩阵键盘来控制。 在不考…

【精选】计算机网络教程(第3章数据链路层)

目录 前言 第3章数据链路层 1、差错检测&#xff08;CRC&#xff09; 2、点对点协议&#xff08;了解应用场景&#xff09; 3、什么是碰撞域&#xff0c;什么是广播域 碰撞域&#xff08;Collision Domain&#xff09;&#xff1a; 广播域&#xff08;Broadcast Domain&a…

linux修改mysql默认端口(很明智的选择因为后面会遇到各种问题)

1. 登录到mysql查看当前的端口号&#xff1a; show global variables like ‘port’; 2.编辑/etc/my.conf 文件添加port3506 这样的样式 保存退出&#xff1b; 内容: mysqld] port3506 datadir/var/lib/mysql socket/var/lib/mysql/mysql.sock usermysql # Disabling sy…