7

我正在使用 c++ stdio.h

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

rename() 函数重命名文件夹,但有时它无法重命名文件夹并返回 -1。

有没有办法知道为什么 rename() 失败?
通过任何 c++ 函数了解此错误解释的任何方式。

4

6 回答 6

11

应该可以从 errno.h 中得到具体的错误

#include <errno.h>
#include <string.h>
...
if(rename("old","new") == -1)
{
    std::cout << "Error: " << strerror(errno) << std::endl;
}

errno错误代码rename是特定于操作系统的:

于 2012-09-06T11:59:42.100 回答
3

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

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

关于rename()在 MFC 中,这似乎是它的文档:http: //msdn.microsoft.com/en-us/library/zw5t957f (v=vs.100).aspx说它设置errnoEACCESENOENTEINVAL下各种情况,因此请检查这些情况以了解发生了什么,并参考文档以了解具体情况。

于 2012-09-06T11:59:11.490 回答
2

编辑:由于提问者的其他问题是否来自 Windows 背景,我将重点放在 Windows 编程环境上。其他操作系统可能有所不同。例如 GCC/Linux 提供errno而不是_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.
于 2012-09-06T11:57:34.263 回答
1

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

于 2012-09-06T11:57:01.993 回答
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) 
于 2016-07-07T22:21:30.770 回答
-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();
于 2015-01-29T05:01:34.950 回答