ファイルコピーとプログレスバー

Windowsで、ファイルをコピーする処理を実装するとき、小さなファイルはいいのだが、大きなファイルともなると、数十秒間はコピー処理から帰ってこないことがよくある。そこで思いつくのがプログレスバーなのだが、これがなかなかいい方法がない。
.NET 環境ならば、System.IO.File.Copy()があるが、これだとコピー処理の進捗度合いはわからない。VBの.NETコンポーネントにある、CopyFile() 関数を使う手がある。これは、エクスプローラなどでコピーをする際に出てくる見慣れた「コピー中です」というダイアログが出るというものだ。しかし、直前に上書き確認ダイアログが出てくるのを抑制できなかったりして、どうもかゆいところに手が届かない感がある。(.NET環境におけるよいAPIをどなたかご存知ならば教えてください)
Win32の、SHFileOperation は、上記の上書き確認ダイアログも抑制できる。また、これもWin32だが、CopyFileEx() というのがあって、これはプログレス確認用のコールバック関数があるそうな。CopyFileEx() は、.NETでも、C#VBなどで呼び出せるらしい。プログレスバー出すのにも結構使われているようです。ああこれはね、いいかもね。
あるいは、ファイルコピーではなく、FTPが使えるなら、その方が速いから、猫プロの223章にもあるように、InternetSetStatusCallback()関数 とかを使えばファイル転送の進捗状況はばっちりとれる。FTPは、受け側にFTPサーバーが立ってないとだめだけど、ファイル転送専用のプロトコルだし、ファイル共有機能よりははるかに機能が限定されているので専ら高速、という利点もある。

しかし、それでもファイルコピーの進捗の詳細を最優先でとりたいのならば、ReadFileWriteFileなどを使って、あるいはfread()fwrite()などを使って、バイト単位でのファイル転送を実装し、その中に進捗報告用の処理を組み込む、などして、全て自分で実装するのが一番よい、という、何だか悲しい結論になってそうなのが現状だ。