2017-01-29 18 views
4

Я занимаюсь программированием на языке программирования C и экспериментировал с функцией 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; 
} 

Этот код изменяет имя файла с именем, «данные» в файл с именем, «база данных». Мне было интересно, что произойдет, если вы попытаетесь запустить этот код, но уже имели файл с именем «база данных» в том же каталоге.

Это содержимое каталога, которые я перед запуском rename() функции:

enter image description here

И это содержимое каталога, у меня после запуска rename() функции:

enter image description here

Похоже, что функция rename() правильно переименовала мой файл, но также удалил файл, который уже был в этом каталоге с тем же именем. Мне было интересно, как именно так работает функция rename(), или если это то, что делает моя операционная система (Windows 10 - cygwin64 - gcc-компилятор). Кроме того, при использовании этой функции я должен сначала проверить, нет ли файлов, которые уже имеют одно и то же имя, чтобы предотвратить их удаление? Спасибо за помощь и понимание.

ответ

7

Вам необходимо ознакомиться с документацией вашей библиотеки C. В соответствии со стандартом (N1570 7.21.4.2, курсив мой):

rename функция вызывает файл, имя которого является строка, на которую указывает old быть отныне известный под именем, заданным в строке, адресуемой new. Файл с именем old больше не доступен под этим именем.Если перед вызовом функции переименования существует файл с именем, указанным в строке new , поведение определено по умолчанию.

В случае НКУ rename:

Если Старое_имя не является каталогом, то любой существующий файл с именем новое_имя удаляется во время операции переименования. Однако, если newname - это имя каталога, в этом случае переименование не выполняется.

В случае В.С., however:

Новое имя не должно быть имя существующего файла или каталога.

+1

Интересно, спасибо. Я должен буду помнить, что многие функции определяются реализацией, и ожидание одинаковых результатов в разных системах может быть не очень хорошей идеей. –

3

От cppreference.com:

Если new_filename существует, то поведение определяется реализацией.


Э.Г. на Unix поведение, кажется, это (от man rename):

int 
rename(const char *old, const char *new); 

[...] Если new существует, то он сначала удаляется.

0

От rename doc:

Если Старое_имя не является каталогом, то любой существующий файл с именем новое_имя является удалены во время операции переименования. Однако, если newname - это имя каталога, в этом случае переименование не выполняется.

+0

Я не думаю, что кто-то использует glibc на Windows 10. – melpomene

+0

Вы правы, извините – Ollaw