详解C语言中的rename()函数和remove()函数的使用方法

C语言rename()函数:重命名文件或目录
头文件:

#include <stdio.h>

函数rename()用于重命名文件、改变文件路径或更改目录名称,其原型为

 int rename(char * oldname, char * newname);

【参数】oldname为旧文件名,newname为新文件名。

【返回值】修改文件名成功则返回0,否则返回-1。

重命名文件:

  • 如果newname指定的文件存在,则会被删除。
  • 如果newname与oldname不在一个目录下,则相当于移动文件。

重命名目录:

  • 如果oldname和oldname都为目录,则重命名目录。
  • 如果newname指定的目录存在且为空目录,则先将newname删除。
  • 对于newname和oldname两个目录,调用进程必须有写权限。
  • 重命名目录时,newname不能包含oldname作为其路径前缀。例如,不能将/usr更名为/usr/foo/testdir,因为老名字( /usr/foo)是新名字的路径前缀,因而不能将其删除。

【实例】一个简单的修改文件名的程序。

#include<stdio.h>
#include <fcntl.h>
int main(void)
{
  char oldname[100], newname[100];
  /* prompt for file to rename and new name */
  printf("请告诉我一个文件的完整路径: ");
  gets(oldname);
  printf("您想修改为: ");
  gets(newname);
  /* 更改文件名 */
  if (rename(oldname, newname) == 0)
    printf("已经把文件 %s 修改为 %s.\n", oldname, newname);
  else
    perror("rename");
  return 0;
}

运行结果:

请告诉我一个文件的完整路径:test.ncb
您想修改为:test111.ncb
已经把文件test. ncb修改为test111. ncb

例子首先定义两个数组存储用户指定的文件名, 接着使用函数gets()接收用户输入的文件名,再使用函数rename()修改,如果成功则返回值为0,提示修改成功。

注意:实际开发中尽量避免使用gets()函数,gets()会影响程序的安全性和健壮性,请查看:C语言gets()函数:从流中读取字符串

又如,设计一个在DOS命令行下修改文件的程序。
复制纯文本新窗口

#include <stdio.h>
void main(int argc, char **argv)
{
  if(argc < 3)
  {
    printf("Usage: %s old_name new_name\n", argv[0]);
    return;
  }
  printf("%s=>%s", argc[1], argv[2]);
  if(rename(argv[1], argv[2]) < 0)
  printf("error!\n");
  else
  printf("ok!\n");
}

C语言remove()函数:删除文件或目录
头文件:

#include <stdio.h>

remove()函数用于删除指定的文件,其原型如下:

  int remove(char * filename);

【参数】filename为要删除的文件名,可以为一目录。如果参数filename 为一文件,则调用unlink()处理;若参数filename 为一目录,则调用rmdir()来处理。

【返回值】成功则返回0,失败则返回-1,错误原因存于errno。

错误代码:
EROFS  欲写入的文件为只读文件。
EFAULT  参数filename 指针超出可存取内存空间。
ENAMETOOLONG  参数filename 太长。
ENOMEM  核心内存不足。
ELOOP  参数filename 有过多符号连接问题。
EIO I/O  存取错误。

【实例】下面的程序演示了如何使用remove()函数删除文件。

#include<stdio.h>
int main(){
  char filename[80];
  printf("The file to delete:");
  gets(filename);
  if( remove(filename) == 0 )
    printf("Removed %s.", filename);
  else
    perror("remove");
}

运行上述程序,首先声明用于保存文件名的字符数组变量,从控制台获取文件名,然后删除该文件,并根据删除结果输出相应的提示信息。

注意:实际开发中尽量避免使用gets()函数,gets()会影响程序的安全性和健壮性

(0)

相关推荐

  • C语言中用于修改文件的存取时间的函数使用

    C语言utime()函数:修改文件的存取时间和更改时间 头文件: #include <sys/types.h> #include <utime.h> 定义函数: int utime(const char * filename, struct utimbuf * buf); 函数说明:utime()用来修改参数filename 文件所属的inode 存取时间.结构utimbuf 定义如下: struct utimbuf { time_t actime; time_t modtime;

  • 详解C语言中symlink()函数和readlink()函数的使用

    C语言symlink()函数:建立文件符号连接 头文件: #include <unistd.h> 定义函数: int symlink(const char * oldpath, const char * newpath); 函数说明:symlink()以参数newpath 指定的名称来建立一个新的连接(符号连接)到参数oldpath 所指定的已存在文件. 参数oldpath 指定的文件不一定要存在, 如果参数newpath 指定的名称为一已存在的文件则不会建立连接. 返回值:成功则返回0, 失

  • 详解C语言中telldir()函数和seekdir()函数的用法

    C语言telldir()函数:取得目录流的读取位置 头文件: #include <dirent.h> 定义函数: off_t telldir(DIR *dir); 函数说明:telldir()返回参数dir 目录流目前的读取位置. 此返回值代表距离目录文件开头的偏移量返回值返回下个读取位置, 有错误发生时返回-1. 错误代码:EBADF 参数dir 为无效的目录流. 范例 #include <sys/types.h> #include <dirent.h> #inclu

  • 详解C语言中的rename()函数和remove()函数的使用方法

    C语言rename()函数:重命名文件或目录 头文件: #include <stdio.h> 函数rename()用于重命名文件.改变文件路径或更改目录名称,其原型为 int rename(char * oldname, char * newname); [参数]oldname为旧文件名,newname为新文件名. [返回值]修改文件名成功则返回0,否则返回-1. 重命名文件: 如果newname指定的文件存在,则会被删除. 如果newname与oldname不在一个目录下,则相当于移动文件.

  • 详解C语言中return返回函数局部变量的问题

    目录 return返回栈区局部变量的指针 return返回栈区局部的临时变量 return只读数据段和static数据 在计算机中,释放空间并不需要将空间中的内容全部置成0或者1,而是只要设置这一块空间的数据无效即可.比如在下载文件时需要花很长时间,但是删除文件却只要几秒钟,这是因为操作系统只是把文件标识(文件头链接)删掉了,文件原文还保留着,我们没了文件标识就找不到这个文件了.所以删除后的文件,还可以用特殊的办法被找回来. 这也就意味着,当函数结束调用的时候,函数中的局部变量实际上还是在的,只

  • 详解C语言中sizeof如何在自定义函数中正常工作

    1.在main函数中,sizeof是可以正常工作的,比如: int main() { int n[5]; printf("input: \n"); int i ; for(i = 0; i < 5; i++) { scanf("%d",n + i); } int len = sizeof(n)/sizeof(n[0]); printf("%d\n",len); return 0; } 2.但是在自定义函数中就不可以了,如下: #includ

  • 详解C语言中return与exit的区别

    详解C语言中return与exit的区别 1,exit用于在程序运行的过程中随时结束程序,exit的参数是返回给OS的.main函数结束时也会隐式地调用exit函数.exit函数运行时首先会执行由atexit()函数登记的函数,然后会做一些自身的清理工作,同时刷新所有输出流.关闭所有打开的流并且关闭通过标准I/O函数tmpfile()创建的临时文件.exit是结束一个进程,它将删除进程使用的内存空间,同时把错误信息返回父进程,而return是返回函数值并退出函数 2,return是语言级别的,它

  • 详解 Go 语言中 Map 类型和 Slice 类型的传递

    Map 类型 先看例子 m1: func main() { m := make(map[int]int) mdMap(m) fmt.Println(m) } func mdMap(m map[int]int) { m[1] = 100 m[2] = 200 } 结果是 map[2:200 1:100] 我们再修改如下 m2: func main() { var m map[int]int mdMap(m) fmt.Println(m) } func mdMap(m map[int]int) {

  • 详解Golang语言中的interface

    interface是一组method签名的组合,interface可以被任意对象实现,一个对象也可以实现多个interface.任意类型都实现了空interface(也就是包含0个method的interface),空interface可以存储任意类型的值.interface定义了一组方法,如果某个对象实现了某个接口的所有方法,则此对象就实现了此接口. go version go1.12 package main import ( "fmt" ) // 定义struct type Hu

  • 详解go语言中type关键词的几种使用

    type是go语法里的重要而且常用的关键字,type绝不只是对应于C/C++中的typedef.搞清楚type的使用,就容易理解go语言中的核心概念struct.interface.函数等的使用.以下我用例子代码总结描述,请特别留意代码中的注释. 1.定义结构体 //结构体定义 type person struct { name string //注意后面不能有逗号 age int } func main() { //结构体初始化 p := person{ name: "taozs",

  • 详解R语言中的PCA分析与可视化

    1. 常用术语 (1)标准化(Scale) 如果不对数据进行scale处理,本身数值大的基因对主成分的贡献会大.如果关注的是变量的相对大小对样品分类的贡献,则应SCALE,以防数值高的变量导入的大方差引入的偏见.但是定标(scale)可能会有一些负面效果,因为定标后变量之间的权重就是变得相同.如果我们的变量中有噪音的话,我们就在无形中把噪音和信息的权重变得相同,但PCA本身无法区分信号和噪音.在这样的情形下,我们就不必做定标. (2)特征值 (eigen value) 特征值与特征向量均为矩阵分

  • 详解C++语言中std::array的神奇用法

    概述 std::array是在C++11标准中增加的STL容器,它的设计目的是提供与原生数组类似的功能与性能.也正因此,使得std::array有很多与其他容器不同的特殊之处,比如:std::array的元素是直接存放在实例内部,而不是在堆上分配空间:std::array的大小必须在编译期确定:std::array的构造函数.析构函数和赋值操作符都是编译器隐式声明的--这让很多用惯了std::vector这类容器的程序员不习惯,觉得std::array不好用.但实际上,std::array的威力

  • 详解go语言中sort如何排序

    目录 sort包源码解读 前言 如何使用 基本数据类型切片的排序 自定义Less排序比较器 自定义数据结构的排序 分析下源码 不稳定排序 稳定排序 查找 Interface 总结 参考 sort 包源码解读 前言 我们的代码业务中很多地方需要我们自己进行排序操作,go 标准库中是提供了 sort 包是实现排序功能的,这里来看下生产级别的排序功能是如何实现的. go version go1.16.13 darwin/amd64 如何使用 先来看下 sort 提供的主要功能 对基本数据类型切片的排序

随机推荐