2012-09-06 2 views
6

私は、フォルダの名前を変更するために、C++ stdio.hののrename()は-1を返します。名前の変更が失敗する理由を知るには?

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

名前の変更()関数を使用していますが、時折、それはフォルダとリターンを-1名前の変更に失敗しました。

rename()が失敗する理由を知る方法はありますか?
このエラーの説明をC++関数を介して知る方法はありません。

+6

'errno'変数を確認してください。例えば['strerror'](http://msdn.microsoft.com/en-us/library/zc53h9bh%28v=vs.80%29.aspx)をクリックして、印刷可能な文字列を取得します。 –

答えて

9

返されるエラーは、おそらくOS固有のもの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

アンダースコアはMicrosoftの奇妙なものです。標準の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).aspxそれは様々な条件の下でerrnoEACCESに、ENOENTまたは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) 
関連する問題