我正在使用c ++ stdio.h的
int rename ( const char * oldname, const char * newname );
rename()函数重命名文件夹但偶尔无法重命名该文件夹并返回-1。
有没有办法知道为什么重命名()失败?
任何通过任何c ++函数知道这个错误解释的方法。
答案 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)
errno
。该文档通常会告诉您可能设置的errno
值,并且还有一个名为strerror()
的函数,它将获取errno
值并返回char *
其中包含人类可读的错误消息。
您可能需要包含<errno.h>
才能访问该内容。
关于MFC中的rename()
,这似乎是它的文档:http://msdn.microsoft.com/en-us/library/zw5t957f(v=vs.100).aspx表示它将errno
设置为EACCES
,ENOENT
或EINVAL
在各种条件下,请参考具体文件,检查那些发生了什么的人。
答案 2 :(得分:2)
答案 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();