あるディレクトリを別のディレクトリにコピーするために 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;