7

私はc++ stdio.hを使用しています

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

rename() 関数を使用してフォルダーの名前を変更しますが、フォルダーの名前を変更できず、-1 を返すことがあります。

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

4

6 に答える 6

11

errno.h から具体的なエラーを取得できるはずです。

#include <errno.h>
#include <string.h>
...
if(rename("old","new") == -1)
{
    std::cout << "Error: " << strerror(errno) << std::endl;
}

errnoエラー コードrenameは OS 固有です。

于 2012-09-06T11:59:42.100 に答える
3

このような C API 関数は通常errno、詳細な情報を提供できない場合に設定されます。ドキュメンテーションは通常、設定される可能性のある値について説明します。また、値を取り、人間が判読できるエラー メッセージを返すerrno関数も呼び出されます。strerror()errnochar *

それにアクセスするには、含める必要がある場合があり<errno.h>ます。

MFCに関してrename()は、これはそのドキュメントのようです: http://msdn.microsoft.com/en-us/library/zw5t957f(v=vs.100).aspxこれは、または以下に設定errnoされていると言いますさまざまな条件があるため、詳細についてはドキュメントを参照して、何が起こっているのかを確認してください。EACCESENOENTEINVAL

于 2012-09-06T11:59:11.490 に答える
2

編集: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.
于 2012-09-06T11:57:34.263 に答える
1

rename_errnoグローバル変数に最後のエラー番号を設定します。それを確認してください。

于 2012-09-06T11:57:01.993 に答える
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) 
于 2016-07-07T22:21:30.770 に答える
-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();
于 2015-01-29T05:01:34.950 に答える