1

MAX_PATH (260) を超えるまで一連のフォルダーをループで作成するテストがあります。これは ERROR_PATH_NOT_FOUND(0x3) を返します。このテストを実行するビルド マシンがありますが、ビルド マシンでは ERROR_FILENAME_EXCED_RANGE (0xce) が返されます。

私のマシンは Windows 7 ですが、ビルド マシンは Vista です。それが、異なる値を返す理由でしょうか? そうでない場合、なぜこれが起こるのか誰か知っていますか?

編集: エラーが発生することを期待しています。ファイル システム ドライバーをテストしています。異なるマシンでの同じテストから 2 つの異なるエラー コードが表示される理由がわかりません。ここにコードがあります

homeDir << "C:\Users\me\TestFolder";

string childDir = "\\LongChildDirectoryName";
string dir = homeDir.str();
DWORD lastErr = ERROR_SUCCESS;
while(lastErr == ERROR_SUCCESS) 
{
    int len = dir.size();
    if(len > (MAX_PATH - 12))
    {
        CuFail(tc, "Filepath greater than max allowed should be");
    }

    dir += childDir;

    if(!CreateDirectory(dir.c_str(), NULL))
    {
        lastErr = GetLastError();
        if (lastErr == ERROR_ALREADY_EXISTS)
            lastErr = ERROR_SUCCESS;
    }
}
CuAssert(tc, "Check error is ERROR_PATH_NOT_FOUND", lastErr == ERROR_PATH_NOT_FOUND);
4

2 に答える 2

1

ロジックに欠陥があります。homeDir.str() が存在しない名前を返した場合、CreateDirectory からの戻り値は ERROR_PATH_NOT_FOUND になります。これを行うだけで問題を実証できます。

string childDir("\\LongChildDirectoryName");
string dir("foo");

CreateDirectory 呼び出しはパス foo\LongChildDirectoryName を取得し、foo が存在しない場合は ERROR_PATH_NOT_FOUND を取得します。修正は、これを while ループの前に追加するだけです。

CreateDirectory(dir.c_str(), NULL);

また、文字列が連結される前ではなく、連結された後に長さチェックを移動する必要があります。アレックスが提案した「\\?\」構文を使用することも良い考えです。

于 2012-05-22T17:04:14.080 に答える
0

CreateFile()より長いパスを使用するには、 の「ワイド」バージョンを使用する必要がありますCreateFileW()

このトピックに関するこのMSDN の記事を参照してください。

HANDLE WINAPI CreateFile(
  __in      LPCTSTR lpFileName,
  __in      DWORD dwDesiredAccess,
  __in      DWORD dwShareMode,
  __in_opt  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  __in      DWORD dwCreationDisposition,
  __in      DWORD dwFlagsAndAttributes,
  __in_opt  HANDLE hTemplateFile
);

lpFileName [in]

    The name of the file or device to be created or opened.

    In the ANSI version of this function, the name is limited to MAX_PATH characters.
To extend this limit to 32,767 wide characters, call the Unicode version of the
function and prepend "\\?\" to the path. For more information, see Naming Files,
Paths, and Namespaces.
于 2012-05-22T02:22:55.583 に答える