私は、フォルダの名前を変更するために、C++ stdio.hののrename()は-1を返します。名前の変更が失敗する理由を知るには?
int rename (const char * oldname, const char * newname);
名前の変更()関数を使用していますが、時折、それはフォルダとリターンを-1名前の変更に失敗しました。
rename()が失敗する理由を知る方法はありますか?
このエラーの説明をC++関数を介して知る方法はありません。
私は、フォルダの名前を変更するために、C++ stdio.hののrename()は-1を返します。名前の変更が失敗する理由を知るには?
int rename (const char * oldname, const char * newname);
名前の変更()関数を使用していますが、時折、それはフォルダとリターンを-1名前の変更に失敗しました。
rename()が失敗する理由を知る方法はありますか?
このエラーの説明をC++関数を介して知る方法はありません。
返されるエラーは、おそらく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を使用しているときに通常得られるものを示しています。
_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).aspxそれは様々な条件の下でerrno
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)をクリックして、印刷可能な文字列を取得します。 –