我使用C++ stdio.h中的rename()返回-1。如何知道重命名失敗的原因?
int rename (const char * oldname, const char * newname);
rename()函數重命名文件夾,但偶爾失敗到該文件夾並返回-1重新命名。
有什麼辦法知道爲什麼rename()失敗?
任何方式通過任何C++函數來知道這個錯誤的解釋。
我使用C++ stdio.h中的rename()返回-1。如何知道重命名失敗的原因?
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;
}
得到具體的錯誤返回的錯誤可能是操作系統相關的。 http://linux.die.net/man/3/rename顯示了使用linux時通常可以獲得的內容。
檢查值_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.
這樣的C API函數通常設置errno
他們失敗時,提供更多的信息。這些文檔通常會告訴你它可能設置的值爲errno
,還有一個叫做strerror()
的函數,它將取errno
的值,並返回一個char *
,其中包含人類可讀的錯誤消息。
您可能需要包含<errno.h>
才能訪問它。
關於在MFC rename()
,這似乎是它的文檔:它說,它集http://msdn.microsoft.com/en-us/library/zw5t957f(v=vs.100).aspxerrno
到EACCES
,ENOENT
或各種條件下EINVAL
,使覈查一下弄清楚是怎麼回事,參考到具體的文檔。
如果文件處於打開狀態,請在更改名稱前關閉它。下面的代碼將不起作用,文件名不能更改。
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();
爲什麼回答一個2歲的問題,他已經有了一個可接受的答案,而你的答案與原始問題完全無關。 –
如果你是在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)
檢查'errno'變量。使用例如['strerror'](http://msdn.microsoft.com/en-us/library/zc53h9bh%28v=vs.80%29.aspx)獲取可打印的字符串。 –