2012-02-07 5 views
2

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

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; 
+1

@traphiでは、問題がシェルAPIにあり、C++で同じコードを使って再現可能であるため、 'Delphi'と' Pascal'タグは適切ではないと思います。 'Delphi'でタグを付けることで、シェルに慣れている人はいなくても、無視するリストに' Delphi'や 'Pascal'を追加して観客を絞り込むことができます。 – Stan

答えて

4

0x4C7が実際にある:

「操作がユーザーによって取り消された、またはは黙っ場合はキャンセルここ

は、いくつかのバグがあると思うかもしれこれらのソースコードです適切なフラグがSHFileOperationに供給されました。

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

更新

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

+0

悲しいかな、通常の(フラッグレス)状況では何の質問もありません。しかし、たとえば、ファイルの1つが他のアプリケーションとロックされている場合は、エラーメッセージが表示されます。私はそのようなUIのものを抑制する必要があります。私の要件に使用するフラグの組み合わせはどれですか?上記の「安全な選択肢」とは何ですか? – Stan

関連する問題