■お題
指定されたフォルダ以下のゴミ掃除(問題出典:どう書く?org)
- 問題詳細 -
指定されたフォルダ以下のゴミ掃除(問題出典:どう書く?org)
- 問題詳細 -
指定したフォルダ以下にある、ファイル名が"~"で終わるファイルを削除するプログラムを作ってください。 指定したフォルダの中にあるフォルダのさらに中にあるファイルも削除の対象です
■解答例
まずは、指定したフォルダ以下の全てをフォルダを調べる必要がありますね。
それに関しては、以前SampleCodeで「指定したフォルダ配下の全てのフォルダを調べる」で書いたのでそれをそっくり使いましょう。フォルダの走査については、上記リンクを参照してください。
上記で書いたものは、GetAllFolderPathという関数に対し、あるフォルダのパスを引数に渡すと返り値として配列が帰ってきて、各要素のフォルダのフルパスが格納されています。よって、フルパスがわかるとこまでは何もしなくてよいので、今度は各フォルダがわかったとこで、その中に入っているフォルダが何か?またファイル名がチルダ(~)で終わっている時削除する関数を書いてみます。
2行目:ファイルシステムオブジェクトを生成
3行目:Folder型、Files型、File型のオブジェクトの変数を宣言
4行目:引数で受け取るフォルダのフルパスをもとにGetFolderでフォルダの情報を取得
5行目:Folder内のファイルの情報を取得
7行目:For Each文でファイルを一つ一つ処理する。
8行目:ファイルの名前の長さとファイル名のチルダの位置(後ろから検索InStrRev)が一致するか判定
9行目:Kill関数にファイルパスを指定して削除する
11行目:繰り返し
これと、フォルダの走査と組み合わせた全コードは下記の通り。
5行目:フォルダ名を指定してますね。
6行目:GetAllFolderPath関数にフォルダパスを渡し、配列で配下のフォルダパスを受け取る。
9行目:5行目で受け取ったフォルダパスの配列をForEachで展開。
10行目:先程作ったDellFile関数にフォルダパスを渡し、その先で該当するファイルを削除する。
以上。
まずは、指定したフォルダ以下の全てをフォルダを調べる必要がありますね。
それに関しては、以前SampleCodeで「指定したフォルダ配下の全てのフォルダを調べる」で書いたのでそれをそっくり使いましょう。フォルダの走査については、上記リンクを参照してください。
上記で書いたものは、GetAllFolderPathという関数に対し、あるフォルダのパスを引数に渡すと返り値として配列が帰ってきて、各要素のフォルダのフルパスが格納されています。よって、フルパスがわかるとこまでは何もしなくてよいので、今度は各フォルダがわかったとこで、その中に入っているフォルダが何か?またファイル名がチルダ(~)で終わっている時削除する関数を書いてみます。
Sub DellFile(ByVal f As String)
Dim FSO As New FileSystemObject
Dim Folder As Folder, Files As Files, File As File
Set Folder = FSO.GetFolder(f)
Set Files = Folder.Files
For Each File In Files
If Len(File.Name) = InStrRev(File.Name, "~") Then
Kill Pathname:=f & "\" & File.Name
End If
Next
End Sub
2行目:ファイルシステムオブジェクトを生成
3行目:Folder型、Files型、File型のオブジェクトの変数を宣言
4行目:引数で受け取るフォルダのフルパスをもとにGetFolderでフォルダの情報を取得
5行目:Folder内のファイルの情報を取得
7行目:For Each文でファイルを一つ一つ処理する。
8行目:ファイルの名前の長さとファイル名のチルダの位置(後ろから検索InStrRev)が一致するか判定
9行目:Kill関数にファイルパスを指定して削除する
11行目:繰り返し
これと、フォルダの走査と組み合わせた全コードは下記の通り。
Option Explicit
Sub main()
Dim FolderName As String, Result() As String
FolderName = "C:\test"
Result = GetAllFolderPath(FolderName)
Dim f As Variant
For Each f In Result
DellFile (f)
Next
End Sub
Sub DellFile(ByVal f As String)
Dim FSO As New FileSystemObject
Dim Folder As Folder, Files As Files, File As File
Set Folder = FSO.GetFolder(f)
Set Files = Folder.Files
Dim position As Integer
For Each File In Files
If Len(File.Name) = InStrRev(File.Name, "~") Then
Kill Pathname:=f & "\" & File.Name
End If
Next
End Sub
Function GetAllFolderPath(ByVal FolderName As String)
Dim FolderPathList() As String, LastIndex As Integer
LastIndex = -1
Call GetFolderPath(FolderName, FolderPathList, LastIndex)
If LastIndex = -1 Then
GetAllFolderPath = Array("")
Exit Function
End If
Dim i As Integer
i = 0
Do
Call GetFolderPath(FolderPathList(i), FolderPathList, LastIndex)
i = i + 1
Loop While i < LastIndex
GetAllFolderPath = FolderPathList
End Function
Sub GetFolderPath(ByVal FolderName As String, ByRef FolderPathList As Variant, ByRef LastIndex As Integer)
Dim FSO As New FileSystemObject
Dim Folders As Folders, Folder As Folder
Set Folders = FSO.GetFolder(FolderName).SubFolders
For Each Folder In Folders
LastIndex = LastIndex + 1
If LastIndex = 0 Then
ReDim FolderPathList(LastIndex)
Else
ReDim Preserve FolderPathList(LastIndex)
End If
FolderPathList(LastIndex) = Folder.Path
Next
End Sub
上記関数を使う部分を簡単めも5行目:フォルダ名を指定してますね。
6行目:GetAllFolderPath関数にフォルダパスを渡し、配列で配下のフォルダパスを受け取る。
9行目:5行目で受け取ったフォルダパスの配列をForEachで展開。
10行目:先程作ったDellFile関数にフォルダパスを渡し、その先で該当するファイルを削除する。
以上。
0 件のコメント:
コメントを投稿