[.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메서드를 사용했습니다.

 

많이 활용하시길...

 

+ Recent posts