我正在用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()
函数之前所拥有的目录的内容:
这是运行rename()
函数后我所拥有的目录的内容:
rename()
函数似乎正确地重命名了我的文件,但它也删除了此目录中已具有相同名称的文件。我想知道这是rename()
函数是如何工作的,或者这是我的操作系统(Windows 10-cygwin64-gcc编译器)正在做的事情。此外,在使用此功能时,我应该首先检查以确保没有已经具有相同名称的文件以防止它们被删除吗?感谢您的帮助和见解。
答案 0 :(得分:7)
您必须查阅C库的文档。根据标准(N1570 7.21.4.2
,强调我的):
rename
函数会导致名称为old
指向的字符串的文件 从此以new
指向的字符串给出的名称来表示。该文件名为 该名称无法再访问old
。如果由new
指向的字符串命名的文件 在调用重命名函数之前存在,行为是实现定义的。
对于gcc rename
:
如果 oldname 不是目录,则在重命名操作期间将删除名为 newname 的任何现有文件。但是,如果 newname 是目录的名称,则在这种情况下重命名失败。
如果是VS,however:
新名称不得是现有文件或目录的名称。
答案 1 :(得分:3)
如果存在
SIGINT
,则行为是实现定义的。
E.g。在Unix上,行为似乎是这样的(来自new_filename
):
man rename
[...] 如果存在
int rename(const char *old, const char *new);
,则会先将其删除。
答案 2 :(得分:0)
来自rename doc:
如果oldname不是目录,则任何名为newname的现有文件都是 在重命名操作期间删除。但是,如果newname是名称 在这种情况下,目录重命名失败。