파일 이름 지정, 경로 및 네임스페이스

Windows에서 지원하는 모든 파일 시스템은 파일 및 디렉터리 개념을 사용하여 디스크 또는 디바이스에 저장된 데이터에 액세스합니다. 파일 및 디바이스 I/O용 Windows API를 사용하는 Windows 개발자는 파일 및 디렉터리의 이름에 대한 다양한 규칙 및 제한 사항을 이해해야 합니다.

파일 I/O API를 사용하여 디스크, 디바이스 및 네트워크 공유에서 데이터에 액세스할 수 있습니다. 파일 및 디렉터리는 네임스페이스와 함께 경로 개념에 포함됩니다. 경로는 디스크인지, 디바이스인지, 특정 작업을 위한 네트워크 연결인지에 관계없이 데이터를 가져올 위치를 나타내는 문자열 표현입니다.

NTFS와 같은 일부 파일 시스템은 연결된 파일 및 디렉터리를 지원하며, 일반 파일 또는 디렉터리와 마찬가지로 파일 명명 규칙도 따릅니다. 자세한 내용은 하드 링크 및 접합재분석 지점 및 파일 작업을 참조하세요.

긴 파일 경로를 지원하도록 Windows를 구성하는 방법에 대한 자세한 내용은 최대 경로 길이 제한을 참조하세요.

파일 및 디렉터리 이름

모든 파일 시스템은 개별 파일에 대해 동일한 일반 명명 규칙을 따릅니다. 이 규칙에서는 기본 파일 이름과 선택적 확장명이 마침표로 구분됩니다. 그러나 NTFS, CDFS, exFAT, UDFS, FAT 및 FAT32와 같은 각 파일 시스템에는 디렉터리 또는 파일 경로의 개별 구성 요소 형성에 대한 구체적이고 다양한 규칙이 있을 수 있습니다. 디렉터리는 단순히 디렉터리로 지정하는 특수한 특성이 있는 파일이지만, 그 외에는 모두 일반 파일과 동일한 명명 규칙을 따라야 합니다. 디렉터리라는 용어는 파일 시스템과 관련하여 특수한 형식의 파일을 나타내기 때문에 일부 참조 자료에서는 파일이라는 일반적인 용어를 사용하여 디렉터리와 데이터 파일의 개념을 모두 포함합니다. 따라서 달리 지정하지 않는 한 파일에 대한 모든 명명 규칙이나 사용 규칙 또는 예제는 디렉터리에도 적용되어야 합니다. 경로라는 용어는 하나 이상의 디렉터리, 백슬래시 및 볼륨 이름을 나타냅니다. 자세한 내용은 경로 섹션을 참조하세요.

문자 수 제한도 다를 수 있으며 사용되는 파일 시스템 및 경로 이름 접두사 형식에 따라 달라질 수 있습니다. 이는 이전 버전과의 호환성 메커니즘을 지원하여 더욱 복잡해집니다. 예를 들어 이전 MS-DOS FAT 파일 시스템은 기본 파일 이름에 최대 8자를 지원하고 확장명에 3자를 지원하여 점 구분 기호 포함 총 12자를 지원합니다. 일반적으로 8.3 파일 이름이라고 합니다. Windows FAT 및 NTFS 파일 시스템은 긴 파일 이름을 지원하지만 여전히 8.3 버전의 긴 파일 이름도 지원하기 때문에 8.3 파일 이름으로 제한되지 않습니다.

명명 규칙

다음 기본 규칙을 사용하여 애플리케이션은 파일 시스템에 관계없이 파일 및 디렉터리에 유효한 이름을 만들고 처리할 수 있습니다.

  • 마침표를 사용하여 디렉터리 또는 파일 이름에서 기본 파일 이름을 확장명과 구분합니다.

  • 백슬래시(\)를 사용하여 경로의 구성 요소를 구분합니다. 백슬래시는 경로에서 파일 이름을 구분하고 경로에서 한 디렉터리 이름을 다른 디렉터리 이름과 구분합니다. 백슬래시는 이름을 구성 요소로 구분하는 예약된 문자이므로 실제 파일 또는 디렉터리의 이름에서 사용할 수 없습니다.

  • 필요에 따라 백슬래시를 볼륨 이름의 일부로 사용합니다. 예를 들어 UNC(범용 명명 규칙) 이름에서 “C:\path\file”의 “C:\” 또는 “\\server\share\path\file”의 “\\server\share”입니다. UNC 이름에 대한 자세한 내용은 최대 경로 길이 제한 섹션을 참조하세요.

  • 대/소문자를 구분하지 않습니다. 예를 들어 OSCAR, Oscar 및 oscar라는 이름을 동일하다고 간주합니다. POSIX 규격 파일 시스템과 같은 일부 파일 시스템에서는 다른 것으로 간주할 수 있습니다. NTFS는 대/소문자 구분에 대한 POSIX 의미 체계를 지원하지만 기본 동작은 아닙니다. 자세한 내용은 CreateFile을 참조하세요.

  • 볼륨 지정자(드라이브 문자)도 마찬가지로 대/소문자를 구분하지 않습니다. 예를 들어 “D:\”와 “d:\”는 동일한 볼륨을 나타냅니다.

  • 다음 문자를 제외하고 유니코드 문자와 확장 문자 집합(128~255)의 문자를 포함하여 현재 코드 페이지의 모든 문자를 이름에 사용합니다.

    • 다음과 같은 예약된 문자:

      • <(보다 작음)
      • >(보다 큼)
      • :(콜론)
      • "(큰따옴표)
      • /(슬래시)
      • \(백슬래시)
      • |(세로 막대 또는 파이프)
      • ? (물음표)
      • *(별표)
    • 정수 값 0, ASCII NUL 문자라고도 합니다.

    • 정수 표현이 1부터 31까지의 범위에 있는 문자(단, 이러한 문자가 허용되는 대체 데이터 스트림 제외). 파일 스트림에 대한 자세한 내용은 파일 스트림을 참조하세요.

    • 대상 파일 시스템에서 허용하지 않는 다른 모든 문자

  • 경로에서 마침표를 디렉터리 구성 요소로 사용하여 현재 디렉터리를 나타냅니다(예: “.\temp.txt”). 자세한 내용은 경로를 참조하세요.

  • 경로에서 두 개의 연속된 마침표(..)를 디렉터리 구성 요소로 사용하여 현재 디렉터리의 부모를 나타냅니다(예: “..\temp.txt”). 자세한 내용은 경로를 참조하세요.

  • 다음 예약된 이름을 파일 이름에 사용하지 않습니다.

    CON, PRN, AUX, NUL, COM0, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, COM¹, COM², COM³, LPT0, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9, LPT¹, LPT² 및 LPT³. 또한 이러한 이름 바로 뒤에 확장명을 사용하지 않습니다. 예를 들어 NUL.txt와 NUL.tar.gz는 모두 NUL과 동일합니다. 자세한 내용은 네임스페이스를 참조하세요.

    참고 항목

    Windows는 8비트 ISO/IEC 8859-1 위 첨자 ¹, ² 및 ³을 숫자로 인식하고 COM# 및 LPT# 디바이스 이름의 유효한 부분으로 처리하여 모든 디렉터리에서 예약한 것으로 만듭니다. 예를 들어 echo test > COM¹은(는) 파일을 만들지 못합니다.

  • 공백 또는 마침표로 파일 또는 디렉터리 이름을 끝내지 않습니다. 기본 파일 시스템은 이러한 이름을 지원할 수 있지만 Windows 셸 및 사용자 인터페이스에서는 지원하지 않습니다. 그러나 마침표를 이름의 첫 번째 문자로 지정할 수는 있습니다. 예를 들어 “.temp”입니다.

짧은 이름과 긴 이름 비교

긴 파일 이름은 8.3이라고도 하는 짧은 MS-DOS 스타일 명명 규칙을 초과하는 모든 파일 이름으로 간주됩니다. 긴 파일 이름을 만들 때 Windows는 8.3 별칭 또는 짧은 이름이라는 짧은 8.3 형식의 이름을 만들어 디스크에 저장할 수도 있습니다. 이 8.3 별칭은 특정 파일 시스템에 따라 성능상의 이유로 시스템 전체 또는 지정된 볼륨에 대해 사용하지 않도록 설정할 수 있습니다.

Windows Server 2008, Windows Vista, Windows Server 2003 및 Windows XP: Windows 7 및 Windows Server 2008 R2까지 지정된 볼륨에 대해 8.3 별칭을 사용하지 않도록 설정할 수 없습니다.

많은 파일 시스템에서 파일 이름은 너무 길어서 8.3 명명 규칙을 준수할 수 없는 이름의 각 구성 요소 내에 물결표(~)를 포함합니다.

참고

모든 파일 시스템이 물결표 대체 규칙을 따르는 것은 아니며 시스템이 일반적으로 8.3 별칭 생성을 지원하는 경우에도 사용하지 않도록 구성할 수 있습니다. 따라서 8.3 별칭이 디스크에 이미 있다고 가정해서는 안 됩니다.

시스템에서 8.3 파일 이름, 긴 파일 이름 또는 파일의 전체 경로를 요청하려면 다음 옵션을 고려하세요.

  • 긴 파일 이름의 8.3 형식을 가져오려면 GetShortPathName 함수를 사용합니다.
  • 짧은 이름의 긴 파일 이름 버전을 가져오려면 GetLongPathName 함수를 사용합니다.
  • 파일의 전체 경로를 가져오려면 GetFullPathName 함수를 사용합니다.

NTFS, exFAT, UDFS 및 FAT32와 같은 최신 파일 시스템에서 Windows는 긴 파일 이름을 유니코드로 디스크에 저장하여 원래 긴 파일 이름이 항상 유지됩니다. 디스크 읽기 또는 쓰기 작업 중에 활성 상태인 코드 페이지에 관계없이 긴 파일 이름에 확장 문자가 포함되어 있는 경우에도 마찬가지입니다.

긴 파일 이름을 사용하는 파일은 파일 이름 정보의 손실 없이 NTFS 파일 시스템 파티션과 Windows FAT 파일 시스템 파티션 간에 복사할 수 있습니다. 실제 파일 이름에 따라 이전 MS-DOS FAT 및 일부 유형의 CDFS(CD-ROM) 파일 시스템에는 적용되지 않을 수 있습니다. 이 경우 가능하면 짧은 파일 이름으로 대체됩니다.

경로

지정된 파일의 경로는 특수 문자(백슬래시)로 구분된 하나 이상의 구성 요소로 구성되며, 각 구성 요소는 일반적으로 디렉터리 이름 또는 파일 이름이지만 아래에 설명된 몇 가지 주목할 만한 예외가 있습니다. 경로의 시작 또는 접두사의 모양이 경로에 대한 시스템의 해석에 중요한 경우가 많습니다. 이 접두사는 경로가 사용하는 네임스페이스뿐만 아니라 마지막 문자를 포함하여 어떤 특수 문자가 경로 내의 어떤 위치에서 사용되는지를 결정합니다.

경로의 구성 요소가 파일 이름인 경우 마지막 구성 요소여야 합니다.

또한 경로의 각 구성 요소는 특정 파일 시스템에 대해 지정된 최대 길이로 제한됩니다. 일반적으로 이러한 규칙은 짧은 이름과 긴 이름의 두 범주로 구분됩니다. 디렉터리 이름은 파일 시스템에서 특수한 형식의 파일로 저장되지만 디렉터리 이름에도 파일의 명명 규칙이 적용됩니다. 요약하자면 경로는 특정 파일 또는 디렉터리 이름에 대해 존재하는 모든 디렉터리 간의 계층 구조를 문자열로 표현한 것일 뿐입니다.

정규화된 경로와 상대 경로 비교

파일을 조작하는 Windows API 함수에서 파일 이름은 현재 디렉터리에 상대적인 경우가 많지만 일부 API에는 정규화된 경로가 필요합니다. 파일 이름은 다음 중 하나로 시작하지 않는 경우 현재 디렉터리에 상대적입니다.

  • 항상 두 개의 백슬래시 문자(“\\”)로 시작하는 모든 형식의 UNC 이름. 자세한 내용은 다음 단원을 참조하세요.
  • 백슬래시가 있는 디스크 지정자(예: “C:\” 또는 “d:\”)
  • 단일 백슬래시(예: “\directory”또는 “\file.txt”). 이를 절대 경로라고도 합니다.

파일 이름이 디스크 지정자로만 시작하고 콜론 뒤의 백슬래시로 시작하지 않는 경우 지정된 문자가 있는 드라이브의 현재 디렉터리에 대한 상대 경로로 해석됩니다. 현재 디렉터리는 해당 디스크에 대한 가장 최근의 “디렉터리 변경” 작업 중에 설정된 항목에 따라 루트 디렉터리가 될 수도 있고 그렇지 않을 수도 있습니다. 이 형식의 예는 다음과 같습니다.

  • “C:tmp.txt”는 C 드라이브의 현재 디렉터리에 있는 “tmp.txt”라는 파일을 나타냅니다.
  • “C:tempdir\tmp.txt”는 C 드라이브의 현재 디렉터리에 대한 하위 디렉터리에 있는 파일을 나타냅니다.

또한 경로에 “이중 점”이 포함되어 있으면 상대 경로라고 합니다. 즉, 경로의 한 구성 요소에 두 개의 마침표가 함께 있습니다. 이 특수 지정자는 “부모 디렉터리”라는 현재 디렉터리 위의 디렉터리를 나타내는 데 사용됩니다. 이 형식의 예는 다음과 같습니다.

  • “..\tmp.txt”는 현재 디렉터리의 부모에 있는 tmp.txt라는 파일을 지정합니다.
  • “..\..\tmp.txt”는 현재 디렉터리보다 두 디렉터리 위에 있는 파일을 지정합니다.
  • “..\tempdir\tmp.txt”는 현재 디렉터리의 피어 디렉터리인 tempdir이라는 디렉터리에 있는 tmp.txt라는 파일을 지정합니다.

상대 경로는 “C:..\tmp.txt”와 같이 두 예제 형식을 결합할 수 있습니다. 이렇게 하면 시스템이 현재 드라이브를 해당 드라이브의 현재 디렉터리와 함께 추적하지만 현재 드라이브로 설정된 드라이브 지정자에 관계없이 서로 다른 각 드라이브 문자(시스템에 둘 이상이 있는 경우)의 현재 디렉터리도 추적하기 때문에 유용합니다.

최대 경로 길이 제한

Windows 10 버전 1607 이전의 Windows 버전에서 경로의 최대 길이는 MAX_PATH이며 260자로 정의됩니다. 이후 버전의 Windows에서는 레지스트리 키를 변경하거나 그룹 정책 도구를 사용하여 제한을 제거해야 합니다. 자세한 내용은 최대 경로 길이 제한을 참조하세요.

네임스페이스

Windows API에는 일반적으로 NT 네임스페이스 및 Win32 네임스페이스라고 하는 두 가지 주요 네임스페이스 규칙 범주가 있습니다. NT 네임스페이스는 Win32 하위 시스템 및 Win32 네임스페이스를 포함하여 다른 하위 시스템 및 네임스페이스가 존재할 수 있는 가장 낮은 수준의 네임스페이스가 되도록 설계되었습니다. POSIX는 NT 네임스페이스를 기반으로 구축된 Windows 하위 시스템의 또 다른 예입니다. 또한 초기 버전의 Windows는 통신 포트(직렬 및 병렬) 및 기본 디스플레이 콘솔과 같은 특정 특수 디바이스에 대해 현재 NT 디바이스 네임스페이스의 일부로 미리 정의되거나 예약된 몇 가지 이름을 정의했으며 이 이름은 이전 버전과의 호환성을 위해 현재 버전의 Windows에서도 계속 지원됩니다.

Win32 파일 네임스페이스

Win32 네임스페이스 접두사 및 규칙은 사용 방법에 대한 설명과 함께 이 섹션과 다음 섹션에 요약되어 있습니다. 이러한 예제는 Windows API 함수에서 사용하기 위한 것이며 Windows 탐색기와 같은 Windows 셸 애플리케이션에서 반드시 작동하는 것은 아닙니다. 이러한 이유로 Windows 셸 애플리케이션에서 일반적으로 사용할 수 있는 것보다 더 광범위한 경로가 있으며, 이를 활용하는 Windows 애플리케이션은 이러한 네임스페이스 규칙을 사용하여 개발할 수 있습니다.

파일 I/O에서 경로 문자열의 “\\?\” 접두사는 모든 문자열 구문 분석을 사용하지 않도록 설정하고 그 뒤에 오는 문자열을 파일 시스템에 바로 보내도록 Windows API에 지시합니다. 예를 들어 파일 시스템에서 큰 경로 및 파일 이름을 지원하는 경우 Windows API에서 적용한 MAX_PATH 제한을 초과할 수 있습니다. 일반 최대 경로 제한에 대한 자세한 내용은 이전 섹션인 최대 경로 길이 제한을 참조하세요.

그러면 경로 문자열의 자동 확장이 해제되기 때문에 “\\?\” 접두사는 경로 이름에서 “..” 및 “.”의 사용도 허용합니다. 따라서 정규화된 경로의 일부로 예약된 상대 경로 지정자를 사용하여 파일에서 작업을 수행하려는 경우에 유용할 수 있습니다.

전부는 아니지만 많은 파일 I/O API가 “\\?\”를 지원합니다. 확인하려면 각 API에 대한 참조 항목을 검토해야 합니다.

“\\?\” 접두사를 사용하여 MAX_PATH를 초과하도록 하려면 유니코드 API를 사용해야 합니다.

Win32 디바이스 네임스페이스

“\\.\” 접두사는 Win32 파일 네임스페이스 대신 Win32 디바이스 네임스페이스에 액세스합니다. 이는 API가 이러한 유형의 액세스를 지원하는 경우 파일 시스템을 통하지 않고 실제 디스크 및 볼륨에 직접 액세스하는 방법입니다. 이 방법(예: CreateFileDefineDosDevice 함수 사용)으로 디스크 이외의 많은 디바이스에 액세스할 수 있습니다.

예를 들어 시스템의 직렬 통신 포트 1을 열려면 CreateFile 함수 호출에서 “COM1”을 사용할 수 있습니다. 이 방법은 COM1~COM9가 NT 네임스페이스에서 예약된 이름의 일부이기 때문에 작동하지만 “\\.\” 접두사를 사용하면 디바이스 이름에서도 작동합니다. 반면에 100 포트 직렬 확장 보드가 설치되어 있고 COM56을 열려는 경우에는 COM56에 대해 미리 정의된 NT 네임스페이스가 없기 때문에 “COM56”을 사용하여 열 수 없습니다. “\\.\\”는 미리 정의된 별칭을 찾지 않고 디바이스 네임스페이스로 직접 이동하므로 “\\.\COM56”을 사용하여 열어야 합니다.

Win32 디바이스 네임스페이스를 사용하는 또 다른 예로 CreateFile 함수를 “\\.\PhysicalDriveX”(여기서 X는 유효한 정수 값임) 또는 “\\.\CdRomX”와 함께 사용합니다. 이렇게 하면 디바이스에 직접 액세스하여 파일 시스템을 우회할 수 있습니다. 이 방법은 이러한 디바이스가 열거될 때 시스템에서 해당 디바이스 이름을 만들기 때문에 작동하며 일부 드라이버는 시스템에 다른 별칭도 만듭니다. 예를 들어 이름 “C:\”를 구현하는 디바이스 드라이버에는 파일 시스템이기도 한 자체 네임스페이스가 있습니다.

CreateFile 함수를 통과하는 API는 일반적으로 “\\.\” 접두사를 사용합니다. CreateFile은 사용하는 매개 변수에 따라 파일과 디바이스를 모두 여는 데 사용되는 함수이기 때문입니다.

Windows API 함수를 사용하는 경우 파일이 아닌 디바이스에만 액세스하려면 “\\.\” 접두사를 사용해야 합니다.

대부분의 API는 “\\.\”를 지원하지 않으며, 디바이스 네임스페이스에서 작동하도록 설계된 API만 인식합니다. 확인하려면 항상 각 API에 대한 참조 항목을 확인하세요.

NT 네임스페이스

NT 네임스페이스 규칙 사용을 허용하는 API도 있지만 Windows 개체 관리자는 대부분의 경우 필요하지 않게 만듭니다. 설명을 위해 Windows Sysinternals WinObj 도구를 사용하여 시스템 개체 브라우저에서 Windows 네임스페이스를 찾아보면 도움이 됩니다. 이 도구를 실행하면 루트 즉, “\”에서 시작하는 NT 네임스페이스가 표시됩니다. “Global??”이라는 하위 폴더는 Win32 네임스페이스가 있는 위치입니다. 명명된 디바이스 개체는 “Device” 하위 디렉터리 내의 NT 네임스페이스에 있습니다. 여기에서 시스템에 있는 경우 처음 두 COM 포트를 나타내는 디바이스 개체인 Serial0과 Serial1을 찾을 수도 있습니다. 볼륨을 나타내는 디바이스 개체는 “HarddiskVolume1”과 같이 표시되지만 숫자 접미사가 다를 수 있습니다. 하위 디렉터리 “Harddisk0” 아래의 “DR0”이라는 이름은 디스크를 나타내는 디바이스 개체의 예가 되는 식입니다.

Windows 애플리케이션에서 이러한 디바이스 개체에 액세스할 수 있도록 디바이스 드라이버는 Win32 네임스페이스 “Global??”에서 해당 디바이스 개체에 대한 바로 가기 링크(symlink)를 만듭니다. 예를 들어 “Global??” 하위 디렉터리 아래의 COM0과 COM1은 단순히 Serial0과 Serial1에 대한 symlink이고, “C:”는 HarddiskVolume1에 대한 symlink이며, “Physicaldrive0”는 DR0에 대한 symlink입니다. symlink가 없으면 앞에서 설명한 대로 Win32 네임스페이스 규칙을 사용하는 Windows 애플리케이션에서 지정된 디바이스 “Xxx”를 사용할 수 없습니다. 그러나 “\Device\Xxx” 형식의 NT 네임스페이스 절대 경로를 지원하는 API를 사용하여 해당 디바이스에 대한 핸들을 열 수 있습니다.

터미널 서비스 및 가상 머신을 통한 다중 사용자 지원이 추가됨에 따라 Win32 네임스페이스 내에서 시스템 차원 루트 디바이스 가상화가 더욱 필요해졌습니다. 이 작업은 앞에서 설명한 WinObj 브라우저 도구의 “Global??” 하위 디렉터리에서 볼 수 있으며 “\\\?\GLOBALROOT” 경로를 통해 액세스할 수 있는 “GLOBALROOT”라는 symlink를 Win32 네임스페이스에 추가하여 수행되었습니다. 이 접두사는 그 다음에 오는 경로가 세션 종속 경로가 아닌 시스템 개체 관리자의 실제 루트 경로에 표시되도록 합니다.

참고 항목