ヘッダー
Visual Basic サンプル集
VB.NET2002対応 VB.NET2003対応 VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

ファイルを複数削除する

2020/9/13

→ C# のサンプルに切り替える

 

フォルダー内のファイルをすべて削除する

この例ではサブフォルダー内のファイルは削除しません。

VB.NET2003対応 VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

Dim folderFrom As String = "C:\FileTest\FolderA" '削除するファイルがあるフォルダー

'For Each pathFrom As String In IO.Directory.GetFiles(folderFrom) '←Visual Basic 2008以前の場合
For Each pathFrom As String In IO.Directory.EnumerateFiles(folderFrom)
    '1ファイルの削除実行。
    Debug.WriteLine("削除 " & pathFrom)
    IO.File.Delete(pathFrom)
Next

Debug.WriteLineが表示される場所

  • ファイルはゴミ箱に入らず、永久に削除されます。

 

 

フォルダー内のファイルをサブフォルダーも含んですべて削除する

この例はサブフォルダー(子フォルダー)内にあるファイルもすべて削除します。

VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

Dim folderFrom As String = "C:\FileTest\FolderA" '削除するファイルがあるフォルダー

'For Each pathFrom As String In IO.Directory.GetFiles(folderFrom, "*", SearchOption.AllDirectories) '←Visual Basic 2008以前の場合
For Each pathFrom As String In IO.Directory.EnumerateFiles(folderFrom, "*", SearchOption.AllDirectories)
    '1ファイルの削除実行。
    Debug.WriteLine("削除 " & pathFrom)
    IO.File.Delete(pathFrom)
Next

Debug.WriteLineが表示される場所

  • ファイルはゴミ箱に入らず、永久に削除されます。
  • シンボリックリンクなどで上位のフォルダーがリンクされている場合など、この処理は無限ループになります。
  • フォルダーは削除しません。フォルダーも削除したい場合は、フォルダーを削除する例を参照してください。

 

 

フォルダー内の拡張子が csv のファイルをすべて削除する

GetFilesメソッドの第2引数で、対象のファイルを選択するワイルドカードを指定できます。この例では *.csv を指定して csv ファイルだけを対象にしています。

この例ではサブフォルダー内のファイルは削除しません。

VB.NET2003対応 VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

Dim folderFrom As String = "C:\FileTest\FolderA" '削除するファイルがあるフォルダー

'For Each pathFrom As String In IO.Directory.GetFiles(folderFrom, "*.csv") '←Visual Basic 2008以前の場合
For Each pathFrom As String In IO.Directory.EnumerateFiles(folderFrom, "*.csv")
    '1ファイルの削除実行。
    Debug.WriteLine("削除 " & pathFrom)
    IO.File.Delete(pathFrom)
Next

Debug.WriteLineが表示される場所

  • ファイルはゴミ箱に入らず、永久に削除されます。
  • サブフォルダー(子フォルダー)は対象外です。

 

 

フォルダー内の拡張子が csv のファイルをサブフォルダーも含んですべて削除する

この例は、サブフォルダー(子フォルダー)内にあるファイルもすべて対象にします。

VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

Dim folderFrom As String = "C:\FileTest\FolderA" '削除するファイルがあるフォルダー

'For Each pathFrom As String In IO.Directory.GetFiles(folderFrom, "*.csv", SearchOption.AllDirectories) '←Visual Basic 2008以前の場合
For Each pathFrom As String In IO.Directory.EnumerateFiles(folderFrom, "*.csv", SearchOption.AllDirectories)
    '1ファイルの削除実行。
    Debug.WriteLine("削除 " & pathFrom)
    IO.File.Delete(pathFrom)
Next

Debug.WriteLineが表示される場所

  • ファイルはゴミ箱に入らず、永久に削除されます。
  • シンボリックリンクなどで上位のフォルダーがリンクされている場合など、この処理は無限ループになります。
  • フォルダーは削除しません。フォルダーも削除したい場合は、フォルダーを削除する例を参照してください。

 

 

フォルダー内の拡張子が csv のファイルをゴミ箱に入れる

この例ではサブフォルダー内のファイルはゴミ箱に入れません。

VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

Dim folderFrom As String = "C:\FileTest\FolderA" '削除するファイルがあるフォルダー

'For Each pathFrom As String In IO.Directory.GetFiles(folderFrom, "*.csv") '←Visual Basic 2008以前の場合
For Each pathFrom As String In IO.Directory.EnumerateFiles(folderFrom, "*.csv")
    '1ファイルの削除実行。
    Debug.WriteLine("削除 " & pathFrom)
    FileIO.FileSystem.DeleteFile(pathFrom, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin)
Next

Debug.WriteLineが表示される場所

  • Windowsでのみ実行できます。

 

これでもできます。

この例でもサブフォルダー内のファイルはゴミ箱に入れません。

この例を実行するにはファイルの先頭の方に Imports System.Runtime.InteropServices が必要です。

VB.NET2002対応 VB.NET2003対応 VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

Public Sub DeleteTest()

    Dim sf As New NativeMethods.SHFILEOPSTRUCT

    sf.wFunc = NativeMethods.FileFuncFlags.FO_DELETE '削除を指示します。
    sf.fFlags = NativeMethods.FILEOP_FLAGS.FOF_ALLOWUNDO '「元に戻す」を有効にします。
    sf.fFlags = sf.fFlags Or NativeMethods.FILEOP_FLAGS.FOF_NOERRORUI 'エラー画面を表示しません。
    sf.fFlags = sf.fFlags Or NativeMethods.FILEOP_FLAGS.FOF_SILENT '進捗ダイアログを表示しません。
    sf.fFlags = sf.fFlags Or NativeMethods.FILEOP_FLAGS.FOF_NOCONFIRMATION '削除確認ダイアログを表示しません。
    sf.pFrom = "C:\FileTest\FolderA\*.csv" & vbNullChar

    Dim result As Integer
    result = NativeMethods.SHFileOperation(sf)

    If result = 0 Then
        Debug.WriteLine("成功")
    Else
        Debug.WriteLine("失敗。" & result)
    End If

End Sub

Public Class NativeMethods

    ''' <summary>
    ''' ファイルをコピー・移動・削除・名前変更します。
    ''' </summary>
    ''' <param name="lpFileOp"></param>
    ''' <returns>正常時0。異常時の値の意味は https://docs.microsoft.com/ja-jp/windows/win32/api/shellapi/nf-shellapi-shfileoperationa を参照。</returns>
    <DllImport("shell32.dll", SetLastError:=True, CharSet:=CharSet.Unicode)>
    Public Shared Function SHFileOperation(<MarshalAs(UnmanagedType.Struct)> ByRef lpFileOp As SHFILEOPSTRUCT) As Integer
    End Function

    <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
    Public Structure SHFILEOPSTRUCT
        Public hwnd As IntPtr
        <MarshalAs(UnmanagedType.U4)> Public wFunc As FileFuncFlags
        <MarshalAs(UnmanagedType.LPWStr)> Public pFrom As String
        <MarshalAs(UnmanagedType.LPWStr)> Public pTo As String
        <MarshalAs(UnmanagedType.U2)> Public fFlags As FILEOP_FLAGS
        <MarshalAs(UnmanagedType.Bool)> Public ffAnyOperationsAborted As Boolean
        Public hNameMappings As IntPtr 'FOF_WANTMAPPINGHANDLEフラグとともに使用します。
        <MarshalAs(UnmanagedType.LPWStr)> Public lplpszProgressTitle As String 'FOF_SIMPLEPROGRESSフラグとともに使用します。
    End Structure

    Public Enum FileFuncFlags
        ''' <summary>pFrom から pTo にファイルを移動します。</summary>
        FO_MOVE = &H1
        ''' <summary>pFrom から pTo にファイルをコピーします。</summary>
        FO_COPY = &H2
        ''' <summary>pFrom からファイルを削除します。</summary>
        FO_DELETE = &H3
        ''' <summary>pFrom のファイルの名前を変更します。複数ファイルを対象とする場合は FO_MOVE を使用します。</summary>
        FO_RENAME = &H4
    End Enum

    <Flags>
    Public Enum FILEOP_FLAGS As Short
        ''' <summary>pToにはpFromに1対1で対応する複数のコピー先を指定します。</summary>
        FOF_MULTIDESTFILES = &H1
        ''' <summary>このフラグは使用しません。</summary>
        FOF_CONFIRMMOUSE = &H2
        ''' <summary>進捗状況のダイアログを表示しません。</summary>
        FOF_SILENT = &H4
        ''' <summary>同名のファイルが既に存在する場合、新しい名前を付けます。</summary>
        FOF_RENAMEONCOLLISION = &H8
        ''' <summary>確認ダイアログを表示せず、すべて「はい」を選択したものとします。</summary>
        FOF_NOCONFIRMATION = &H10
        ''' <summary>FOF_RENAMEONCOLLISIONフラグによるファイル名の衝突回避が発生した場合、SHFILEOPSTRUCT.hNameMappingsに新旧ファイル名の情報を格納します。この情報はSHFreeNameMappingsを使って開放する必要があります。</summary>
        FOF_WANTMAPPINGHANDLE = &H20
        ''' <summary>可能であれば、操作を元に戻せるようにします。</summary>
        FOF_ALLOWUNDO = &H40
        ''' <summary>ワイルドカードが使用された場合、ファイルのみを対象とします。</summary>
        FOF_FILESONLY = &H80
        ''' <summary>進捗状況のダイアログを表示しますが、個々のファイル名は表示しません。</summary>
        FOF_SIMPLEPROGRESS = &H100
        ''' <summary>新しいフォルダーの作成する前にユーザーに確認しません。</summary>
        FOF_NOCONFIRMMKDIR = &H200
        ''' <summary>エラーが発生してもダイアログを表示しません。</summary>
        FOF_NOERRORUI = &H400
        ''' <summary>ファイルのセキュリティ属性はコピーしません。コピー後のファイルはコピー先のフォルダーのセキュリティ属性を引き継ぎます。</summary>
        FOF_NOCOPYSECURITYATTRIBS = &H800
        ''' <summary>サブディレクトリーを再帰的に処理しません。これは既定の動作です。</summary>
        FOF_NORECURSION = &H1000
        ''' <summary>グループとして連結しているファイルは移動しません。指定されたファイルだけを移動します。</summary>
        FOF_NO_CONNECTED_ELEMENTS = &H2000
        ''' <summary>ファイルが恒久的に削除される場合、警告を表示します。このフラグはFOF_NOCONFIRMATIONより優先されます。 </summary>
        FOF_WANTNUKEWARNING = &H4000
        ''' <summary>UIを表示しません。</summary>
        FOF_NO_UI = FOF_SILENT Or FOF_NOCONFIRMATION Or FOF_NOERRORUI Or FOF_NOCONFIRMMKDIR

    End Enum

End Class
  • Windowsでのみ実行できます。(.NET Framework , .NET Core, .Net 5以降すべてで実行できます。)
  • このサンプルで使用している NativeMethods クラスは他のサンプルで使用しているものと完全に同じです。

 

 

フォルダー内のサブフォルダーも含んで全ファイルをダイアログを表示しながら削除する

SHFileOperationを擬似的に再帰的に(Recursive)実行することで、サブフォルダーも含んだ処理で進捗ダイアログを表示します。

何事もなくすぐに削除が終わる場合はダイアログが表示されません。

この例を実行するにはファイルの先頭の方に Imports System.Runtime.InteropServices が必要です。

VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

Public Sub DeleteTest()

    Dim folderFrom As String = "C:\FileTest\FolderA" '削除するファイルがあるフォルダー
    Dim filePattern As String = "*" '*.csvなどにして csvファイルだけを対象にしたりもできます。

    Dim sf As New NativeMethods.SHFILEOPSTRUCT

    sf.wFunc = NativeMethods.FileFuncFlags.FO_DELETE '削除を指示します。
    sf.fFlags = NativeMethods.FILEOP_FLAGS.FOF_MULTIDESTFILES
    sf.fFlags = sf.fFlags Or NativeMethods.FILEOP_FLAGS.FOF_FILESONLY 'ファイルのみを対象にします。
    'sf.fFlags = sf.fFlags Or NativeMethods.FILEOP_FLAGS.FOF_ALLOWUNDO 'この行を有効にすると、ファイルはゴミ箱に入ります。
    sf.fFlags = sf.fFlags Or NativeMethods.FILEOP_FLAGS.FOF_NOCONFIRMATION '確認ダイアログを表示しません。

    Dim foldersFrom As New List(Of String)
    foldersFrom.Add(folderFrom & "\" & filePattern)

    For Each fileName In IO.Directory.GetFiles(folderFrom, filePattern, System.IO.SearchOption.AllDirectories)

        Dim folder As String = IO.Path.GetDirectoryName(fileName)
        If foldersFrom.Contains(folder & "\" & filePattern) Then
            Continue For
        End If

        foldersFrom.Add(folder & "\" & filePattern)
    Next

    sf.pFrom = String.Join(vbNullChar, foldersFrom) & vbNullChar

    Dim result As Integer
    result = NativeMethods.SHFileOperation(sf)

    If result = 0 Then
        Debug.WriteLine("成功")
    Else
        Debug.WriteLine("失敗。" & result)
    End If

End Sub

Public Class NativeMethods

    ''' <summary>
    ''' ファイルをコピー・移動・削除・名前変更します。
    ''' </summary>
    ''' <param name="lpFileOp"></param>
    ''' <returns>正常時0。異常時の値の意味は https://docs.microsoft.com/ja-jp/windows/win32/api/shellapi/nf-shellapi-shfileoperationa を参照。</returns>
    <DllImport("shell32.dll", SetLastError:=True, CharSet:=CharSet.Unicode)>
    Public Shared Function SHFileOperation(<MarshalAs(UnmanagedType.Struct)> ByRef lpFileOp As SHFILEOPSTRUCT) As Integer
    End Function

    <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
    Public Structure SHFILEOPSTRUCT
        Public hwnd As IntPtr
        <MarshalAs(UnmanagedType.U4)> Public wFunc As FileFuncFlags
        <MarshalAs(UnmanagedType.LPWStr)> Public pFrom As String
        <MarshalAs(UnmanagedType.LPWStr)> Public pTo As String
        <MarshalAs(UnmanagedType.U2)> Public fFlags As FILEOP_FLAGS
        <MarshalAs(UnmanagedType.Bool)> Public ffAnyOperationsAborted As Boolean
        Public hNameMappings As IntPtr 'FOF_WANTMAPPINGHANDLEフラグとともに使用します。
        <MarshalAs(UnmanagedType.LPWStr)> Public lplpszProgressTitle As String 'FOF_SIMPLEPROGRESSフラグとともに使用します。
    End Structure

    Public Enum FileFuncFlags
        ''' <summary>pFrom から pTo にファイルを移動します。</summary>
        FO_MOVE = &H1
        ''' <summary>pFrom から pTo にファイルをコピーします。</summary>
        FO_COPY = &H2
        ''' <summary>pFrom からファイルを削除します。</summary>
        FO_DELETE = &H3
        ''' <summary>pFrom のファイルの名前を変更します。複数ファイルを対象とする場合は FO_MOVE を使用します。</summary>
        FO_RENAME = &H4
    End Enum

    <Flags>
    Public Enum FILEOP_FLAGS As Short
        ''' <summary>pToにはpFromに1対1で対応する複数のコピー先を指定します。</summary>
        FOF_MULTIDESTFILES = &H1
        ''' <summary>このフラグは使用しません。</summary>
        FOF_CONFIRMMOUSE = &H2
        ''' <summary>進捗状況のダイアログを表示しません。</summary>
        FOF_SILENT = &H4
        ''' <summary>同名のファイルが既に存在する場合、新しい名前を付けます。</summary>
        FOF_RENAMEONCOLLISION = &H8
        ''' <summary>確認ダイアログを表示せず、すべて「はい」を選択したものとします。</summary>
        FOF_NOCONFIRMATION = &H10
        ''' <summary>FOF_RENAMEONCOLLISIONフラグによるファイル名の衝突回避が発生した場合、SHFILEOPSTRUCT.hNameMappingsに新旧ファイル名の情報を格納します。この情報はSHFreeNameMappingsを使って開放する必要があります。</summary>
        FOF_WANTMAPPINGHANDLE = &H20
        ''' <summary>可能であれば、操作を元に戻せるようにします。</summary>
        FOF_ALLOWUNDO = &H40
        ''' <summary>ワイルドカードが使用された場合、ファイルのみを対象とします。</summary>
        FOF_FILESONLY = &H80
        ''' <summary>進捗状況のダイアログを表示しますが、個々のファイル名は表示しません。</summary>
        FOF_SIMPLEPROGRESS = &H100
        ''' <summary>新しいフォルダーの作成する前にユーザーに確認しません。</summary>
        FOF_NOCONFIRMMKDIR = &H200
        ''' <summary>エラーが発生してもダイアログを表示しません。</summary>
        FOF_NOERRORUI = &H400
        ''' <summary>ファイルのセキュリティ属性はコピーしません。コピー後のファイルはコピー先のフォルダーのセキュリティ属性を引き継ぎます。</summary>
        FOF_NOCOPYSECURITYATTRIBS = &H800
        ''' <summary>サブディレクトリーを再帰的に処理しません。これは既定の動作です。</summary>
        FOF_NORECURSION = &H1000
        ''' <summary>グループとして連結しているファイルは移動しません。指定されたファイルだけを移動します。</summary>
        FOF_NO_CONNECTED_ELEMENTS = &H2000
        ''' <summary>ファイルが恒久的に削除される場合、警告を表示します。このフラグはFOF_NOCONFIRMATIONより優先されます。 </summary>
        FOF_WANTNUKEWARNING = &H4000
        ''' <summary>UIを表示しません。</summary>
        FOF_NO_UI = FOF_SILENT Or FOF_NOCONFIRMATION Or FOF_NOERRORUI Or FOF_NOCONFIRMMKDIR

    End Enum

End Class
  • 削除に時間がかかる場合、進捗状況のダイアログを表示します。
  • (この画像は削除ではなくコピーの画像を流用しています。)

    ファイルコピーのダイアログ

  • 何かエラーが発生した場合、エラーを表示します。
  • シンボリックリンクなどで上位のフォルダーがリンクされている場合など、この処理は無限ループになります。
  • Windowsでのみ実行できます。(.NET Framework , .NET Core, .Net 5以降すべてで実行できます。)
  • このサンプルで使用している NativeMethods クラスは他のサンプルで使用しているものと完全に同じです。

 

 

更新日付が1ヶ月以上前の古いファイルをすべて削除する

この例ではフォルダー内のファイルのうち、最終更新日が1ヶ月以上前のファイルをすべて削除します。

この例ではサブフォルダー内のファイルは削除しません。

VB.NET2003対応 VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

Dim folderFrom As String = "C:\FileTest\FolderA" '削除するファイルがあるフォルダー

'For Each pathFrom As String In IO.Directory.GetFiles(folderFrom) '←Visual Basic 2008以前の場合
For Each pathFrom As String In IO.Directory.EnumerateFiles(folderFrom)

    Dim lastTime As Date = IO.File.GetLastWriteTime(pathFrom)
    'Dim lastTime As Date = IO.File.GetCreationTime(pathFrom) 'これを有効にすると作成日付を条件にします。

    If lastTime < Now.AddMonths(-1) Then
        '1ファイルの削除実行。
        Debug.WriteLine("削除 " & pathFrom)
        IO.File.Delete(pathFrom)
    End If

Next

Debug.WriteLineが表示される場所

  • ファイルはゴミ箱に入らず、永久に削除されます。