コピー先に同名ファイルが存在していた場合、ファイル名を採番(ナンバリング)してコピーする方法を備忘録として残します。
やりたいこと
別のフォルダへコピー(コピー先に同名ファイルが存在しない場合は同じファイル名でコピー)
c:¥テスト.txt
→ c:¥サブフォルダ¥テスト.txt
上記のコピー後に、再度コピーした場合(同名ファイルが存在するためナンバリングでリネーム)
c:¥テスト.txt
→ c:¥サブフォルダ¥テスト (1).txt
環境
VB2019 (.Net 5.0)
Windows 10
Imports System.IO
Module Program
Sub Main()
fileCopy("D:\ソース\てすとふぁいる.txt", "D:\コピー先")
' D:\コピー先\てすとふぁいる.txt
fileCopy("D:\ソース\てすとふぁいる.txt", "D:\コピー先")
' D:\コピー先\てすとふぁいる (1).txt
fileCopy("D:\ソース\てすとふぁいる.txt", "D:\コピー先")
' D:\コピー先\てすとふぁいる (2).txt
End Sub
''' <summary>
''' ファイルコピー(同名が存在する場合は採番)
''' </summary>
''' <param name="inSource">コピー元のフルパス</param>
''' <param name="inCopyPath">コピー先パス</param>
Private Sub fileCopy(ByVal inSource As String, ByVal inCopyPath As String)
Try
Dim wkExt As String = System.IO.Path.GetExtension(inSource)
Dim wkFile As String = System.IO.Path.GetFileNameWithoutExtension(inSource)
Dim wkPath As String = System.IO.Path.GetFullPath(inCopyPath)
' 同名ファイルが存在する時は、ナンバリングしたファイル名で存在チェック
Dim i As Integer = 0
While System.IO.File.Exists(wkPath & "\" & wkFile & numStr(i) & wkExt)
i += 1
End While
' ファイルコピー
System.IO.File.Copy(inSource, wkPath & "\" & wkFile & numStr(i) & wkExt, True)
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
End Sub
''' <summary>
''' ナンバリング
''' </summary>
''' <param name="inNum">採番</param>
''' <returns></returns>
Private Function numStr(ByVal inNum As Integer) As String
Return If(inNum = 0, "", " (" & inNum & ")")
End Function
End Module