MoveFileWithProgressって一体。。
こんばんはというよりおはようございます、Dolphinです。徹夜明けのように見えて、起きたのは昨晩なのでそうでもない感じです。テーマにMFCとかプログラミング関係のが全然見当たらなかったので、適当に作りました。どっかに埋もれてるだけなのかもしれないけど。。検索ないから分からないし!あ、今回の記事は別にMFCじゃなくてもいいんじゃとかそういう突っ込みはなしな!検索しても検索しても、なっかなか有用な記事が出てこないMoveFileWithProgress関数。そんなに使う機会がないのでしょうか。はたまたShellExtentionに頼っちゃってるのでしょうか。日本語の記事は定義ぐらいしか見当たらなくて、英語の記事はサンプルコードとか載ってても、やっぱり上手く動かない。ロシア語のページは読めません。ハングルとか中国語も読めません。そして、CopyFileEx関数を使っているパターンが多いので「もしCopyFileExにして動いたら・・って、そんなわけないか。」とやってみたらですねぇ。うん、ちゃんとコールバック関数が呼ばれました。MoveFileWithProgressと引数同じですよ??(cancelだけ除く)これはバグなのか、OSの問題なのか、もうなんなのかわけわかめな状態です。仕方ないのでCopyFileExの後にファイルを削除するようにしました。むー。そしてCopyFileExで検索してみると、たーくさん記事が出る。そんなにMoveFileWithProgressは人気がないのか。しょんぼり。とはいえ、同じドライブ内とかだと処理がバカなのでMoveを使用。ソースを一部載せておくので、同じようなことで困ってる人がいたら、参考にどうぞ。/ --- 呼び出し側 --- /// 既に存在する場合hFile = FindFirstFile ( strNewPath, &FindData );if ( hFile != INVALID_HANDLE_VALUE ) { if ( MessageBox ( _T ( "移動先に同名のファイルが存在します。上書きしますか?" ), _T ( "上書き確認" ), MB_ICONQUESTION | MB_YESNO ) == IDNO ) { return; } else { DeleteFile ( strNewPath ); }}FindClose ( hFile );if ( strFile.Left ( 1 ) == strNewPath.Left ( 1 ) ) { MoveFileWithProgress ( strFile, strNewPath, NULL, NULL, MOVEFILE_REPLACE_EXISTING );} else { CopyFileEx ( strFile, strNewPath, myCopyProgressRoutine, ( LPVOID ) this, NULL, COPY_FILE_ALLOW_DECRYPTED_DESTINATION );}/ --- コールバック関数 --- /DWORD CALLBACK CAddDialog::myCopyProgressRoutine(LARGE_INTEGER TotalFileSize, LARGE_INTEGER TotalBytesTransferred, LARGE_INTEGER StreamSize, LARGE_INTEGER StreamBytesTransferred, DWORD dwStreamNumber, DWORD dwCallbackReason, HANDLE hSourceFile, HANDLE hDestinationFile, LPVOID lpData){ CString strTitle; CAddDialog *pdlgAddDialog; pdlgAddDialog = ( CAddDialog* ) lpData; if ( dwCallbackReason == CALLBACK_CHUNK_FINISHED ) { strTitle.Format ( _T ( "size:%ld total:%ld" ), TotalBytesTransferred.LowPart, TotalFileSize.LowPart ); pdlgAddDialog->SetWindowText ( strTitle ); } return PROGRESS_CONTINUE;}うぎゃー。この短い幅の中でこんな長い関数書いたらぐっちゃぐっちゃ。MoveFileWithProgressはコールバック関数を指定しても、何故かコールバック関数が呼ばれませんでした。まーさーかー。同じドライブだと呼ばれない、とかそんな罠ではないですよね。開発環境のノートはドライブ1個しかないので確認もできない。。何はともあれ、これでやっと開発が進む・・・。3時間も費やして結局CopyFileExかヨ!うわーん。※今日は赤石日記はお休みでーす。