• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Windows API を使ってファイルをごみ箱に入れるには?)

Windows APIを使ってファイルをごみ箱に入れる方法

このQ&Aのポイント
  • Windows APIを使用して、ファイルをごみ箱に移動させる方法について調べています。
  • DeleteFile()関数ではなく、ごみ箱に移動させる方法を知りたいです。
  • Windows95以降のシェルアプリケーションの機能としてごみ箱があり、SHEmptyRecycleBin()とSHQueryRecycleBin()というAPIが存在しますが、ファイルをごみ箱に移動するAPIが見つかりませんでした。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

ソースはC#ですが、 http://uchukamen.com/Programming1/ToRecycleBin/index.htm が参考になると思います。

noocyte
質問者

お礼

ありがとうございます. SHFileOperation() を使ってファイルをごみ箱に送ることができました. GUI アプリケーションでも,コンソール・アプリケーションでも動きました.

noocyte
質問者

補足

ありがとうございます. SHFileOperation() を使ってファイルをごみ箱に送ることができました. GUI アプリケーションでも,コンソール・アプリケーションでも動きました. ただ,それを確認する過程でつまづいたり,気付いたりしたことがあるので, 後の人のために書き残しておきます. ●コンソール・アプリケーションでは,SHFILEOPSTRUCT::hwnd に NULL を渡さざるを得ないが,それでも動作する. ファイルはちゃんとごみ箱に送られるし,SHFILEOPSTRUCT::fFlags に FOF_NOCONFIRMATION や FOF_NOERRORUI を指定しなければ, 確認ダイアログやエラーダイアログも表示される. ただしこの場合,SHFileOperation() はエラー ERROR_INVALID_HANDLE をセットするが,無視してよさそうである. 同じように SHFILEOPSTRUCT::hwnd に NULL を渡していても, GUI アプリケーションではエラーがセットされない. いや,そもそも,hwnd にどのようなダイアログのハンドルを渡せばよいのか, マニュアルを見てもさっぱりわからない.マニュアルの hwnd の説明には 「ファイル操作の状態に関する情報を表示するダイアログボックスのハンドル」(拙訳) と書いてあるが,どんなコントロールをどのように配置すればいいのか? テキトーにダミーのダイアログを作ってそのハンドルを渡してみたり, アプリケーションで別の目的に使用しているダイアログのハンドルを 渡してみたりしたが,ERROR_INVALID_HANDLE になり, ファイルはごみ箱に送られなかった. ●パス名を受け取る Windows の API は,ディレクトリの区切り文字と して '\\' の代わりに '/' を使用したり,両者を混在させたりしても かまわないものが多いが,SHFileOperation() はそうではない. (SHFileOperation() は Windows API ではなく,シェル API だから?) パス名の '\\' をすべて '/' に置き換えた文字列を使用したところ, ファイルはごみ箱に送られるものの,その中での「名前」が空文字列になり, 「元の場所」は "D:" だけになってしまった.どうやら最初の '/' 以後の部分が無視されてしまったようである. 確認ダイアログに表示されるファイル名も1個の '"' だけである. ただし,ごみ箱のディレクトリの中にあるごみ箱管理ファイル "INFO2" をダンプしてみたところ, そのようなファイルでも元のパス名がちゃんと記録されており, 「元に戻す」こともできた.どうやら表示だけの問題らしい. ●ごみ箱に移動できないファイルがあると,なぜかそのようなファイルごとに 数秒程度時間がかかる.SHFILEOPSTRUCT::hwnd に FOF_NOCONFIRMATION と FOF_NOERRORUI を指定していない場合,確認ダイアログはすぐに表示される ものの,それに「はい」と答えると約5秒後にエラーダイアログが出た. なぜこんなに時間がかかるのだろう? Google で「+"ファイルをごみ箱" +SHFileOperation」で検索してみても, Cのサンプルコードはほとんど見あたらないので,拙作を書いておきます. といっても,やってることはパス名をコピーして,その後にもう1個 '\0' を追加しているだけなんですが.(笑) #include <ShellAPI.h> #include <tchar.h> int MoveFileToRecycleBin(const TCHAR *fullPathName, HWND hwnd, FILEOP_FLAGS flags) { TCHAR *dest; const TCHAR *src = fullPathName; SHFILEOPSTRUCT fileOp; size_t length = _tcslen(fullPathName); /* ファイルのフルパス名を2つの _T('\0') で終端する必要があるので, * fullPathName[] を fileOp.pFrom[] にコピーし,2個目の _T('\0') を追加する. */ fileOp.pFrom = dest = alloca(sizeof(*dest) * (length + 2)); while((*dest++ = *src++) != _T('\0')) {} *dest = _T('\0'); /* もう1個必要 */ fileOp.hwnd = hwnd; fileOp.wFunc = FO_DELETE; fileOp.pTo = NULL; fileOp.fFlags = FOF_ALLOWUNDO | flags; fileOp.fAnyOperationsAborted = FALSE; fileOp.hNameMappings = NULL; fileOp.lpszProgressTitle = NULL; return SHFileOperation(&fileOp); }

その他の回答 (1)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

#1>そもそも,hwnd にどのようなダイアログのハンドルを渡せばよいのか 実際に試してないんで所見ですけど 要するに親フォームのハンドルですよね。 #1のC#のソースもそうなっていますね。 マイクロソフトのサンプルを見てみると(VB2005) http://www.microsoft.com/japan/msdn/vbasic/migration/tips/SHFileOperation/ >.hwnd = IntPtr.Zero になっているから、要するにNULLでいいということなんじゃないですか(^^;

noocyte
質問者

補足

> >.hwnd = IntPtr.Zero > になっているから、要するにNULLでいいということなんじゃないですか(^^; はい,現時点では 「どんなダイアログのハンドル渡したらええかサッパわからんし,  やってみてもうまくいかんし,NULL で動くんやったら NULL でええやん.  ハンドル渡したらどんなエエことがあるっちゅーねん?」 というノリでいくことにします.(^^;

関連するQ&A