[.NET] 파일 이름 변경, 복사할 때 동일한 파일이 있으면 자동으로 넘버링 해 주기.
윈도우 탐색기에서 파일 복사하기. 많이 쓰이는 기능입니다.
윈도우 탐색기 파일 복사의 특징 중 하나는 동일한 파일을 동일한 위치에 복사&붙여넣기를 계속 시도하면
"파일명 - 복사본"
"파일명 - 복사본 - 복사본"
"파일명 - 복사본 - 복사본 - 복사본"
이와 같이 자동으로 " - 복사본" 이라는 명칭을 덧붙여 새로운 사본을 생성시킨다는 것을 알고 계시죠.
폴더의 경우, '새 폴더' - '새 폴더(1)' - '새 폴더(2)' - '새 폴더(3)' 과 같이 순차적으로 번호매김을 해 줍니다.
이것과 유사한 기능을 하는 함수입니다.
닷넷에서 임의로 디스크의 파일을 복사하거나 이동하거나 이름바꾸기를 할 때 해당 파일의 존재 여부를 확인하고 자동으로 적절한 넘버링을 붙여주는 함수입니다.
VB.NET 코드 :
Public Shared Sub RenameFileExt(srcFileNM As String, ByRef tgtFileNM As String) Dim count As Integer = 1 Dim FileNameOnly As String = System.IO.Path.GetFileNameWithoutExtension(tgtFileNM) Dim Extension As String = System.IO.Path.GetExtension(tgtFileNM) Dim path As String = System.IO.Path.GetDirectoryName(tgtFileNM) Dim newFullPath As String = tgtFileNM While File.Exists(newFullPath) count += 1 Dim tmpFileNM As String = String.Format("{0} ({1})", FileNameOnly, count) newFullPath = System.IO.Path.Combine(path, tmpFileNM + Extension) End While Try File.Move(srcFileNM, newFullPath) tgtFileNM = newFullPath Catch ex As Exception End Try End Sub
C#.NET 코드 :
public static void RenameFileExt(string srcFileNM, ref string tgtFileNM) { int count = 1; string FileNameOnly = System.IO.Path.GetFileNameWithoutExtension(tgtFileNM); string Extension = System.IO.Path.GetExtension(tgtFileNM); string path = System.IO.Path.GetDirectoryName(tgtFileNM); string newFullPath = tgtFileNM; while (File.Exists(newFullPath)) { string tmpFileNM = string.Format("{0} ({1})", FileNameOnly, count++); newFullPath = System.IO.Path.Combine(path, tmpFileNM + Extension); } try { File.Move(srcFileNM, newFullPath); tgtFileNM = newFullPath; } catch (Exception ex) { } }
인수로 주어지는 타겟파일명을 ByRef로 한 이유는, 함수 내부에서 타겟파일명이 변경될 수 있기 때문입니다.
RenameFileExt("C:\111.txt", "C:\111.txt") 라고 넣는다면, 소스와 타겟이 동일하므로
C:\111 (1).txt 라는 파일로 타겟파일명을 바꿔주게 되겠죠. 이 최종 파일명 정보를 리턴하는 것입니다.
File.Copy 메서드로 바꿔서 사용하면 윈도우 탐색기의 복사 기능과 비슷한 로직으로 사본을 생성하게 됩니다.
저는 Rename을 위해 File.Move메서드를 사용했습니다.
많이 활용하시길...
'.NET Develop > Develop' 카테고리의 다른 글
[vb.NET] Tab 파일을 XLSX로 변환 (1) | 2013.09.30 |
---|---|
[.Net] Datatable을 Access에 Insert하는 방법. (Bulk Insert) (1) | 2013.09.04 |
[.net] ADO (6.0) + ODBC드라이버를 이용한 DB Connection (MS-SQL, Excel, Access) (0) | 2013.07.04 |
[.NET] 디렉토리의 파일 목록 조사 + 필터링. Linq와 람다식을 이용한 Directory.GetFiles 확장자 지정하기. (0) | 2013.04.04 |
[.NET] 시스템 환경변수 Path에 특정 경로 추가하기. (1) | 2013.02.21 |