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();