フォルダ削除

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
ジョン
記事: 9
登録日時: 2006年9月29日(金) 10:01

フォルダ削除

#1 投稿記事 by ジョン »

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

よろしくお願いします。
Indigo Visualist
記事: 33
登録日時: 2006年5月22日(月) 21:01
お住まい: 山口
連絡する:

#2 投稿記事 by Indigo Visualist »

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

ご参考になれば。
ジョン
記事: 9
登録日時: 2006年9月29日(金) 10:01

ワイルドカード

#3 投稿記事 by ジョン »

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

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

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

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

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

よろしくお願いします。
M.S.
記事: 212
登録日時: 2005年6月01日(水) 21:51
お住まい: 奈良県北西部

Re: ワイルドカード

#4 投稿記事 by M.S. »

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

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

RemoveDirectory のパス指定には、
ディレクトリのフルパスを入力してください。
C1000
記事: 185
登録日時: 2006年5月07日(日) 17:16
お住まい: 宮城県
連絡する:

#5 投稿記事 by C1000 »

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

コード: 全て選択

Kill "C:\test\*.txt"
ジョン
記事: 9
登録日時: 2006年9月29日(金) 10:01

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

#6 投稿記事 by ジョン »

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

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

そこで考えたのが、昔コマンドでよく使った”*”を
活かして、空のフォルダすべてを削除できればと思い
ご意見頂ければ、という事です。
7
記事: 473
登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:

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

#7 投稿記事 by 7 »

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

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

よく覚えていないのですけど、中身のあるフォルダの削除は、RemoveDirectory()関数が失敗した場合に削除しようとしたフォルダの中身をFindFirstFile()からFindNextFile()関数へと続けてグルグル、ファイルを発見する度に削除、フォルダの中身が無くなった所で、再度フォルダを削除する、といったようにしていたような...。
ちなみに、フォルダの中にはフォルダがある場合も勿論あるので再起処理してたと思います。
hira
記事: 203
登録日時: 2005年5月31日(火) 20:14
お住まい: 兵庫県
連絡する:

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

#8 投稿記事 by hira »

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

コード: 全て選択

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")
時代の潜水士

#9 投稿記事 by 時代の潜水士 »

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で動くかどうか分かりません。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#10 投稿記事 by イグトランス »

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

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

#11 投稿記事 by 時代の潜水士 »

すみません。

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

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

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

試してみたらWindows 95でもRD [ドライブ:]パスがあるんですね。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#12 投稿記事 by イグトランス »

Windows 9xのRD(そしてNT系で/sを指定しなかったとき)はRemoveDirectory関数と同じく空のフォルダしか削除できなかったはずです。
ジョン
記事: 9
登録日時: 2006年9月29日(金) 10:01

#13 投稿記事 by ジョン »

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

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

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