파일 스트림(로컬 파일 시스템)

스트림은 바이트 시퀀스입니다. NTFS 파일 시스템에서 스트림에는 파일에 기록되고 특성 및 속성보다 파일에 대한 자세한 정보를 제공하는 데이터가 포함됩니다. 예를 들어 검색 키워드가 포함된 스트림 또는 파일을 만드는 사용자 계정의 ID를 만들 수 있습니다.

파일과 연결된 각 스트림에는 고유한 할당 크기, 실제 크기 및 유효한 데이터 길이가 있습니다.

  • 할당 크기는 스트림에 예약된 디스크 공간의 크기입니다.
  • 실제 크기는 호출자가 사용하는 바이트 수입니다.
  • 유효한 데이터 길이(VDL)는 스트림의 할당 크기에서 초기화된 바이트 수입니다.

또한 각 스트림은 압축, 암호화 및 스파스에 대한 자체 상태를 유지합니다. 파일의 FILE_ATTRIBUTE_SPARSE_FILE 특성은 FindFirstFile, FindFirstFileExFindNextFile 함수에서 반환된 WIN32_FIND_DATA 구조체의 dwFileAttributes 멤버에서 설정됩니다( 스트림이 스파스된 경우). GetFileAttributes, GetFileAttributesEx, GetFileAttributesTransacted, GetFileInformationByHandleGetFileInformationByHandleEx는 스트림이 지정되지 않은 경우 기본 데이터 스트림의 스파스 상태를 반환합니다.

스트림과 연결된 파일 시간이 없습니다. 파일의 모든 스트림이 업데이트되면 파일의 파일 시간이 업데이트됩니다.

기회 잠금은 스트림별로 유지 관리됩니다. 공유 모드도 스트림별로 유지 관리됩니다. 파일에서 액세스 삭제가 요청되면 운영 체제가 파일의 열려 있는 모든 스트림에 대한 삭제 액세스를 확인합니다. 다른 프로세스가 FILE_SHARE_DELETE 권한 없이 스트림을 연 경우 액세스 삭제를 위해 파일을 열 수 없습니다.

복사되는 파일에 데이터 스트림이 있고 네트워크 리디렉터를 사용하는 경우 클라이언트에 읽기 권한과 읽기 특성 권한이 모두 있는 경우에만 파일을 복사할 수 있습니다.

스트림의 명명 규칙

Windows 셸 명령줄에서 지정된 경우 스트림의 전체 이름은 "myfile.dat:stream1:$DATA" 예제와 같이 "filename:stream name:stream type"입니다.

파일 이름에 적합한 문자는 공백을 포함하여 스트림 이름에도 적합합니다. 자세한 내용은 파일 이름 지정을 참조하세요. 스트림 형식(특성 형식 코드라고도 함)은 NTFS 파일 시스템 안에 속합니다. 따라서 사용자는 새 스트림 형식을 만들 수 없지만 기존 NTFS 파일 시스템 형식을 열 수 있습니다. 스트림 형식 지정자 값은 항상 달러 기호($)로 시작합니다. 스트림 형식의 목록은 아래를 참조하세요.

기본적으로 기본 데이터 스트림은 명명되지 않습니다. 기본 데이터 스트림을 완전히 지정하려면 "filename::$DATA"를 사용합니다. 여기서 $DATA 스트림 형식입니다. 이는 "filename"과 동일합니다. 파일 이름 지정 규칙을 사용하여 파일 안에 명명된 스트림을 만들 수 있습니다. "$DATA"는 유효한 스트림 이름입니다. 예를 들어 "sample"이라는 파일에서 "$DATA"라는 스트림의 전체 이름은 "sample:$DATA:$DATA"입니다. 동일한 파일에 "bar"라는 스트림을 만든 경우 전체 이름은 "sample:bar:$DATA"입니다.

한 문자 이름을 가진 파일들을 만들고 작업할 때는 파일 이름 앞에 마침표와 백슬래시로 이루어진 접두사(.\)를 추가하거나 정규화된 경로 이름을 사용합니다. 이 작업을 수행하는 이유는 Windows에서 한 문자 파일 이름을 드라이브 문자로 취급하기 때문입니다. 드라이브 문자를 상대 경로로 지정하면 콜론이 드라이브 문자와 경로를 구분합니다. 한 문자 이름이 드라이브 문자인지 파일 이름인지에 대한 모호성이 있는 경우 Windows는 드라이브 문자가 유효하지 않더라도 콜론 다음 문자열이 유효한 경로인 경우 드라이브 문자라고 가정합니다.

스트림 형식

다음은 특성 형식 코드라고도 하는 NTFS 스트림 형식의 목록입니다. 일부 스트림 형식은 NTFS 안에 속하며 해당 형식은 문서화되지 않았습니다.

스트림 형식 설명
::$ATTRIBUTE_LIST 파일을 구성하고 각 특성이 있는 위치를 식별하는 모든 특성의 목록을 포함합니다.
::$BITMAP 디렉터리의 b-트리 사용 가능한 공간을 관리하기 위해 인덱스에 의해 사용되는 비트맵입니다. b-tree는 클러스터 크기에 관계없이 4KB 청크로 관리되며 이러한 청크의 할당을 관리하는 데 사용됩니다. 이 스트림 형식은 모든 디렉터리에 존재합니다.
::$DATA 데이터 스트림입니다. 기본 데이터 스트림은 이름이 없습니다. FindFirstStreamWFindNextStreamW 함수를 사용하여 데이터 스트림을 열거할 수 있습니다.
::$EA 확장 특성 데이터를 포함합니다.
::$EA_INFORMATION 확장 특성에 대한 지원 정보를 포함합니다.
::$FILE_NAME 유니코드 문자로 된 파일의 이름입니다. 여기에는 파일의 짧은 이름과 하드 링크가 포함됩니다.
::$INDEX_ALLOCATION 디렉터리의 스트림 형식입니다. 큰 디렉터리에 대한 파일 이름 할당을 구현하는 데 사용됩니다. 이 스트림은 디렉터리 자체를 나타내며 디렉터리의 모든 데이터를 포함합니다. 이 유형의 스트림에 대한 변경 내용은 NTFS 변경 저널에 기록됩니다. $INDEX_ALLOCATION 스트림 형식의 기본 스트림 이름은 $I30이므로 "DirName", "DirName::$INDEX_ALLOCATION" 및 "DirName:$I30:$INDEX_ALLOCATION"은 모두 동일합니다.
::$INDEX_ROOT 이 스트림은 인덱스의 b-트리 루트를 나타냅니다. 이 스트림 형식은 모든 디렉터리에 존재합니다.
::$LOGGED_UTILITY_STREAM ::$DATA와 유사하지만 작업은 NTFS 변경 저널에 기록됩니다. EFS 및 트랜잭션 NTFS(TxF)에 의해 사용됩니다. EFS의 ":StreamName:$StreamType" 쌍은 ":$EFS:$LOGGED_UTILITY_STREAM"이고 TxF의 경우 에는 ":$TXF_DATA:$LOGGED_UTILITY_STREAM"입니다.
::$OBJECT_ID 링크 추적 서비스의 파일을 식별하는 데 사용되는 16 바이트 ID입니다.
::$REPARSE_POINT 재분석 지점 데이터입니다.

 

스트림 사용