2

あるディレクトリを別のディレクトリにコピーするために SHFileOperation を利用する作業コードがあります。この場合、これは Pascal コードですが、C++ でも同じ関数を使用しており、問題は特定のプログラミング言語ではなく、Windows コアに関連しているようです。

MSDN によると、次のフラグの組み合わせを指定したいと考えています。

FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR | FOF_NOERRORUI

つまり、プログレス バーは必要ありません。ファイルとディレクトリに関する可能性のあるすべての質問に対して、暗黙の「はい」の回答を表示しません。また、GUI (ダイアログ ボックス) にエラー メッセージを表示したくありません。

このフラグの組み合わせでは、関数はエラー 0x4C7 を返します (ユーザーによってキャンセルされましたが、これは正しくありません)。FOF_NOERRORUI を削除すると、同じ入力パラメーターとファイルシステムの状態で問題なく動作します。

残念ながら、エラー メッセージも抑制する必要があり、FOF_NOERRORUI フラグが必要です。

私のニーズを満たすために、このフラグの組み合わせ(および他の前提条件である可能性があります)をどのように調整する必要があるかを誰かが知っていますか?

いくつかのバグがあると思うかもしれない人のためのソースコードは次のとおりです。

function CopyDirectory(WindowHandle: HWND; FilenameFrom: string; FilenameTo: string): Boolean;
var
  SH: TSHFILEOPSTRUCT;
begin
  FillChar(SH, SizeOf(SH), 0);
  with SH do
  begin
    Wnd := WindowHandle;
    wFunc := FO_COPY;
    pFrom := PChar(FilenameFrom + #0);
    pTo := PChar(FilenameTo + #0);
    fFlags := FOF_NOCONFIRMMKDIR or FOF_NOCONFIRMATION or FOF_SILENT or FOF_NOERRORUI;
  end;
  Result := SHFileOperation(SH) = 0;
  Result := Result and (not SH.fAnyOperationsAborted);
end;
4

1 に答える 1

4

0x4C7は実際には次のとおりです。

「操作がユーザーによってキャンセルされたか、SHFileOperationに適切なフラグが指定されている場合はサイレントにキャンセルされました。」

すべてのフラグをオフにして操作を実行すると、どのような質問がありますか?私の推測では、安全な選択肢はそうすることであるため、これらの質問の1つは「いいえ」と答えられていると思います。

アップデート

CopyFile()API関数の使用を考えたことはありますか?UIの抑制は必要ありません。ドキュメントはこちらです。

于 2012-03-01T03:48:57.167 に答える