C言語でフォルダの削除方法についての質問

このQ&Aのポイント
  • C言語でフォルダの削除方法が分からず困っています。ファイルの削除は"remove()"で行うことができましたが、フォルダは同じ方法ではできないようです。別の方法があればそれでもいいですし、"SHFileOperation()"の使い方を知りたいのでよろしくお願いします。
  • "SHFileOperation()"を使用してフォルダの削除を試みましたが、エラーが発生しました。"SHFILEOPSTRUCT"の値の設定がうまくいっていない可能性があります。
  • 現在は"SHFileOperation()"ではなく、フォルダの削除に"remove()"を使用しています。しかし、別の方法があれば教えていただきたいです。
回答を見る
  • ベストアンサー

フォルダの削除について

Cでのフォルダの削除方法が分からず困っています。 ファイルの削除は"remove()"で行うことができましたが、フォルダは同じ方法ではできないようです。 No.394869 の質問を参考にして"SHFileOperation()"を使用してみたのですが、エラー担ってしまいました。(Access Violation) "SHFILEOPSTRUCT"の値の設定(ハンドルなど)がうまくいっていないのかな?とも思ったのですが、 どうすればよいのかわかりません。 別の方法があればそれでもいいですし、"SHFileOperation()"の使い方(ハンドルの設定など)を知りたいのでよろしくお願いします。 ちなみに、今は以下の方法でやっていました。 フォルダ内(testfolder)は空の状態です。 ******************************************** SHFILEOPSTRUCT shfileop; /* ファイルの削除 */ shfileop.hwnd = NULL; shfileop.wFunc = FO_DELETE; shfileop.pFrom = "C:\\TEST\\testfolder"; shfileop.fFlags = FOF_SIMPLEPROGRESS|FOF_NOCONFIRMATION; SHFileOperation(&shfileop);

  • io11
  • お礼率100% (2/2)

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

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

FOF_SIMPLEPROGRESSが指定されていますね。 このときは、lpszProgressTitleが有効になるので構造体を初期化しないとエラーになるでしょう。 もしかしたらNULLでもだめで、文字列を指定しないといけないかも。 _rmdirは、空のディレクトリしか削除できない点に気をつけてくださいね。

io11
質問者

お礼

ありがとうございます。 おっしゃるとおり、構造体の初期化に問題があったようです。 構造体の初期化をしてから実行してみたところ、 正常にフォルダを削除することができました。 これからも何かありましたらよろしくお願い致します。

その他の回答 (1)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

ファイル名は、最後にNULL文字が2つ連続する必要があります。 shfileop.pFrom = "C:\\TEST\\testfolder\0"; として試してみてください。

io11
質問者

お礼

回答ありがとうございます。 早速"\0"を追加してやってみましたが、 他に問題があったようでエラーが発生してしまいました。 上司にも相談していろいろ聞いてもらったところ、 "_rmdir関数"というものがあり、それを使うようにと言われました。 その方法で試してみたら正常にフォルダが削除されたので、"_rmdir()"を使用することにします。 "SHFileOperation()"でのエラーについては、 時間を見つけて解決してみようと思います。 ありがとうございました。 ちなみに、_rmdir関数の使用法は以下の通りです。 intRet = _rmdir(strDirPath); (strDirPath = 削除対象ディレクトリパス)

関連するQ&A

  • 2日以前のファイルを削除するワイルドカーの指定方法について教えてください。

    現在日時から2日以前のファイルを削除対象とします。 ファイル名は以下のようになっています。 20081112162021_aaa_bbb.tmp 20081113162021_aaa_ccc.tmp 20081114162021_aaa_ddd.tmp 20081115162021_aaa_eee.tmp 2日以前を削除なので、11月12日と11月13日のファイルが 消えてくれればOKです。 削除対象となるファイル数は、多いと思うので、 1ファイルずつ消すという方法(DeleteFileやRemove)は、 考えていません。 以下のサンプルを見つけたのですが、 ワイルドカード指定で、2日以前のファイルだけを削除対象する ワールドカードの書き方が分からないので教えてください。 #include <windows.h> int main() { SHFILEOPSTRUCT sfo = { 0 };   sfo.wFunc = FO_DELETE; sfo.pFrom = TEXT( "D:\\Temp\\*.tmp" ); sfo.fFlags = FOF_NOCONFIRMATION; ::SHFileOperation( &sfo ); return 0; } C++ Windows2003Server

  • SHFileOperationについて

    こんにちは。 タイトルの通り、APIのファイルフォルダコピー関数に関する質問です。現在VisualBasicでの操作なので、こちらへ掲載させていただきました。 まず環境ですが、 PC:VAIOノート2001年製 OS:Windows2000Pro 外付けフロッピー(A:)ドライブ:Logitec製USBバスパワードライブ 以上の条件で、下記のロジック Function FileCopy(frm_ctrl As Form, source As String, destination As String) As Variant Dim lpFileOp As SHFILEOPSTRUCT Dim lngRetValue As Long With lpFileOp .hWnd = frm_ctrl.hWnd .wFunc = FO_COPY .pFrom = source .pTo = destination .fFlags = FOF_NOCONFIRMATION Or FOF_NOCONFIRMMKDIR Or FOF_MULTIDESTFILES Or _ FOF_SIMPLEPROGRESS .fAnyOperationsAborted = True .hNameMappings = 0& .lpszProgressTitle = "コピー" End With lngRetValue = SHFileOperation(lpFileOp) If lngRetValue <> 0 Then MsgBox "ファイルコピーに失敗しました。" End If AplFileCopy = lngRetValue End Function を実行した場合、デザイン環境または実行したexeが強制終了させられ、エラーメッセージが表示されます。 ステップインで追跡した結果、"SHFileOperation(lpFileOp)"の箇所で発生していたのですが、原因が分かりません・・・ちなみにWindowsXPで実行した場合、デザイン環境時のみエラーが発生し、実行環境では正常にファイルコピーが完了しました。 以上から、SHFileOperation()がエラーを発生させる原因または、これを回避・解消する方法をご存知の方、おられましたら、教えてください。 よろしくお願いします。

  • CSting を TCHAR [] に変換したい。

    Visual Sutdio 2010 , VC++ , MFC でファイルリスト一覧作成ソフトを作っている者です。 CSting 型の _T("~\0~\0\0") を TCHAR [] に変換したいです。 CSting 型の変数名は、DeleteFilePathです。 '\0' を他の文字に置換して確認した所、正しく入っています。 現在は、4096文字の文字列配列に入れています。 ゴミ箱に移動できる時とできない時があります。 _______________________________________________________________________________ ■現在のコード  index = -1;  while ((index = CFileListCreatorDlg::m_xcList.GetNextItem  (index, LVNI_ALL | LVNI_SELECTED)) != -1)  {   CString FullPathString = CFileListCreatorDlg::m_xcList.GetItemText(index,2);   if (FullPathString.Right(1) != _T("\\")){     ::SetFocus(::GetDlgItem(m_hWnd,IDC_LIST));    FullPathString.Replace(_T ("\\"),_T("\\\\"));    DeleteFilePath = DeleteFilePath + FullPathString + _T('\0');    CFileListCreatorDlg::m_xcList.DeleteItem(index);   }   index--;  }  DeleteFilePath = DeleteFilePath + _T('\0');  _TCHAR cszPath[4096];   // TCHAR型  _tcscpy(cszPath, DeleteFilePath);  // CString型→TCHAR型  SHFILEOPSTRUCT sfs;  memset ( &sfs, 0, sizeof ( SHFILEOPSTRUCT ) );  sfs.fFlags = FOF_NOERRORUI | FOF_SIMPLEPROGRESS | FOF_ALLOWUNDO;// ゴミ箱へ移動の確認をする場合 FOF_ALLOWUNDO をつける;  sfs.wFunc = FO_DELETE;  sfs.pFrom = cszPath;  if ( 0 != SHFileOperation ( &sfs ) )  {   MessageBox(_T("ゴミ箱に移動できませんでした"),_T("SHFileOperation 失敗"),MB_OK);   return 0;  } _________________________________________________________________________________________________________________________________________________ 5回に1回成功するので、不思議です。 ファイルのパスは、リストコントロールのアイテムに格納されていて、 削除したいアイテムを選択肢、Shift + Delete で、ゴミ箱に削除する ユーザー関数が呼び出されます。(ゴミ箱に移動するだけで、確認メッセージは出なくていいです。) 今まで、具体的した事を記すと以下のようになります。 cszPath = const_cast<LPTSTR>(static_cast<LPCTSTR>DeleteFilePath;  //ビルドエラー としたり、 _TCHAR cszPath[DeleteFilePath.GetLength()];  // TCHAR型 としたり、 TCHAR cszPath[256];  // TCHAR型 _tcscpy(cszPath, DeleteFilePath);  // CString型→TCHAR型 ・・・とやってみましたが、出来ません。 http://www.usefullcode.net/2006/12/post_13.html http://www5d.biglobe.ne.jp/~noocyte/Programming/Windows/WindowsTips.html#MoveToRecycleBin とかが参考になりそうです。 先程も書きましたが const _TCHAR cszPath[] = _TEXT ( "C:\\a.txt\0C:\\b.txt\0" ); の代入がうまく行きません。 ____________________________________________________________________________________________________________________________________ http://sysneitf.ifdef.jp/shell_filestotrash.html 以下、参考にした部分 // 複数ある場合は、パスを'\0'で区切る。終端は、'\0''\0'である必要がある  const _TCHAR cszPath[] = _TEXT ( "C:\\a.txt\0C:\\b.txt\0" ); // "c:\\a.txt"と"C:\\b.txt" をゴミ箱へファイルを移動するサンプル (シェルエミュレート)  SHFILEOPSTRUCT sfs;  memset ( &sfs, 0, sizeof ( SHFILEOPSTRUCT ) );  sfs.fFlags = FOF_NOERRORUI | FOF_SIMPLEPROGRESS | FOF_ALLOWUNDO;// ゴミ箱へ移動の確認をする場合  FOF_ALLOWUNDO をつける;  sfs.wFunc = FO_DELETE;  sfs.pFrom = cszPath;  if ( 0 != SHFileOperation ( &sfs ) )  {   MessageBox ( NULL,   _TEXT ( "SHFileOperation 失敗" ),   _TEXT ( "エラー" ),   MB_OK | MB_ICONSTOP );  } どなたか、お教え下さると嬉しいですm(_ _)m

  • ファイルやフォルダをごみ箱に移動 その2

    直下の質問「ファイルやフォルダをごみ箱に移動」をさせていただいた者です。 「ファイルやフォルダをごみ箱に移動」を行うActiveX DLLを作成して、無事動作させることができました。が、新しい問題が発生してしまいました。 作成したルーチンは、以下の通りです。 ----- Public Sub GoToTrash(inStrItemNames As String, Optional inBlnConfirm As Boolean) Dim ShellOp As SHFILEOPSTRUCT Dim flg As Integer ' 確認メッセージの表示? If IsMissing(inBlnConfirm) Then inBlnConfirm = False If inBlnConfirm Then flg = FOF_ALLOWUNDO Else flg = FOF_ALLOWUNDO Or FOF_NOCONFIRMATION End If With ShellOp .hwnd = 0 .wFunc = FO_DELETE .pFrom = inStrItemNames .fFlags = flg End With ' ごみ箱へ削除実行 SHFileOperation(ShellOp) End Sub ----- これをActiveX化して、ASPから呼び出すと、ちゃんと動作して、指定されたファイルはごみ箱に直行します。しかし、存在しないファイルなどが指定されると、たとえ、FOF_NOCONFIRMATIONを指定したとしても、確認のDialogBoxが表示されてしまうようです。(WSHで確認しました) こうなると、ASPではスクリプトエンジンが処理を中断してしまうようで、以降再起動しない限り、ASPページが全く表示されなくなってしまいます。 なにか良い手段は無いでしょうか?

  • フォルダの削除

    RemoveDirectory(DirPath)を使ってフォルダの削除を行ないたいのですが、   ・C:\Documents and Settings\All Users\スタート メニュー\プログラム内のゲームフォルダ   ・任意にフォルダを作成し、プロパティでアイコンを変更したフォルダ が削除出来ません。 何かほかの方法はないのでしょうか? SHFileOperationも使ってはみたのですが... 環境は以下の通りです。 WindowsXP VisualC++V6 SP 以上、よろしくお願いします。

  • ファイルやフォルダのごみ箱への移動 2

    ファイル(もしくはフォルダ)を一つ選択してごみ箱に捨てるとき、「いいえ」を押したら別の処理をさせようとしているのですが、作ってみた関数だと上手くいきません。 どういうわけか常に 0 が返ってきます。 --------------------------------- Public Function FileToDust(FName As String) As Long 'ファイルをごみ箱へ送る 'FName --- ファイル、フォルダ名を入れる文字列変数   Dim FOS As SHFILEOPSTRUCT   With FOS     .hWnd = 0     .wFunc = FO_DELETE     .pFrom = FName     .fFlags = FOF_ALLOWUNDO   End With   FileToDust = SHFileOperation(FOS) End Function --------------------------------------- どこが悪いんでしょうか。本来なら、処理が中断されれば 0 以外が返ってくるらしいのですが…… 0 が返ってきたとき成功したと思って前回の質問をすぐに打ち切ってしまったので、もう一度質問させていただきます。 前回の質問 http://oshiete1.goo.ne.jp/kotaeru.php3?q=466239 よろしくお願いします。 ---------------- 開発環境 VB6.0SP5 WinME

  • フォルダの削除が出来ない

       DellのWindows 7 を使っています。内蔵HDは1TBあったので、Cドライブには100GB、残り900GBをDドライブに割り当てて、購入時にパーティションしてもらいました。(メモリは、12GB)    そして、Cドライブには、主にプログラム、Dドライブにはデータ、と振り分けていたのですが、気が付くと、いつの間にかCドライブが満杯になってしまいました。そして、ディスクトップ上での作業中にもメモリ不足の警告メッセージが出るようになり、PC作業も続けられなくなってきました。  そこで、Cドライブの不要プログラムは「アンインストール」、その他の「データ」類は「削除」して、Cドライブに空き容量を増やす努力をしました。  そこで、Cドライブにあった、ある大きな(データ)フォルダの「削除」操作を行っていたところ、その作業中に、「別のプログラムがこのフォルダまたはファイルを開いているので操作を完了できません。フォルダまたはファイルを閉じてから再実行してください」とのメッセージが頻繁に出るようになりました。しかし、この時、何のフォルダもファイルも開いていないのです。そして、結局、フォルダの「削除」ができないので、Cドライブの空き容量を増やすことが出来ませんでした。  と、いうことで教えていただきたいのですが、  1,Cドライブにはいつの間にか、自分には覚えのないフォルダやファイルが一杯溜まっていますが、捨てても構わないようなフォルダやファイルの見分け方が有れば教えてください。  2,フォルダやファイルを何一つ開いていないのに、「別のプログラムがこのフォルダやファイルを使っている」とのメッセージが出てくるのは、どういう理由からでしょうか。また、こうしたメッセージにはどう対処すれば良いのでしょうか。  3、PCの主動作を、Cドライブではなく、容量に余裕のあるDドライブを中心にしたPC操作ができるような設定方法はないものでしょうか。(便利かな、と軽い気持ちでパーティションを切ったことを心底悔やんでおります)  以上、どうぞ宜しくお願いします。

  • ファイルやフォルダをごみ箱へ移動

    ASPの処理で、ファイルを削除する必要があるのですが、誤動作の保険のためにファイルを直接削除せず、一旦ごみ箱に移動させたいと思っています。 いろいろ検索したのですが、決定打が未だ見つかりません。 今までの調べでは、SHFILEOPSTRUCT構造体にオペレーションをセットして、SHFileOperation関数を呼び出すActiveX DLLを自作して、ASPから使用するしか方法がないようです。 FileSystemObject::MoveFile を使用して、\RECYCLED へ移動すれば良いかとも考えたのですが、質問:「GetFolder や GetFile でASPの処理がストップ」と同様の現象で処理が戻ってきません。 何かもっと手軽な方法をお知りの方がいましたら、教えてください。

  • ■フォルダの削除方法を教えて下さい。

    ■フォルダの削除方法を教えて下さい。 ・ノートパソコン「Cドライブ」の空き領域が残り少なくなったので、未使用ファイルを削除するよう警告が出ました。 ・そこで、どのフォルダが容量を使っているのか調べた所、「Cドライブ」→「PROGRAM FILE」→「COMMON FILE」→「SYMANTEC SHARED」に辿り着きました。 ・上記フォルダ内にあるファイルを削除しようとした所、「ファイルが削除できません」と表示されました。 →上記を踏まえ、削除方法を教えて頂ければ幸いです。

  • フォルダの削除ができない

    NTを使っていますが、ある日Cドライブの中を見たら、C¥のところに名前のついてないフォルダと、みたことない名前のフォルダが二つほど出現していました。 名前のついてないフォルダを開こうとしても、もちろん開けませんし、へんな名前のフォルダを開こうとすると、「フォルダC¥OOOは存在しません。」と出てこれも開けません。 気持ち悪いので削除しようとしたら、「OOOを削除できません。指定したファイルが見つかりません。パスとファイル名を確認して下さい。」 と出てしまって削除できません。 これはどういうことなのでしょうか? なんなのでしょうか? エクスプローラで見ると、下にもフォルダがあるのですが、これも削除できず・・。 覚えのないものなので削除したいのですが、どうすればよいのでしょうか? どうかよろしくお願いします。

専門家に質問してみよう