rename() возвращает -1. Как узнать, почему переименование не удается?

Я использую c++ stdio.Н

int rename ( const char * oldname, const char * newname );
rename () для переименования папки, но иногда она не может переименовать папку и возвращает -1.

есть ли способ узнать, почему rename () не работает?
любой способ узнать это объяснение ошибки с помощью любой функции c++.

6 ответов


должно быть возможно получить конкретную ошибку от errno.h

#include <errno.h>
#include <string.h>
...
if(rename("old","new") == -1)
{
    std::cout << "Error: " << strerror(errno) << std::endl;
}

возвращаемые ошибки, вероятно, специфичны для ОС. http://linux.die.net/man/3/rename показывает, что вы обычно можете получить при использовании linux.


C API функции, как это обычно set errno когда они не в состоянии дать больше информации. Документация обычно расскажет вам о errno ценности, которые он может установить, и есть также функция под названием strerror(), которая состоится errno значение и вернуть вам char * С читаемым человеком сообщением об ошибке в нем.

вам может потребоваться включить <errno.h> для доступа к этому.

в отношении rename() в MFC, это, казалось бы, документация для него: http://msdn.microsoft.com/en-us/library/zw5t957f(в=против 100).аспн что говорит он устанавливает errno до EACCES, ENOENT или EINVAL при различных условиях, поэтому проверьте против тех, чтобы выяснить, что происходит, со ссылкой на документацию для специфики.


переименовать будет установить _errno глобальная переменная с последним номером ошибки, проверить.


проверяем значение _errno. Это может быть одно из следующих:

EACCES: File or directory specified by newname already exists or could not be created (invalid path); or oldname is a directory and newname specifies a different path.
ENOENT: File or path specified by oldname not found.
EINVAL: Name contains invalid characters.

Если вы находитесь в Linux, вы можете просто отобразить строковое представление ошибки сразу после фатального вызова для переименования в gdb:

211             if (rename(f_z_name, y) == -1) {
(gdb) n
212                 err = RM_ERR_RENAME_TMP_Y;
(gdb) p errno
 = 18
(gdb) p strerr(errno)
No symbol "strerr" in current context.
(gdb) p strerror(errno)
 = 0x7ffff7977aa2 "Invalid cross-device link"
(gdb) 

если файл открыт, закройте его перед изменением имени. Приведенный ниже код не будет работать и имя файла не может быть изменено.

ofstream _file("C:\yourfile.txt", ofstream::app); 

if (-1 == rename("C:\yourfile.txt", "C:\yourfile2.txt"))
     puts("The file doesn't exist or already deleted");

_file.close();