질문과 답변

윈 도 우 '긴 파일이름'을 지원하는 윈도우에서의 확장자의 의미, 폴더의 의미

2010.01.16 03:17

hsk 조회:16031 추천:1

일단 저는 전문가가 아닌 평범한 Windows 유저입니다.

 

파일시스템의 구조에 대해 자세히 모르더라도

Windows를 사용하는데에 불편함이 없는 그저 평범한 사용자입니다.

 

하지만 긴파일 이름을 지원하는 윈도우에서의 확장자의 의미와 폴더의 의미를

제가 깨우친 방법을 통해 설명하고자 합니다.

전문가들께서 보신다면 전혀 전문성이 없는 내용일 수 있습니다.

 

기술자료 등에는 관심도 없을 뿐더러 읽어도 무슨 말인지 모를 것이기에

저만의 무식한 실험 방법을 통해 스스로 깨우친 내용이라는 점을 먼저 말씀드리고 싶습니다.

 

테스트환경은 윈도우7과 NTFS입니다.

다른 윈도우에서는 다른 결과가 있을 수 있다는 점 미리 말씀드립니다.

 

NTFS에 파일이름이 저장될 때

'하나의 문자'가 유니코드(2Byte 이상)으로 저장되는 점은 배제하고 설명하겠습니다.

이 글에서 제가 말하는 '파일명에서의 문자 하나'는, 1Byte라는 의미가 아닌

그저 실제로 사용자에게 보여지는 하나의 문자(여기서는 영문/숫자만 사용하겠습니다)라는 점을 미리 밝힙니다.

 

 

 

제가 설명하고자 하는 사항은 3가지입니다.

[1] NTFS 파일시스템에서 파일명과 확장자의 구조를 설명할 때, 과거의 8.3형식으로 설명하는 것의 부적절함.

 

[2] '긴 파일이름'을 지원하는 윈도우에서는 확장자를 구분짓는 .(dot)도 파일명의 일부분일 뿐이다. 

 

[3] 폴더도 파일이다.

 

 

 

[1] 긴 파일이름을 지원하는 윈도우에서의 8.3 파일명 구조의 의미

전문가가 아니기때문에 전문적인 설명은 생략하겠습니다.

 

과거 도스시절의 8.3의 고정적인 (파일명.확장자) 구조에 대해서도

파일명의 .앞쪽은 최대 8자

확장자(.뒷쪽)는 최대 3자까지 사용가능했다는 점만 알 뿐이지

디스크에 내부적으로 어떻게 기록되는지, 어떻게 처리되는지에 대해서는 모릅니다.

 

 

긴 파일이름을 지원하는 윈도우에서 8.3 구조를 함께 지원하는 이유는

당시에 8.3 구조에 맞게 작성된(컴파일된) 프로그램이

디스크에서 긴파일 이름을 변형된 형태로라도(ex: PROGRA~1) 입출력을 할 수 있도록

하위 지원을하기 위함이지

그 이상의 의미는 없다고 생각합니다.

 

아래는 QAOS 홈페이지에 소개된

"NTFS: 8.3 형식의 파일명 생성 안하기" 라는 게시물입니다.

https://qaos.com/article.php?sid=203

 

위 게시물의 내용에 따르면

DOS프로그램(혹은 일부 16비트 프로그램)과의 하위호환을 위해

NTFS에서는 8.3형식의 파일명도 함께 저장합니다.

이 8.3 형식의 파일명은 커맨드라인에서 dir /x 를 통해 확인할 수 있습니다.

그런데, 윈도우의 레지스트리 값을 수정하면

파일을 저장할 때 8.3형식을 파일명을 함께 저장하지 않는다고 합니다.

 

위 링크의 그림을 보시면 8.3형식의 파일명을 생성하지 않게 변경한 이후에 생성되는 파일은

8.3형식의 파일명이 표시되지 않음 dir/x를 통해 확인할 수 있습니다.

 

이런 파일의 경우

8.3 형식을 사용하는 구형 프로그램에서는 해당 파일 입출력이 불가능할 뿐

그 외의 NTFS 파일시스템의 작동에는 아무런 영향을 미치지 않습니다.

 

즉, 다시 말하면

 

NTFS를 얘기할 때 8.3 구조는 그저 하위호환을 위한 요소일 뿐이지

NTFS의 파일명.확장자 구조를 8.3의 Fixed한 구조에 맞추어 설명할 필요가 없다는 것입니다.

 

 

 

 

[2] 긴 파일 이름을 지원하는 윈도우에서의 유동적인 파일.확장자 구조

- 확장자를 구분짓는 .(dot)도 파일명의 일부분일 뿐이다.

 

(비단 NTFS뿐만 아니라 확장FAT16, FAT32의 경우에도 256자 긴파일 이름을 지원합니다.)

(다만, 동일 폴더내의 최대파일수 제한, 단일파일의 최대 크기, 파티션이나 볼륨의 최대 크기 등등에는 차이가 있을 수 있겠지만,

제가 전문가가 아니라서 자세한 것은 모르므로

여기서는 그러한 설명은 하지 않고, 단순히 파일명에 대해서만 실험을 통해 설명하겠습니다.)

 

 

일단 혼돈을 막기 위해 이 설명에서 사용하는 용어를 먼저 정리하겠습니다.

예를들어

windowsforum.txt 라는 파일에서

windowsforum 부분은 파일명앞쪽,  txt는 확장자라고 부르겠습니다.

windowsforum.txt 를 통틀어 파일명으로 부르겠습니다.

 

전문가가 아니라서 정확한 용어를 모르기 때문에

파일명의 .(dot) 앞부분을 파일명앞쪽이라고 부르는 것을 양해해주시기 바랍니다.

 

과거의 8.3 구조에서는

파일명앞쪽은 최대 8바이트

확장자는 최대 3바이트까지가 가능했습니다. 즉 파일명이 .(dot)를 중심으로 8.3의 고정적인 구조였습니다.

 

그러나 긴 파일이름을 지원하는 윈도우에서의 파일명은 .(dot) 앞뒤로 고정적인 구조가 아닙니다.

 

 

기술자료를 인용하지 않겠습니다. 저는 기술자료를 봐도 이해도 못할 뿐더러 어디서 구해야 하는지도 모릅니다.

다만, Windows의 커맨드프롬프트에서의 실험을 통해서 이를 설명하겠습니다.

저의 실험 방법은 매우 무식하지만, 일관적입니다. 그를 통해 저 나름대로의 결론을 낼 것입니다.

그 결론이 기술자료의 내용과는 맞지 않을 수 있습니다만

저의 주장을 뒷받침하는 데에는 크게 무리가 없을 것이라 생각합니다.

 

긴 파일 이름의 최대 글자수

Maximum_Filename_Length.png

 

 

위에서 Z드라이브는 NTFS로 포맷된 드라이브입니다.

위에서의 파일은 확장자가 없는 순수한 '파일명앞쪽'으로만 구성된 파일입니다.

보시는 바와 같이 실제로 생성할 수 있는 파일명의 최대길이는 255자입니다.

 

 

이번에는 확장자를 1글자 넣어서 파일을 만들어 보겠습니다.

 

ext_Length_1.png  

 

 

보시는 바와 같이 전체 파일명의 최대 길이는

확장자가 없는 위의 파일과 동일하게 255자입니다.

 

 

확장자가 10자인 파일도 한번 만들어보겠습니다.

 

ext_Length_10.png

 

 

위의 두 경우와 별반 다르지 않습니다.

 

 

그럼 .(dot)이 여러개 있는 파일을 한번 만들어볼까요?

 

.(dot)이 5개

확장자가 3자인 파일을 만들어보겠습니다.

 

ext_Length_3_Dot_5.png

 

 

dir_dot5.png

 

어떻습니까?

위의 경우들과 전혀 다르지 않습니다.

 

여기서 2가지 결론을 얻을 수 있습니다.

 

(1) NTFS에서는 파일명앞쪽과 확장자의 길이가 최대길이 범위내에서 유동적일 수 있다.

(비단 NTFS 뿐만아니라, 긴파일 이름을 지원하는 윈도우에서 사용하는 확장FAT16, FAT32도 마찬가지입니다.)

(다만 제가 확장FAT16, FAT32까지 정확히 실험해보지 않았기때문에, 실험 결과는 NTFS로만 한정짓겠습니다)

=> 즉 과거의 Fixed한 8.3구조에 대입해서 설명을 할 필요가 없습니다.

 

(2) .(dot)도 그저 파일명의 일부이다.

=> 위의 그림들에서 보시는바와 같이 .(dot)도 NTFS의 파일명에서는 그저 한 문자의 공간 차지하는 문자일 뿐

파일시스템에 파일명앞쪽.확장자를 따로 분리해서 저장하기위해 사용되는 것이 아니라는 것을 알 수 있습니다.

 

그저 오늘날의 Windows에서는

파일명의 맨마지막 .(dot) 뒤의 부분을 기존의 확장자라는 개념으로 사용할 뿐입니다.

 

 

 

 

 

[3] 폴더도 파일이다.

 

전문가가 아니기때문에

폴더(디렉토리)가 파일시스템에 기록될 때

어떻게 기록되는지에대해서는 관심이 없습니다.

 

다만 위와 마찬가지 방법을 통해

폴더도 파일의 일종으로 취급된다는 것을 설명하겠습니다.

 

 

위에서 그림으로 설명한 바와 같이

실제로 '유효한' 파일명의 최대 길이는 255자 입니다.

그렇다면 폴더는 어떨까요?

폴더도 파일의 일종이라면

폴더 + 파일의 길이도 최대 255자일 것입니다.

 

그래서 실험해봤습니다.

 

 Foldername_Length_244.png

 

 

루트에서 폴더 생성시

폴더명은 특이하게도 244자 까지만 생성이 가능합니다.

이것의 이유는 저도 잘 모르겠습니다만 계속 진행해보겠습니다.

 

244_Folder.png

 

244자인 폴더내에서 추가로 1자 폴더를 만드는 데에는 실패했습니다. (폴더명 길이 244자의 제한)

그러나 최대로 생성 가능한 파일의 길이는 11자입니다.

244+11 = 255

역시나 255라는 값이 나왔습니다.

이는 파일명의 최대 길이인 255와 동일한 값입니다.

 

 

그러면 243자인 폴더를 만들어서 같은 방법으로 실험해보겠습니다.

 

243_Folder.png

 

243자 폴더 내에서 1자 폴더를 만드는대에는 실패했습니다.

분명 루트에서 폴더를 만들때에는 최대 폴더명의 길이가 244자였는데 243+1=244임에도 불구하고 생성에 실패했습니다.

(이 이유는 잠시 후에 밝혀지며, 폴더도 파일이라는 것을 설명하는데에 결정적으로 작용합니다.)

 

243자 폴더내에서 최대로 생성할 수 있는 파일명의 길이는 12자로

243 + 12 = 역시 255가 됩니다.

 

 

 

242자의 폴더내에서 또 실험해보겠습니다. (이 부분이 매우 중요한 의미를 가집니다.)

 

242_Folder.png

 

아까전에 확인했듯이 루트에서 생성가능한 폴더명의 최대길이는 244자였지만

243자 폴더내에서 1자 폴더를 생성할 때에는 실패했습니다.

그러나, 242자 폴더내에서 1자 폴더를 생성하는데에 성공했습니다. 그 이유는 무엇일까요?

바로 아래의 이유입니다.

 

242_a.png

 

폴더를 구분하는 문자인 \(역슬래시) 때문이었습니다.

 

즉,

\(역슬래시) 문자도 역시 파일명의 일부입니다.

 

 

이 상태에서 파일을 또 생성해보겠습니다.

242_a_11.png

 

여기서 중요한 사실을 알 수 있습니다.

위에서 파일명과 확장자를 언급하면서

최대로 '유효한' 파일명의 길이는 255자인 것을 확인할 수 있었는데

폴더명+파일명에서도 마찬가지 결과가 나왔습니다.

폴더명+파일명의 최대길이가 255자가 나왔는데 이는

폴더를 구분하는 \(역슬래시) 문자도 파일명의 일부로 사용이 되어야 설명이 가능합니다.

 

즉, 폴더도 파일로 취급한다는 뜻입니다.

폴더라는 것을 나타내기 위해 파일명에 \(역슬래시)라는 문자가 들어가는 것입니다.

실제로 파일시스템에 폴더가 저장이 될 때에는 \(역슬래시)가 아닌 다른 문자가 사용될 수도 있겠지만

확실한 것은, '특정한 하나의 문자'로 폴더임을 나타낼 것이라는 것을 추측해볼 수 있습니다.

(자세한 파일시스템 구조는 모르므로 이 부분에 대한 자세한 설명은 생략하겠습니다)

 

조금 더 복잡하게 하위폴더를 만들어보겠습니다.

220_SubFolders.png

 

이제는 모든 것이 설명이 됩니다.

(다만 한가지,

왜 일반파일이 아닌 폴더명으로만으로 만들 경우에는 244자가 한계인가는 이 테스트방법으로는 설명할 수 없습니다.

이런 것은 기술자료등에서 찾아봐야 하겠지만 중요한 내용은 아닌 것 같습니다.)

 

위의 실험을 통해

폴더는 윈도우상에서 \(역슬래시)라는 문자로 구분이 되며

이 \(역슬래시)도 파일명(전체경로명)의 일부분이라는 점이라는 것이 설명됩니다.

 

 

그러므로 폴더도 파일의 한 부분이라는 설명이 가능해집니다. 게다가 바로 위 그림에서는

확장자를 구분지을때 사용하는 .(dot)도 그저 파일명의 일부분이라는 점까지 설명하고 있습니다.

(12345.abcde = 평범한 11글자의 파일명)

 

 

그러므로

위의 많은 그림들을 통해 설명된 것 처럼

(파일의 최대길이)나

(경로를 나타내는 폴더 + 실제파일이름)의 '유효한' 최대길이가 모두 255자인 점을 통해

이 둘간의 구분이 모호해짐을 알 수 있습니다.

즉 폴더도 파일로 취급할 수 있다는 것입니다.

 

그래서 윈도우에서는 파일명의 최대길이라는 용어 대신에

"최대 경로 길이"라는 용어를 사용하나봅니다. (그저 제가 얻은 결론일 뿐입니다.)

 

 

그런데 이쯤되면

NTFS에서의 최대경로길이는 256자라고 알려져있는데 (역시 기술자료는 생략합니다. 전문가가 아니라서 관심 없습니다.)

왜 위의 결과에서는 255자가 나왔을까 궁금해집니다.

 

그 이유는 위의 마지막 그림으로 설명하겠습니다.

위의 마지막 그림에서 생성한 파일명 abcdefghijklm 파일은

"경로명 + 파일명"의 전체경로를 가진 파일입니다. 즉 경로를 나타내는 \를 사용해서 표현하면 다음과 같이 표현될 것입니다.

 

1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890\12345.abcde\hsk\winfo\abcdefghijklm

와 같은 전체경로를 가지게 됩니다.

위의 글자수를 세어보시면 알겠지만 정확히 256자입니다.

 

위의 그림들에서는 제가 \?를 생략하고 설명했기 때문에 255자로 보인 것이지

실제 파일 전체경로명에는 \?가 있다는 점을 생각한다면 256자인 것입니다.

 

이는 루트폴더에 있는 파일을 설명할때에도 가능합니다.

루트폴더에 windowsforum.txt 라는 파일이 있다면

이 파일의 전체경로는 \?windowsforum.txt 로 간주될 것입니다.

 

즉 파일시스템에 저장될 때에는

\ (루트)     => OS에서는 폴더로 취급

Downloads\       => OS에서는 폴더로 취급

Program Files\     => OS에서는 폴더로 취급

....

Program Files\Internet Explorer\      => OS에서는 폴더로 취급

Program Files\Internet Explorer\iexplore.exe

....

Windows\      => OS에서는 폴더로 취급

Windows\ntoskrnl.exe

Windows\System32\      => OS에서는 폴더로 취급

....

\boot.ini 

\ntldr

\windowsforum.txt

....

 

이와 같은 개념으로 저장된다고 말할 수 있습니다.

 

 

이 설명이 맞다면

폴더라는 개념은 결국

파일명 뒤에 \ 라는 문자가 붙은 파일이라고 생각할 수 있습니다.

Downloads 라는 폴더가 있다면

Downloads\ 라는 파일로 생각해도 된다는 듯입니다.

 

물론 루트 폴더는

\ 라는 파일로 생각해도 되겠지요....

 

즉 아무리 복잡하게 서브폴더안에 서브폴더가 존재하더라도

결국 파일이름(경로명)에 \가 여러개 있는 파일로 취급되면 그만이라는 뜻이기도 합니다.

 

실제의 파일시스템에 기록될때에는 \가 아닌 다른 문자(토큰)로 기록되어 폴더임을 나타낼 수도  있겠지만

결국에는 OS에서 파일명을 읽어서 표시할 때

폴더를 나타내는 토큰이 있으면 해당 토큰마다 끊어서

폴더처럼 표시만 해주면 그만이라는 것입니다. \ 토큰이 여러개 있을 경우

여러개의 하위폴더로 취급되게 표시하고, 그에 맞게 처리만 해주면 그만일 것입니다.

 

 

파일을 이동하는 작업 역시 이로 설명이 가능합니다.

(볼륨, 파티션에 관한 자세한 설명은 생략합니다. 제가 자세한 것은 모릅니다)

같은 볼륨에서 파일을 다른 폴더로 이동하는 작업은 결국에는

내부적으로는 '경로명 이름 바꾸기 작업'이 될 것입니다.

 

Downloads 폴더에 nero_setup.exe 라는 파일이 있다고 한다면

이 파일의 전체 경로는

Downloads\nero_setup.exe 가 될 것입니다.

 

만약 이를 Files\라는 폴더로 옮기는 작업을 한다면 그저

전체경로명에서 폴더를 나타내는 부분만 이름을 바꾸어주면 될 것입니다.

Files\nero_setup.exe 이렇게 말이죠...

 

만약 여기서 Files\ 폴더 내에서 Install_Original\ 이라는 새폴더를 만든다면

내부적으로는 Files\Install_Original\ 이라는 파일을 만들면 그것이 새로운 폴더가 되는 것입니다.

Files\nero_setup.exe 파일을 Files\Install_Original\ 폴더에 이동하고 싶다면 역시

파일 이름(경로명)만

Files\Install_Original\nero_setup.exe 로 바꾸면 되겠지요....

 

결국 파일시스템이라는 것은

이러한 작업을 함에 있어서

효율적으로 그리고 안정적으로 저장장치에 저장하기 위한 자료구조일 뿐입니다.

적어도 제 생각에는 말입니다.

 

 

 

===========================================

 

글이 굉장히 길어졌습니다.

위의 실험을 통해 얻은 결론은 이렇습니다.

[1] 긴 파일 이름을 지원하는 윈도우에서 NTFS를 사용할 때, 과거 8.3의 Fixed한 파일.확장자 구조는 하위호환을 위한 것일 뿐,

그것으로 NTFS의 파일명 구조를 설명할 수 없다.

[2] 긴 파일 이름을 지원하는 윈도우에서는 확장자를 구분하는 .(dot)도 그저 파일명을 구성하는 '하나의 문자'일 뿐이다.

[3] 폴더를 구분하는 토큰인 \(역슬래쉬)도 결국 파일명(전체 경로명)의 일부이다. 그러므로 폴더도 파일이다.

 

 

제가 결론내지 못한 부분은 이것입니다.

\를 제외한 '유효한' 파일이름 길이는 최대 255자인데

왜 폴더로만 만들때에는 244자까지 밖에 만들지 못하는가 입니다.

 

 

실험을 통해 내린 제 결론에

잘못된 부분이 있거나, 보충해주실 부분이 있다면

기술자료나 또다른 실험을 통해 설명해주신다면

정말 많은 도움이 될 것 같습니다.

 

 

긴 글 읽어주셔서 대단히 감사합니다.

 

번호 제목 글쓴이 조회 등록일
[공지] 질문과 답변 게시판 이용간 유의사항 gooddew - -
11718 하드웨어| FLASH 프로그램 [1] 민초의삶 2516 01-16
11717 윈 도 우| 제질문만 답이 없어서 같은 질문다시올립니다. [15] 강가딘 4134 01-16
11716 윈 도 우| 64bit xp language_pack 올려주세요 kk789 3318 01-16
11715 윈 도 우| 블랙 스크린 뜰 때... [3] 파닥파닥 9064 01-16
11714 윈 도 우| DLL 자동설치팩 만들기 비법 공개 [3] 진모씨 8134 01-16
11713 윈 도 우| IEToy 2.0 스마트로그인이 이상하네요;; [5] 코디알 4578 01-16
11712 윈 도 우| 멀티부팅 선택메뉴 나타나게 하려면.... [2] 떠오름 2638 01-16
11711 윈 도 우| ATI 카드 쓰시는 분들 CCC 9.10 한글 버전 좀 찾아주세요~ [3] 코디알 3037 01-16
11710 윈 도 우| 윈7에서 폰트 변경 방법을 알고 싶습니다.(레지 수정으로) [1] 과거지사 4409 01-16
11709 하드웨어| 윈도우 포럼이 RSS를 지원하나요? 후레이 2355 01-16
11708 윈 도 우| 2008 R2 사용중인데요 테마관련 질문입니다. wooolk 2628 01-16
11707 윈 도 우| InfraRecoder 리뷰 및 강좌 [9] 진모씨 6960 01-16
11706 하드웨어| MS 시큐리티에센셜 한글판은 언제 나올까요? 피에스피 2989 01-16
11705 윈 도 우| (긴급 help) Missing Operating System 에러로 부팅이 안됩... [2] nkino 5982 01-16
11704 서버 / IT| 서버 2008 R2 설치후에도 DVD가 꼭 들어있어야 부팅이 되네... [3] hoony 3647 01-16
11703 하드웨어| 64비트 익스플로어 플레쉬 문제.. [4] 박종환 3439 01-16
11702 윈 도 우| MS Office Beta2 14.0 4730 [1] 산정 2829 01-16
11701 윈 도 우| 자동업데이트에서 IE7 보안업데이트(kb976325)가 반복 설치... HaeAhnyo 3931 01-16
» 윈 도 우| '긴 파일이름'을 지원하는 윈도우에서의 확장자의 의미, 폴... [7] hsk 16031 01-16
11699 윈 도 우| 포멧 질문드려요 ㅠㅠ [2] 너에게 닿기 3196 01-16
XE1.11.6 Layout1.4.8