c rename()函数是否会删除文件?

时间:2017-01-29 21:21:09

标签: c rename file-rename

我正在用C编程语言练习编程,并正在尝试使用rename()函数。我使用以下代码:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    if(rename ("data", "database") )
    {
        fprintf(stderr, "Can't rename file\n");
        exit(EXIT_FAILURE);
    }
    return 0;
}

此代码将名为“data”的文件名更改为名为“database”的文件。我想知道如果您尝试运行此代码会发生什么,但在同一目录中已经有一个名为“database”的文件。

这是我在运行rename()函数之前所拥有的目录的内容:

enter image description here

这是运行rename()函数后我所拥有的目录的内容:

enter image description here

rename()函数似乎正确地重命名了我的文件,但它也删除了此目录中已具有相同名称的文件。我想知道这是rename()函数是如何工作的,或者这是我的操作系统(Windows 10-cygwin64-gcc编译器)正在做的事情。此外,在使用此功能时,我应该首先检查以确保没有已经具有相同名称的文件以防止它们被删除吗?感谢您的帮助和见解。

3 个答案:

答案 0 :(得分:7)

您必须查阅C库的文档。根据标准(N1570 7.21.4.2,强调我的):

  

rename函数会导致名称为old指向的字符串的文件   从此以new指向的字符串给出的名称来表示。该文件名为   该名称无法再访问old。如果由new指向的字符串命名的文件   在调用重命名函数之前存在,行为是实现定义的

对于gcc rename

  

如果 oldname 不是目录,则在重命名操作期间将删除名为 newname 的任何现有文件。但是,如果 newname 是目录的名称,则在这种情况下重命名失败。

如果是VS,however

  

新名称不得是现有文件或目录的名称。

答案 1 :(得分:3)

来自cppreference.com

  

如果存在SIGINT,则行为是实现定义的。

E.g。在Unix上,行为似乎是这样的(来自new_filename):

man rename
     

[...]   如果存在int rename(const char *old, const char *new); ,则会先将其删除。

答案 2 :(得分:0)

来自rename doc

  

如果oldname不是目录,则任何名为newname的现有文件都是   在重命名操作期间删除。但是,如果newname是名称   在这种情况下,目录重命名失败。