2012-09-06 198 views
6

我使用C++ stdio.h中的rename()返回-1。如何知道重命名失敗的原因?

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

rename()函數重命名文件夾,但偶爾失敗到該文件夾​​並返回-1重新命名。

有什麼辦法知道爲什麼rename()失敗?
任何方式通過任何C++函數來知道這個錯誤的解釋。

+6

檢查'errno'變量。使用例如['strerror'](http://msdn.microsoft.com/en-us/library/zc53h9bh%28v=vs.80%29.aspx)獲取可打印的字符串。 –

回答

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時通常可以獲得的內容。

2

rename將設置_errno全局變量與最後一個錯誤號,檢查。

+2

請注意,下劃線是一些奇怪的微軟主義。在標準的C++中,它被稱爲'errno'。 –

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. 
3

這樣的C API函數通常設置errno他們失敗時,提供更多的信息。這些文檔通常會告訴你它可能設置的值爲errno,還有一個叫做strerror()的函數,它將取errno的值,並返回一個char *,其中包含人類可讀的錯誤消息。

您可能需要包含<errno.h>才能訪問它。

關於在MFC rename(),這似乎是它的文檔:它說,它集http://msdn.microsoft.com/en-us/library/zw5t957f(v=vs.100).aspxerrnoEACCESENOENT或各種條件下EINVAL,使覈查一下弄清楚是怎麼回事,參考到具體的文檔。

-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(); 
+1

爲什麼回答一個2歲的問題,他已經有了一個可接受的答案,而你的答案與原始問題完全無關。 –

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)