我正在使用 c++ stdio.h
int rename ( const char * oldname, const char * newname );
rename() 函数重命名文件夹,但有时它无法重命名文件夹并返回 -1。
有没有办法知道为什么 rename() 失败?
通过任何 c++ 函数了解此错误解释的任何方式。
我正在使用 c++ stdio.h
int rename ( const char * oldname, const char * newname );
rename() 函数重命名文件夹,但有时它无法重命名文件夹并返回 -1。
有没有办法知道为什么 rename() 失败?
通过任何 c++ 函数了解此错误解释的任何方式。
应该可以从 errno.h 中得到具体的错误
#include <errno.h>
#include <string.h>
...
if(rename("old","new") == -1)
{
std::cout << "Error: " << strerror(errno) << std::endl;
}
的errno
错误代码rename
是特定于操作系统的:
_errno
而不是errno
)像这样的 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
下各种情况,因此请检查这些情况以了解发生了什么,并参考文档以了解具体情况。
编辑:由于提问者的其他问题是否来自 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.
如果您在 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();