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

2019-09-22 04:43发布

我使用C ++ stdio.h中的

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

重命名()函数来重命名文件夹,但偶尔失败的文件夹并返回-1重命名。

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

Answer 1:

它应该可以得到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时。



Answer 2:

这样的C API函数通常设置errno ,当他们不能提供更多的信息。 文档通常会告诉你errno值可能设置,也有一个函数调用strerror()将采取errno值,并给你回char *与它的人类可读的错误消息。

您可能需要包括<errno.h>访问。

对于rename()在MFC中,这似乎是它的文档: http://msdn.microsoft.com/en-us/library/zw5t957f(v=vs.100).aspx它说,它设置errnoEACCESENOENTEINVAL各种条件下,因此核查一下弄清楚是怎么回事,参照了具体的文档。



Answer 3:

重命名将设置_errno与最后一个错误号全局变量,检查。



Answer 4:

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


Answer 5:

如果你是在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) 


Answer 6:

如果文件是打开的,请关闭它之前更改名称。 下面的代码将无法正常工作和文件名不能更改。

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


文章来源: rename() returns -1. How to know why rename fails?