ページ 1 / 1
フォルダ削除
Posted: 2006年9月29日(金) 10:08
by ジョン
"DeleteFile"の存在は確認していますが、
フォルダを削除するAPIがなかなか見つかりません。
ご存知の方がいらっしゃればと思い投稿しました。
よろしくお願いします。
Posted: 2006年9月29日(金) 10:26
by Indigo Visualist
Help>リファレンス>Win32API>システムサービス>ファイル に詳細がありますが、
RemoveDirectory関数が使えると思います。
この場合、フォルダの中身を空にしてから使わないといけないらしいです。
ご参考になれば。
ワイルドカード
Posted: 2006年9月29日(金) 14:45
by ジョン
ありがとうございました。
RemoveDirectory関数で理想通りです。
しかし、複数の空フォルダが有る場合に、
RemoveDirectory(”C:\test\*.txt")
こんな感じで実行しましたが、削除されません。
ABでのワイルドカード”*”の使い方が悪いのでしょうか。
ヘルプセンターで検索したのですが・・・・。
もしよろしければ、この件についてもアドバイス願いませんでしょうか。
よろしくお願いします。
Re: ワイルドカード
Posted: 2006年9月29日(金) 16:52
by M.S.
> ありがとうございました。
>
> RemoveDirectory関数で理想通りです。
> しかし、複数の空フォルダが有る場合に、
>
> RemoveDirectory(”C:\test\*.txt")
>
> こんな感じで実行しましたが、削除されません。
> ABでのワイルドカード”*”の使い方が悪いのでしょうか。
RemoveDirectory のパス指定のところに、
テキスト ファイルのパスが入力されているのが原因です。
RemoveDirectory のパス指定には、
ディレクトリのフルパスを入力してください。
Posted: 2006年9月29日(金) 19:18
by C1000
ちなみに、ファイルの削除にはKill命令語を使います。
コード: 全て選択
Kill "C:\test\*.txt"
”*.txt”はフォルダです。
Posted: 2006年9月29日(金) 19:26
by ジョン
ご回答ありがとうございます。
実は”*.txt”はフォルダのことです。
単数のフォルダは削除できますが、
複数のフォルダの削除ができません。
そこで考えたのが、昔コマンドでよく使った”*”を
活かして、空のフォルダすべてを削除できればと思い
ご意見頂ければ、という事です。
Re: ”*.txt”はフォルダです。
Posted: 2006年9月29日(金) 20:59
by 7
> 実は”*.txt”はフォルダのことです。
???
> 単数のフォルダは削除できますが、
> 複数のフォルダの削除ができません。
複数のフォルダを削除したい場合、自分の考えですが、FindFirstFile()からFindNextFile()関数へ続き、グルグル回してフォルダを特定、特定する度に何らかの条件に当てはまるフォルダを削除、という形で行おうと思います。
よく覚えていないのですけど、中身のあるフォルダの削除は、RemoveDirectory()関数が失敗した場合に削除しようとしたフォルダの中身をFindFirstFile()からFindNextFile()関数へと続けてグルグル、ファイルを発見する度に削除、フォルダの中身が無くなった所で、再度フォルダを削除する、といったようにしていたような...。
ちなみに、フォルダの中にはフォルダがある場合も勿論あるので再起処理してたと思います。
Re: ”*.txt”はフォルダです。
Posted: 2006年9月29日(金) 22:23
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")
Posted: 2006年10月01日(日) 00:41
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で動くかどうか分かりません。
Posted: 2006年10月01日(日) 10:34
by イグトランス
NT系だとdeltreeはrd /sになります。
しかも内部コマンドのはずですから実質的にはcmd /c rd /sとなります。
もっともこれではコマンドプロンプトが表示されるのが見っともないですが。
その対策をするくらいならSHFileOperationを使う方が良いと思います。
Posted: 2006年10月01日(日) 16:51
by 時代の潜水士
すみません。
ShellExecute (NULL,NULL,"DelTree","/Y C:\Windows\デスクトップ\Kiete",NULL,SW_HIDE)
に関してなのですが、*を使え簡単で良いと思ったものの
DelTreeもフルパスが好ましいという以外に問題があるようです。
上記を実行した後にCtrl+Alt+Deleteキーを押して見ると
Winoldap
が実行する毎に増えている様なのですが何なのでしょうか?
これを回避する方法はないものかと思ったもののイグトランス (egtra)さんの
書き込みを読むと今後使えそうに無いのでまぁいいかな。
試してみたらWindows 95でもRD [ドライブ:]パスがあるんですね。
Posted: 2006年10月01日(日) 20:16
by イグトランス
Windows 9xのRD(そしてNT系で/sを指定しなかったとき)はRemoveDirectory関数と同じく空のフォルダしか削除できなかったはずです。
Posted: 2006年10月02日(月) 09:14
by ジョン
皆さんありがとうございます。
hiraさんのコードが理想通りに”*”が使えました。
考えると、DeleteFileが有るのならDeleteDirectoryがあっても
いいですよね。