3

関数ごとにフォルダーをコピーしようとしていますSHFileOperationA。これが私のコードです。

int main()  {

    SHFILEOPSTRUCTA sf;
    int result;

    string source = "D:\\check\\folder4";
    string dest = "D:\\Documents\\test\\folder4";

    sf.pFrom = source.c_str( );
    sf.pTo = dest.c_str( );
    sf.wFunc = FO_COPY;
    sf.fFlags = FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR | FOF_SILENT;

    result = SHFileOperationA(&sf);

    return 0;
}

文字列を2回追加する方法がわかりません\0。私はこのようなものを試しました。

    string source = "D:\\check\\folder4\\0\\0";
    string dest = "D:\\Documents\\test\\folder4\\0\\0";

しかし、それは機能していません。他にもいくつかの組み合わせを試しましたが、どれも機能していません。これを解決する方法を教えてください。

次のようにパスを直接割り当てることで問題を解決できます:-

    sf.pFrom = "D:\\check\\folder4";
    sf.pTo = "D:\\Documents\\test\\folder4";

問題は解決しますが、私の意図は文字列を利用することです。誰でもこれで私を助けてください。

また、可能であれば、文字列定数の直接割り当てsf.pFrom = "D:\\check\\folder4";が機能し、文字列を使用した割り当てが機能しない理由を誰かに教えてもらえますsf.pFrom = source.c_str( );か?

前もって感謝します。

4

1 に答える 1

2

定数 char 配列の最後を見つけて (またはstd::string同様strlenに)、必要な数の文字のみを割り当てます。したがって、最初のヌルで停止し、他のヌルをコピーしません。これをオーバーライドしたい場合は、次のようなサイズを取るコンストラクタを使用する必要があります。

string source("D:\\check\\folder4\\0", 18);

他の文字列と同様に、2 番目のヌル文字が自動的に追加されることに注意してください。

または、次のように明示的にヌル文字を追加します (より良い解決策):

std::string source = std::string("D:\\check\\folder4") + std::string(1, '\0');

または

std::string source = "D:\\check\\folder4";
source.append(1, '\0');

他の質問については、定数文字配列の使用が機能する理由:

それが機能する場合、定数文字配列の後のメモリ内のバイト/文字がnullであるのは純粋な運だと思います。

これを自分でテストできます(デバッガーで、または値を出力して):

// this is the compiler generated null
(*(sf.pFrom + strlen(sf.pFrom))) == '\0'

// this is the following byte/character that should be luckily null
(*(sf.pFrom + strlen(sf.pFrom) + 1)) == '\0' 

次の文字がデバッガーで null でないことがわかった場合は、SHFileOperationA. その特定のケースでは、単独でデバッグしているという事実がメモリイメージを異なるものにする可能性があるため、失敗/クラッシュ/その他の可能性があります (通常はそうではありません)。

また、「機能する」とは正確に何を意味するのかを指定していません。(それは何ですか)の結果を意味しますSHFileOperationAか。または、アプリケーションが動作しないときにクラッシュ/スローすること。または、ファイルがコピーされているかどうか。これはあなたに答えるのに役立つかもしれません。

于 2013-04-12T11:37:25.013 に答える