私は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
は OS 固有です。
_errno
の代わりに使用errno
)このような 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
編集:Windowsのバックグラウンドからの質問者の他の質問以来、私はWindowsプログラミング環境に焦点を当てています。他のOSは異なる場合があります。たとえば、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();