Naming a File(파일명 붙이기)
DOS를 지원하는 FAT 파일 시스템에서 사용하는 파일명은 Filename.txt와 같이 8.3 파일명 명명 규칙을 사용하였습니다. 하지만 NTFS에서는 파일명을 255자 까지 입력할 수가 있습니다. 255 자에는 ‘ .’ 과 ‘txt와 같은 확장자’와 Unicode 문자 등을 포함합니다. 예를 들어 ‘이것은 파일명 …. .txt’ 라고 한글로 255자까지의 파일명을 만들 수가 있습니다.
[ 파일명 붙이기]
사용 가능한 파일명의 예는 다음과 같습니다. 예) Filename, LongLongFileName.txt, Long.Long.File.Name.Text, This is a file having long file name, This Kind of symbol §¨©ªµ·¡Q.txt, 12345678901234567890,
하지만, 파일명 시작을 ‘.’ 으로 시작하는 경우 파일명을 UI에서 입력할 수가 없습니다. 하지만 파일명으로는 사용 가능합니다. ‘< > : " / \ | ? *’ 문자가 섞일 경우에는 파일명으로 사용할 수가 없습니다. 예를 들어 ‘.’ 으로 파일명을 시작할 경우 파일명의 타입을 입력하는 메시지가 나타나게 됩니다.
아래와 같이 파일명을 입력한 후 Enter 키를 입력합니다.
그러면, 아래와 같이 파일명을 입력하라는 메시지가 나옵니다.
하지만 CreateFile 과 같은 함수를 사용하거나 명령창에서 ren 과 같은 명령어를 사용하면 이러한 이름을 가진 파일을 생성할 수 있으며 변경할 수 있습니다.
[ 최대 파일명 길이]
그러면 최대로 길게 몇 글자까지 파일명을 입력할 수 있을까요? D:\Temp\Filename 폴더 아래에‘.txt’ 라는 확장자로 파일이름으로서는 최대 242 글자까지 입력할 수 있습니다. 아래 그림을 보면 이해할 수 있을 것입니다. 그러면 255자까지 입력할 수 있다는 것은 어떻게 된 것일까요? 계산해 보면 다음과 같습니다. 입력 가능 글자수 (246자) = 최대 파일명(242자) + Dot ( ‘.’ 1자) + 확장자(3자). 하지만 D:\ 에 파일을 생성해 보면 정확히 255자까지 입력되는 것을 확인할 수가 있습니다. 주의할 것은 이렇게 최대 크기로 생성된 파일들은 하위 폴더 또는 다른 드라이브의 폴더로 이동이 어렵거나 복사를 할 수가 없을 수도 있습니다. 이와 같은 작업을 많이 사용하는 Backup 프로그램 또는 CD/DVD에 데이터를 기록하는 프로그램의 경우 이런 파일들은 이름을 변경하도록 요청할 받을 수도 있습니다.
이렇게 위치마다 가질 수 있는 파일명의 길이가 다른 이유는 Windows API 에서 한 개의 파일 경로의 최대 길이를 MAX_PATH로 정해 놓았는데 최대 크기가 260자입니다. 따라서 D:\ 드라이브에서 가질 수 있는 최대 크기는 “D:\<256 문자열><NULL>이라고 할 수가 있습니다. 여기서 NULL은 문자열이라는 것을 알려주는 현재 시스템 코드 페이지에서 Terminating Null Character 입니다. 그리고 <>는 범위를 나타냅니다.
그리고 Windows API에는 최대 32,767 글자까지 지원할 수 있도록 하는 Unicode 버전을 위한 많은 함수 들이 있습니다. 이런 확장 문자를 사용하기 위해서는 반드시 “\\?\” 를 경로 앞에 붙여야 합니다. 예를 들면 \\?\D:\<긴 경로명> 과 같이 사용하면 됩니다. “\\?\”는 UNC와 함께 사용하여도 됩니다. 예를 들면, \\?\UNC\Server\share 와 같이 사용할 수가 있습니다.
이 파일명이 디렉토리명일 경우 좀 상황은 달라집니다. 디렉토리명의 경우 MAX_PATH – 12 의 길이를 초과하여 입력할 수가 없습니다. 만일 긴 디렉토리명이 있는 경우 하위 파일명은 그 길이가 더 짧아질 수 밖에 없습니다.
[ 긴 이름과 짧은 이름]
파일명을 생성할 때 실제 파일명은 MFT 레코드에 기록이 됩니다. 이 레코드에는 MS-DOS 파일명을 위한 공간이 있습니다. 이 MFT File Record에 파일이 생성될 때 자동으로 MS-DOS 파일명이 생성되게 됩니다. NTFS 파일명과 자동 생성된 MS-DOS 명은 같은 파일 안에 있는 레코드에 기록이 되는 것입니다. MS-DOS 파일명 Attribute를 가진 MFT File Record는 아래와 같습니다.
Standard Information |
NTFS filename |
MS-DOS Filename |
Data |
생성된 MS-DOS 파일명은 파일을 열고, 읽고, 쓰고 복사하는데 사용할 수 있습니다. 만일 사용자가 긴 파일명과 짧은 파일명 모두를 사용하는 파일의 이름을 변경하였을 경우 현재 이름 모두를 변경합니다. 새로운 이름이 유효한 MS-DOS 명이 아닐 경우, NTFS는 파일에 대해 새로운 MS-DOS 명을 생성하게 됩니다. 명령창을 사용하여 현재 생성된 파일들의 짧은 파일명(8.3)을 확인할 수가 있습니다. Dir 명령과 /x 스위치를 사용하면 아래 그림과 같이 볼 수가 있습니다. 가운데 .filename 이라는 파일명을 FILENA~1 로 변경된 것을 알 수가 있습니다.
NTFS가 MS-DOS 명을 긴 파일명에서 짧은 파일명으로 바꾸는 알고리즘은 아래와 같습니다.
1. MS-DOS 파일명에서 사용할 수 없는 글자인 빈 공백, Unicode 문자, 등을 긴 이름에서 제거합니다. 그리고 파일 이름과 확장자를 구분하는 Period(‘.’)를 맨 앞에 있는 것과 글자 뒤에 붙어 있는 경우 제거합니다. 그리고 Period(‘.’) 가 문자열 중간에 들어 있는 경우 마지막 1개만 남기고 제거합니다.
2. Period(‘.’) 앞에 문자열을 맨 처음부터 6자만 남기고 나머지는 잘라내 버립니다. 그리고 맨 끝에 “~n” 을 붙입니다. 숫자 n은 일련 번호를 나타내고 1부터 시작합니다. 그리고 같은 이름이 있는 경우 2,3,4와 같이 증가하게 됩니다. Period(‘.’) 이후에 있는 확장자 글자 중에서 앞에 3자만 남기고 나머지 글자는 잘라내 버립니다.
3. 이렇게 생성된 문자열을 모두 대문자로 변경합니다. MS-DOS는 대소문자를 구분하지 않습니다.
4. 생성된 파일명을 한 폴더에 복사할 경우에는 ~n 에서 숫자를 증가시킵니다. 이렇게 해도 중복될 경우 아래와 같이 처음 2개의 문자만 남기고 나머지는 정해진 알고리즘에 따라 임의의 수를 생성하여 파일명을 만듭니다.
[ 주의 사항]
간혹 긴 이름을 짧은 이름으로 바꾸는 도중 문제가 발생할 경우가 있습니다. 주로 커널 드라이버에서 변환 알고리즘 에러 또는 호환성 이슈로 인해 BugCheck이 발생하여 시스템이 멈출 수가 있습니다. 이럴 경우에는 레지스트리에서 HKLM\System\CurrentControlSet\Control\FileSystem\NtfsDisable8dot3NameCreation 값을 1로 설정하여 짧은 이름을 생성하지 못하도록 하는 것이 좋습니다.
[ 참조 경로]
File Names, Paths and Namespaces
https://msdn.microsoft.com/en-us/library/aa365247.aspx
NTFS 파티션에서 8.3 이름 만들기를 사용하지 않도록 설정하는 방법