フォルダ削除

返信する


答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: フォルダ削除

by ジョン » 2006年10月02日(月) 09:14

皆さんありがとうございます。

hiraさんのコードが理想通りに”*”が使えました。

考えると、DeleteFileが有るのならDeleteDirectoryがあっても
いいですよね。

by イグトランス » 2006年10月01日(日) 20:16

Windows 9xのRD(そしてNT系で/sを指定しなかったとき)はRemoveDirectory関数と同じく空のフォルダしか削除できなかったはずです。

by 時代の潜水士 » 2006年10月01日(日) 16:51

すみません。

ShellExecute (NULL,NULL,"DelTree","/Y C:\Windows\デスクトップ\Kiete",NULL,SW_HIDE)
に関してなのですが、*を使え簡単で良いと思ったものの
DelTreeもフルパスが好ましいという以外に問題があるようです。

上記を実行した後にCtrl+Alt+Deleteキーを押して見ると
Winoldap
が実行する毎に増えている様なのですが何なのでしょうか?

これを回避する方法はないものかと思ったもののイグトランス (egtra)さんの
書き込みを読むと今後使えそうに無いのでまぁいいかな。

試してみたらWindows 95でもRD [ドライブ:]パスがあるんですね。

by イグトランス » 2006年10月01日(日) 10:34

NT系だとdeltreeはrd /sになります。
しかも内部コマンドのはずですから実質的にはcmd /c rd /sとなります。
もっともこれではコマンドプロンプトが表示されるのが見っともないですが。

その対策をするくらいならSHFileOperationを使う方が良いと思います。

by 時代の潜水士 » 2006年10月01日(日) 00:41

C:\Windows\デスクトップ\Kieteを消す場合

#N88BASIC
Msgbox 0,"kesuzo"
ShellExecute (NULL,NULL,"DelTree","/Y C:\Windows\デスクトップ\Kiete",NULL,SW_HIDE)
Msgbox 0,"kietaka"
End

こんな手もあるかなと思ってみました。

ただし Ab 3.13 Windows 95,98 の環境しか無いため
XPなどのOSで動くかどうか分かりません。

Re: ”*.txt”はフォルダです。

by hira » 2006年9月29日(金) 22:23

エクスプローラからなら、中身のあるフォルダが削除できますよね。
これを利用すると、シェルの機能で中身のあるフォルダを一発で削除できてしまったりします。
コードの切れ端かどこかに以前書いた覚えがあるのですが、なくなっているのでもう一度方法を紹介しておきます。

コード: 全て選択

Function RemoveDirectory2(PathName As String) As Long
Dim udtFileOperation As SHFILEOPSTRUCT
Dim PathName2 As *Byte
	If (GetFileAttributes(PathName) And FILE_ATTRIBUTE_DIRECTORY)=0 Then
		RemoveDirectory2=-1
		Exit Function
	End If
	PathName2=calloc(Len(PathName)+2)
	lstrcpy(PathName2,PathName)
	With udtFileOperation
		.hWnd=0
		.wFunc=FO_DELETE
		.pFrom=PathName2
		.pTo=NULL
		'[Shift]を押しながらのとき完全削除
		.fFlags=FOF_NOCONFIRMATION
		RemoveDirectory2=SHFileOperation(udtFileOperation)
	End With
	free(PathName2)
End Function

'フォルダ C:\test を削除する(中身にファイルやフォルダがあってもOK)
RemoveDirectory2("C:\test")

Re: ”*.txt”はフォルダです。

by 7 » 2006年9月29日(金) 20:59

> 実は”*.txt”はフォルダのことです。
???

> 単数のフォルダは削除できますが、
> 複数のフォルダの削除ができません。
複数のフォルダを削除したい場合、自分の考えですが、FindFirstFile()からFindNextFile()関数へ続き、グルグル回してフォルダを特定、特定する度に何らかの条件に当てはまるフォルダを削除、という形で行おうと思います。

よく覚えていないのですけど、中身のあるフォルダの削除は、RemoveDirectory()関数が失敗した場合に削除しようとしたフォルダの中身をFindFirstFile()からFindNextFile()関数へと続けてグルグル、ファイルを発見する度に削除、フォルダの中身が無くなった所で、再度フォルダを削除する、といったようにしていたような...。
ちなみに、フォルダの中にはフォルダがある場合も勿論あるので再起処理してたと思います。

”*.txt”はフォルダです。

by ジョン » 2006年9月29日(金) 19:26

ご回答ありがとうございます。

実は”*.txt”はフォルダのことです。
単数のフォルダは削除できますが、
複数のフォルダの削除ができません。

そこで考えたのが、昔コマンドでよく使った”*”を
活かして、空のフォルダすべてを削除できればと思い
ご意見頂ければ、という事です。

by C1000 » 2006年9月29日(金) 19:18

ちなみに、ファイルの削除にはKill命令語を使います。

コード: 全て選択

Kill "C:\test\*.txt"

Re: ワイルドカード

by M.S. » 2006年9月29日(金) 16:52

> ありがとうございました。
>
> RemoveDirectory関数で理想通りです。
> しかし、複数の空フォルダが有る場合に、
>
> RemoveDirectory(”C:\test\*.txt")
>
> こんな感じで実行しましたが、削除されません。
> ABでのワイルドカード”*”の使い方が悪いのでしょうか。

RemoveDirectory のパス指定のところに、
テキスト ファイルのパスが入力されているのが原因です。

RemoveDirectory のパス指定には、
ディレクトリのフルパスを入力してください。

ワイルドカード

by ジョン » 2006年9月29日(金) 14:45

ありがとうございました。

RemoveDirectory関数で理想通りです。
しかし、複数の空フォルダが有る場合に、

RemoveDirectory(”C:\test\*.txt")

こんな感じで実行しましたが、削除されません。
ABでのワイルドカード”*”の使い方が悪いのでしょうか。

ヘルプセンターで検索したのですが・・・・。
もしよろしければ、この件についてもアドバイス願いませんでしょうか。

よろしくお願いします。

by Indigo Visualist » 2006年9月29日(金) 10:26

Help>リファレンス>Win32API>システムサービス>ファイル に詳細がありますが、
RemoveDirectory関数が使えると思います。
この場合、フォルダの中身を空にしてから使わないといけないらしいです。

ご参考になれば。

フォルダ削除

by ジョン » 2006年9月29日(金) 10:08

"DeleteFile"の存在は確認していますが、
フォルダを削除するAPIがなかなか見つかりません。
ご存知の方がいらっしゃればと思い投稿しました。

よろしくお願いします。

ページトップ