rename()返回-1。如何知道为什么重命名失败?

时间:2012-09-06 11:52:02

标签: c++ rename file-rename

我正在使用c ++ stdio.h的

int rename ( const char * oldname, const char * newname );

rename()函数重命名文件夹但偶尔无法重命名该文件夹并返回-1。

有没有办法知道为什么重命名()失败?
任何通过任何c ++函数知道这个错误解释的方法。

6 个答案:

答案 0 :(得分:9)

应该可以从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时通常可以获得的内容。

答案 1 :(得分:3)

像这样的C API函数通常在它们无法提供更多信息时设置errno。该文档通常会告诉您可能设置的errno值,并且还有一个名为strerror()的函数,它将获取errno值并返回char *其中包含人类可读的错误消息。

您可能需要包含<errno.h>才能访问该内容。

关于MFC中的rename(),这似乎是它的文档:http://msdn.microsoft.com/en-us/library/zw5t957f(v=vs.100).aspx表示它将errno设置为EACCESENOENTEINVAL在各种条件下,请参考具体文件,检查那些发生了什么的人。

答案 2 :(得分:2)

rename会将_errno全局变量设置为最后一个错误编号,请检查。

答案 3 :(得分:2)

检查_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.

答案 4 :(得分:0)

如果你在Linux上,你可以在gdb中重命名致命的调用之后显示错误的字符串表示:

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

答案 5 :(得分:-2)

如果文件已打开,请在更改名称前将其关闭。以下代码无效,无法更改文件名。

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