美文网首页
linux上文件移动的坑:rename函数

linux上文件移动的坑:rename函数

作者: AAA未知 | 来源:发表于2018-02-28 01:06 被阅读0次

1、问题背景

开发了一个文件迁移功能,将文件从机械盘迁移到固盘,提升文件读取速度。运维测试说没有效果,我花了近3个小时才定位到原因,在linux上c编程使用的rename函数,不能跨文件分区移动文件。

2、定位过程

1)让运维重复他的测试过程。看到旧的文件没有被移动,初步判断为文件移动失败。

2)查看代码。在文件移动失败时打印系统日志(rename函数调用返回非0),在系统日志找到了对应的重命名失败记录,但是没有记录下错误代码(errno)。

PS:发现没有记录errno,心里那个恨啊,差点就想再发个测试版本上去测试。笔记重点:记录错误日志给出errno,可以方便判断出错误类型。

3)难道谁改了我的代码,于是在自己的测试机上再测试了一下,一切正常呀。初步怀疑是跨磁盘移动出了问题,因为我的测试机没有ssd盘。

4)在线上机器测试,发现只要跨磁盘移动就会失败。确定为rename跨磁盘移动文件失败。

3、弄清原因

rename不支持跨文件系统移动,详解介绍(rename(2) - Linux manual page)。参考别人帖子,直接在百度使用关键字linux c rename 跨磁盘,搜索出了一篇一样的问题帖子(http://blog.51cto.com/sugarlovecxq/1681973),他的解决方案是不让文件跨磁盘。没有修改代码来解决需要跨磁盘的情况。

4、解决方案

方案一:直接使用系统调用system("mv ....");

方案二:移动文件时,判断错误代码为EXDEV时,采用copy(读文件再写文件)的方式移动文件。

  可以参考nginx中的实现ngx_ext_rename_file,也可以参考linux中mv命令的实现。

5、小结

1)c语言中rename函数并不能跨文件系统移动(重命名)文件。类似的linux中的rename命令,也是不可以跨磁盘的,在编写shell脚本时需要注意。

2)遇到错误打印日志给出errno,方便排查问题;

3)测试需要使用实际的机器环境;

相关文章

  • linux上文件移动的坑:rename函数

    1、问题背景 开发了一个文件迁移功能,将文件从机械盘迁移到固盘,提升文件读取速度。运维测试说没有效果,我花了近3个...

  • 文件重命名

    linux下的文件重命名 linux下对文件重命名有两种命令: mv ,rename mv很简单,move文件移动...

  • Linux下批量修改文件名

    方法一:Rename函数 Linux下修改文件名有mv和rename。其中mv命令只能对单个文件重命名,这是mv命...

  • (7)mv命令

    mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系...

  • mv命令使用

    mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系...

  • Linux常用命令之mv

    mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系...

  • Linux文件管理

    Linux教程 Linux文件管理 本文介绍如何在Linux上创建文件、删除文件、复制文件、移动文件 使用touc...

  • Linux下批量修改文件名

    Linux下修改文件名有mv和rename。其中mv命令只能对单个文件重命名,这是mv命令和rename命令的在重...

  • Mac 文件批量重命名

    mac linux rename命令行批量修改文件名 1、使用rename命令,发现没有安装 2、使用HomeBr...

  • golang文件操作摘抄

    Truncate文件 得到文件信息 重命名和移动 译者按: rename 和 move 原理一样 删除文件 打开和...

网友评论

      本文标题:linux上文件移动的坑:rename函数

      本文链接:https://www.haomeiwen.com/subject/lybvxftx.html