我使用C ++ stdio.h中的
int rename ( const char * oldname, const char * newname );
重命名()函数来重命名文件夹,但偶尔失败的文件夹并返回-1重命名。
有没有办法知道为什么重命名()失败?
没有办法知道通过任何C ++函数这个错误的解释。
我使用C ++ stdio.h中的
int rename ( const char * oldname, const char * newname );
重命名()函数来重命名文件夹,但偶尔失败的文件夹并返回-1重命名。
有没有办法知道为什么重命名()失败?
没有办法知道通过任何C ++函数这个错误的解释。
它应该可以得到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函数通常设置errno
,当他们不能提供更多的信息。 文档通常会告诉你errno
值可能设置,也有一个函数调用strerror()
将采取errno
值,并给你回char *
与它的人类可读的错误消息。
您可能需要包括<errno.h>
访问。
对于rename()
在MFC中,这似乎是它的文档: http://msdn.microsoft.com/en-us/library/zw5t957f(v=vs.100).aspx它说,它设置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
$6 = 18
(gdb) p strerr(errno)
No symbol "strerr" in current context.
(gdb) p strerror(errno)
$7 = 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();