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

Windows에서 지원 되는 모든 파일 시스템은 파일 및 디렉터리 개념을 사용 하 여 디스크 또는 장치에 저장 된 데이터에 액세스 합니다. 파일 및 장치 i/o 용 Windows Api를 사용 하 여 작업 하는 windows 개발자는 파일 및 디렉터리에 대 한 다양 한 규칙, 규칙 및 이름 제한을 이해 해야 합니다.

파일 i/o Api를 사용 하 여 디스크, 장치 및 네트워크 공유에서 데이터에 액세스할 수 있습니다. 파일 및 디렉터리는 네임 스페이스와 함께 경로 개념의 일부 이며, 특정 작업에 대 한 디스크, 장치 또는 네트워크 연결에 관계 없이 데이터를 가져올 위치에 대 한 문자열 표현입니다.

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

자세한 내용은 다음 하위 섹션을 참조 하십시오.

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

파일 및 디렉터리 이름

모든 파일 시스템은 개별 파일에 대해 동일한 일반적인 명명 규칙을 따릅니다. 기본 파일 이름과 선택적 확장명 (마침표로 구분 됨)이 있습니다. 그러나 NTFS, CDFS, exFAT, UDF, FAT 및 FAT32와 같은 각 파일 시스템에는 디렉터리 또는 파일 경로의 개별 구성 요소를 구성 하는 방법에 대 한 특정 규칙 및 다른 규칙이 있을 수 있습니다. 디렉터리 는 디렉터리를 지정 하는 특수 한 특성을 가진 파일 일 뿐입니다. 그 외의 경우에는 일반 파일과 동일한 모든 명명 규칙을 따라야 합니다. 용어 디렉터리 는 파일 시스템에 관련 된 것 처럼 특수 한 형식의 파일을 참조 하기 때문에 일부 참조 자료에서는 일반적인 용어 파일 을 사용 하 여 디렉터리와 데이터 파일의 두 가지 개념을 모두 포함 합니다. 따라서 별도로 지정 하지 않는 한 파일에 대 한 이름 지정 또는 사용 규칙이 나 예를 디렉터리에도 적용 해야 합니다. 용어 경로 는 하나 이상의 디렉터리, 백슬래시 및 볼륨 이름을 참조 합니다. 자세한 내용은 경로 섹션을 참조 하세요.

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

명명 규칙

다음 기본 규칙을 사용 하면 파일 시스템에 관계 없이 응용 프로그램에서 파일 및 디렉터리에 대 한 올바른 이름을 만들고 처리할 수 있습니다.

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

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

  • 볼륨 이름의일부로 필요한 백슬래시를 사용 합니다. 예를 들어, \ \ \ \ \ \ \ \ \ \ \ UNC (범용 명명 규칙) 이름으로 "c: 경로 파일"의 "c:" 또는 "서버 공유 경로 파일"의 "서버 공유"를 사용 합니다. UNC 이름에 대 한 자세한 내용은 최대 경로 길이 제한 섹션을 참조 하세요.

  • 대/소문자 구분을 가정 하지 마세요. 예를 들어 일부 파일 시스템 (예: POSIX 규격 파일 시스템)이 다른 것으로 간주할 수 있는 경우에도 OSCAR, Oscar 및 oscar의 이름을 동일 하 게 고려 합니다. NTFS는 대/소문자 구분에 대해 POSIX 의미 체계를 지원 하지만 기본 동작은 아닙니다. 자세한 내용은 CreateFile을 참조 하세요.

  • 볼륨 지정자 (드라이브 문자)는 대/소문자를 구분 하지 않습니다. 예를 들어, "D: \ " 및 "d: \ "는 동일한 볼륨을 참조 합니다.

  • 다음을 제외 하 고 유니코드 문자 및 확장 문자 집합 (128 – 255)의 문자를 포함 하 여 이름에 대해 현재 코드 페이지에서 문자를 사용 합니다.

    • 예약 된 문자는 다음과 같습니다.

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

    • 이러한 문자가 허용 되는 대체 데이터 스트림을 제외 하 고 정수 표현이 1에서 31 사이의 범위에 있는 문자입니다. 파일 스트림에 대 한 자세한 내용은 파일 스트림을 참조 하세요.

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

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

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

  • 파일 이름에는 다음의 예약 된 이름을 사용 하지 마십시오.

    CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 및 LPT9. 또한 이러한 이름 바로 뒤에 확장을 사용 하지 마십시오. 예를 들어 NUL.txt을 권장 하지 않습니다. 자세한 내용은 네임스페이스를 참조하세요.

  • 파일이 나 디렉터리 이름에 공백이 나 마침표를 사용 하지 마십시오. 기본 파일 시스템에서 이러한 이름을 지원할 수도 있지만 Windows shell 및 사용자 인터페이스는 그렇지 않습니다. 그러나 이름의 첫 문자로 마침표를 지정 하는 것은 허용 됩니다. 예를 들면 ". temp"입니다.

짧은 이름 및 긴 이름

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

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

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

참고

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

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

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

NTFS, exFAT, UDF 및 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 버전에서 경로의 최대 길이는 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에서 달리 적용 되는 최대 _ 경로 제한을 초과할 수 있습니다. 일반적인 최대 경로 제한 사항에 대 한 자세한 내용은 이전 섹션인 최대 경로 길이 제한을 참조 하세요.

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

모든 파일 i/o api는 "?"를 지원 하지만 \ \ \ , 각 api에 대 한 참조 항목을 확인 하 여 확인 해야 합니다.

"?" 접두사를 사용 하 여 \ \ \ 최대 _ 경로 를 초과할 수 있는지 확인 하려면 유니코드 api를 사용 해야 합니다.

Win32 장치 네임 스페이스

" \ \ . \ " 접두사는 win32 파일 네임 스페이스 대신 win32 장치 네임 스페이스에 액세스 합니다. 이는 API가 이러한 종류의 액세스를 지 원하는 경우 파일 시스템을 거치지 않고 실제 디스크 및 볼륨에 대 한 액세스를 직접 수행 하는 방법입니다. 이러한 방식으로 디스크가 아닌 많은 장치에 액세스할 수 있습니다 (예: CreateFileDefineDosDevice 함수 사용).

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

Win32 장치 네임 스페이스를 사용 하는 또 다른 예는 "에 CreateFile 함수를 사용 하는 것입니다 \ \ . \ PhysicalDisk x"(여기서 X 는 올바른 정수 값) 또는" \ \ . \ CdRom X". 이렇게 하면 파일 시스템을 우회 하 여 해당 장치에 직접 액세스할 수 있습니다. 이러한 장치는 이러한 장치를 열거 하기 때문에 시스템에서 생성 되 고, 일부 드라이버는 시스템에서 다른 별칭을 만드는 경우에도 마찬가지입니다. 예를 들어 "C:" 라는 이름을 구현 하는 장치 드라이버에는 \ 파일 시스템으로도 발생 하는 고유한 네임 스페이스가 있습니다.

Createfile 함수를 사용 하는 api는 일반적으로 " \ \ ." 접두사와 함께 작동 \ 합니다. createfile 은 사용 하는 매개 변수에 따라 파일 및 장치를 모두 여는 데 사용 되는 함수입니다.

Windows 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"는 symlink to DR0 등에 대 한 것입니다. Symlink 없으면 앞에서 설명한 대로 Win32 네임 스페이스 규칙을 사용 하는 Windows 응용 프로그램에서 지정 된 장치 "Xxx"를 사용할 수 없습니다. 그러나 " \ 장치 Xxx" 형식의 NT 네임 스페이스 절대 경로를 지 원하는 api를 사용 하 여 해당 장치에 대 한 핸들을 열 수 있습니다 \ .

터미널 서비스 및 가상 컴퓨터를 통한 다중 사용자 지원 이외에도 Win32 네임 스페이스 내에서 시스템 수준 루트 장치를 가상화 하는 데 필요한 추가 작업이 있었습니다. "GLOBALROOT" 라는 symlink을 Win32 네임 스페이스에 추가 하 여이 작업을 수행 했습니다. 앞에서 설명한 WinObj 브라우저 도구의 하위 디렉터리는 " \ \ ? \ GLOBALROOT". 이 접두사는 뒤의 경로가 시스템 개체 관리자의 실제 루트 경로를 찾지만 세션 종속 경로를 표시 하지 않도록 합니다.

파일 시스템 기능 비교