Visual Basic サンプル集 |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Visual Basic 中学校 > Visual Basic サンプル集 > Visual Basic サンプル集目次 >
ファイルを複数コピーする
2020/7/16
フォルダー内のファイルをすべてコピーする
Dim folderFrom
As String =
"C:\FileTest\FolderA"
'コピー元のフォルダー Dim folderTo As String = "C:\FileTest\FolderB" 'コピー先のフォルダー 'For Each pathFrom As String In IO.Directory.GetFiles(folderFrom) '←Visual Basic 2008以前の場合 For Each pathFrom As String In IO.Directory.EnumerateFiles(folderFrom) 'コピー先のパスを作成 Dim pathTo As String = pathFrom.Replace(folderFrom, folderTo) 'コピー先のフォルダーが存在するか確認し、なければ作成します。 Dim targetFolder As String = IO.Path.GetDirectoryName(pathTo) If IO.Directory.Exists(targetFolder) = False Then IO.Directory.CreateDirectory(targetFolder) End If '1ファイルのコピー実行。同名のファイルがある場合上書きします。 Debug.WriteLine("コピー" & pathFrom & " → " & pathTo) IO.File.Copy(pathFrom, pathTo, True) 'こちらでコピーするとコピー先に同名のファイルがあると上書きせずエラーになります。 'IO.File.Copy(pathFrom, pathTo) Next |
- コピー先のファイルが既に存在する場合、上書きします。
- コピー先のフォルダーが存在しない場合、フォルダーを作成します。
- サブフォルダー(子フォルダー)は対象外です。
フォルダー内のファイルをサブフォルダーも含んですべてコピーする
この例は、サブフォルダー(子フォルダー)内にあるファイルもすべて対象にします。
Dim folderFrom
As String =
"C:\FileTest\FolderA"
'コピー元のフォルダー Dim folderTo As String = "C:\FileTest\FolderB" 'コピー先のフォルダー '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) 'コピー先のパスを作成 Dim pathTo As String = pathFrom.Replace(folderFrom, folderTo) 'コピー先のフォルダーが存在するか確認し、なければ作成します。 Dim targetFolder As String = IO.Path.GetDirectoryName(pathTo) If IO.Directory.Exists(targetFolder) = False Then IO.Directory.CreateDirectory(targetFolder) End If '1ファイルのコピー実行。同名のファイルがある場合上書きします。 Debug.WriteLine("コピー" & pathFrom & " → " & pathTo) IO.File.Copy(pathFrom, pathTo, True) 'こちらでコピーするとコピー先に同名のファイルがあると上書きせずエラーになります。 'IO.File.Copy(pathFrom, pathTo) Next |
- コピー先のファイルが既に存在する場合、上書きします。
- コピー先のフォルダーが存在しない場合、フォルダーを作成します。
- シンボリックリンクなどで上位のフォルダーがリンクされている場合など、この処理は無限ループになります。
フォルダー内の拡張子が csv のファイルをすべてコピーする
GetFilesメソッドの第2引数で、対象のファイルを選択するワイルドカードを指定できます。この例では *.csv を指定して csv ファイルだけを対象にしています。
Dim folderFrom
As String =
"C:\FileTest\FolderA"
'コピー元のフォルダー Dim folderTo As String = "C:\FileTest\FolderB" 'コピー先のフォルダー '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") 'コピー先のパスを作成 Dim pathTo As String = pathFrom.Replace(folderFrom, folderTo) 'コピー先のフォルダーが存在するか確認し、なければ作成します。 Dim targetFolder As String = IO.Path.GetDirectoryName(pathTo) If IO.Directory.Exists(targetFolder) = False Then IO.Directory.CreateDirectory(targetFolder) End If '1ファイルのコピー実行。同名のファイルがある場合上書きします。 Debug.WriteLine("コピー" & pathFrom & " → " & pathTo) IO.File.Copy(pathFrom, pathTo, True) 'こちらでコピーするとコピー先に同名のファイルがあると上書きせずエラーになります。 'IO.File.Copy(pathFrom, pathTo) Next |
- コピー先のファイルが既に存在する場合、上書きします。
- コピー先のフォルダーが存在しない場合、フォルダーを作成します。
- サブフォルダー(子フォルダー)は対象外です。
フォルダー内の拡張子が csv のファイルをサブフォルダーも含んですべてコピーする
この例は、サブフォルダー(子フォルダー)内にあるファイルもすべて対象にします。
Dim folderFrom
As String =
"C:\FileTest\FolderA"
'コピー元のフォルダー Dim folderTo As String = "C:\FileTest\FolderB" 'コピー先のフォルダー '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, "*.csv", SearchOption.AllDirectories) 'コピー先のパスを作成 Dim pathTo As String = pathFrom.Replace(folderFrom, folderTo) 'コピー先のフォルダーが存在するか確認し、なければ作成します。 Dim targetFolder As String = IO.Path.GetDirectoryName(pathTo) If IO.Directory.Exists(targetFolder) = False Then IO.Directory.CreateDirectory(targetFolder) End If '1ファイルのコピー実行。同名のファイルがある場合上書きします。 Debug.WriteLine("コピー" & pathFrom & " → " & pathTo) IO.File.Copy(pathFrom, pathTo, True) 'こちらでコピーするとコピー先に同名のファイルがあると上書きせずエラーになります。 'IO.File.Copy(pathFrom, pathTo) Next |
- コピー先のファイルが既に存在する場合、上書きします。
- コピー先のフォルダーが存在しない場合、フォルダーを作成します。
- シンボリックリンクなどで上位のフォルダーがリンクされている場合など、この処理は無限ループになります。
フォルダー内の拡張子が csv のファイルをダイアログを表示してコピーする
何事もなくすぐにコピーが終わる場合はダイアログが表示されません。
この例を実行するにはファイルの先頭の方に Imports System.Runtime.InteropServices が必要です。
Public Sub CopyTest() Dim sf As New NativeMethods.SHFILEOPSTRUCT sf.wFunc = NativeMethods.FileFuncFlags.FO_COPY 'コピーを指示します。 sf.pFrom = "C:\FileTest\FolderA\*.csv" & vbNullChar sf.pTo = "C:\FileTest\FolderB\" & 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つコピーする でいくつかサンプルを紹介します。
フォルダー内の拡張子が csv のファイルをサブフォルダーも含んでダイアログを表示してコピーする
SHFileOperationを擬似的に再帰的に(Recursive)実行することで、サブフォルダーも含んだ処理で進捗ダイアログを表示します。
何事もなくすぐにコピーが終わる場合はダイアログが表示されません。
この例を実行するにはファイルの先頭の方に Imports System.Runtime.InteropServices が必要です。
Public Sub CopyTest() Dim folderFrom As String = "C:\FileTest\FolderA" 'コピー元のフォルダー Dim folderTo As String = "C:\FileTest\FolderB" 'コピー先のフォルダー Dim filePattern As String = "*.csv" Dim sf As New NativeMethods.SHFILEOPSTRUCT sf.wFunc = NativeMethods.FileFuncFlags.FO_COPY 'コピーを指示します。 sf.fFlags = NativeMethods.FILEOP_FLAGS.FOF_MULTIDESTFILES sf.fFlags = sf.fFlags Or NativeMethods.FILEOP_FLAGS.FOF_NOCONFIRMATION '上書き確認ダイアログを表示せず、上書きします。 sf.fFlags = sf.fFlags Or NativeMethods.FILEOP_FLAGS.FOF_NOCONFIRMMKDIR 'フォルダー作成の確認ダイアログを表示せずフォルダーを作成します。 sf.fFlags = sf.fFlags Or NativeMethods.FILEOP_FLAGS.FOF_NOERRORUI 'エラーダイアログを表示しません。 Dim foldersFrom As New List(Of String) Dim foldersTo As New List(Of String) foldersFrom.Add(folderFrom & "\" & filePattern) foldersTo.Add(folderTo & "\") 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) foldersTo.Add(folder.Replace(folderFrom, folderTo) & "\") Next sf.pFrom = String.Join(vbNullChar, foldersFrom) & vbNullChar sf.pTo = String.Join(vbNullChar, foldersTo) & 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つコピーする でいくつかサンプルを紹介します。