0

PathCombine 関数に問題があります。SHFileOperation() と組み合わせて正しく動作しないようです。私のコードは次のとおりです。

    //beginning of method
    TCHAR* root = new TCHAR[MAX_PATH];
    root = L"C:\\Users\\jhow\\Desktop\\\0";

    //later on in the method
    TCHAR* t1Dir = new TCHAR[MAX_PATH]; //root
    TCHAR* t2Dir = new TCHAR[MAX_PATH]; //temp
    PathCombine(t1Dir,root,L"Folder1\\%REPLACE_THIS%\\\0");
    PathCombine(t2Dir,root,L"Folder1\\temp\0");

    sf.pFrom = t1Dir;
    //sf.pFrom = L"C:\\Users\\jhow\\Desktop\\Folder1\\%REPLACE_THIS%";
    sf.pTo = temporaryDir;

    //Copy files
    int n = SHFileOperation(&sf);

上記のようにすると、メソッドは sf.pTo を認識しますが、何らかの理由で sf.pFrom を認識しません (パス名の末尾にある \ と \0 のさまざまな組み合わせを試した後でも)。n は 2 になります。これは、ファイルが見つからないことを意味すると思います...しかし、たとえば、コメントアウトすると。

    sf.pFrom = t1Dir;

そしてそれを次のように置き換えます:

    sf.pFrom = L"C:\\Users\\jhow\\Desktop\\Folder1\\%REPLACE_THIS%";

SHFileOperation() は機能します... ゼロが返され、すべてのファイルがディレクトリにコピーされていることがわかります。まったく同じ文字列のように見えるので、この奇妙な見方をしています(デバッグして変数にカーソルを合わせても)...なぜこれが起こっているのか知っている人はいますか?構文またはロジックに何か問題がありますか? 見えないから。Visual Studio 2008 を使用しています。お時間をいただきありがとうございます。

4

1 に答える 1

5

変数のヒープにバッファーを割り当てていますrootが、すぐにその変数を読み取り専用の文字列リテラルにポイントし、割り当てられたバッファーをリークします。

SHFileOperation()さらに重要なことは、二重のヌルで終わる文字列を操作することを考慮していませんが、PathCombine()代わりに単一のヌルで終わる文字列を返します。への入力に追加の null を含めようとしていますがPathCombine()PathCombine()単一の null で終わる文字列を入力として受け取るため、それは機能しません。したがって、余分な null は表示されません。出力バッファに十分なスペースを割り当てて余分なヌル ターミネータを保持する必要があり、これらのバッファを に渡す前にそれらがゼロに設定されていることを確認してSHFileOperation()ください。

これを試して:

LPTSTR root = TEXT("C:\\Users\\jhow\\Desktop\\"); 

TCHAR t1Dir[MAX_PATH+2] = {0};
TCHAR t2Dir[MAX_PATH+2] = {0};
PathCombine(t1Dir, root, TEXT("Folder1\\%REPLACE_THIS%\\")); 
PathCombine(t2Dir, root, TEXT("Folder1\\temp")); 

sf.pFrom = t1Dir; 
sf.pTo = t2Dir; 

int n = SHFileOperation(&sf); 
于 2012-05-15T00:35:21.173 に答える