FILE_RENAME_INFORMATION 구조체(ntifs.h)
FILE_RENAME_INFORMATION 구조체는 파일 이름을 바꾸는 데 사용됩니다.
구문
typedef struct _FILE_RENAME_INFORMATION {
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN10_RS1)
union {
BOOLEAN ReplaceIfExists; // FileRenameInformation
ULONG Flags; // FileRenameInformationEx
} DUMMYUNIONNAME;
#else
BOOLEAN ReplaceIfExists;
#endif
HANDLE RootDirectory;
ULONG FileNameLength;
WCHAR FileName[1];
} FILE_RENAME_INFORMATION, *PFILE_RENAME_INFORMATION;
멤버
DUMMYUNIONNAME
DUMMYUNIONNAME.ReplaceIfExists
지정된 이름의 파일이 이미 있는 경우 지정된 파일로 바꿔야 하므로 TRUE로 설정합니다. 지정된 이름의 파일이 이미 있는 경우 이름 바꾸기 작업이 실패하는 경우 FALSE로 설정합니다.
DUMMYUNIONNAME.Flags
이름 바꾸기 작업에 대한 플래그입니다. 이 필드는 FileRenameInformationEx 정보 클래스와 함께 사용할 때만 적용됩니다.
가능한 값은 다음과 같습니다.
값 | 의미 |
---|---|
FILE_RENAME_REPLACE_IF_EXISTS (0x00000001) | 지정된 이름의 파일이 이미 있는 경우 지정된 파일로 바꿔야 합니다. FileRenameInformation 정보 클래스와 함께 사용되는 ReplaceIfExists 필드에 해당합니다. |
FILE_RENAME_POSIX_SEMANTICS (0x00000002) | FILE_RENAME_REPLACE_IF_EXISTS 지정한 경우 기존 핸들이 있더라도 파일을 바꿀 수 있습니다. 대체된 파일에 대한 기존 핸들은 읽기 및 쓰기와 같은 작업에 계속 유효합니다. 이후에 대상 이름이 열리면 바뀐 파일이 아니라 이름이 바뀐 파일이 열립니다. |
FILE_RENAME_SUPPRESS_PIN_STATE_INHERITANCE (0x00000004) | 파일 이름을 새 디렉터리로 바꾸는 경우 파일의 FILE_ATTRIBUTE_PINNED 및 FILE_ATTRIBUTE_UNPINNED 특성과 관련된 상속 규칙을 표시하지 않습니다. |
FILE_RENAME_SUPPRESS_STORAGE_RESERVE_INHERITANCE (0x00000008) | 파일 이름을 새 디렉터리로 바꾸는 경우 파일의 스토리지 예약 ID 속성과 관련된 상속 규칙을 표시하지 않습니다. |
FILE_RENAME_NO_INCREASE_AVAILABLE_SPACE (0x00000010) | FILE_RENAME_SUPPRESS_STORAGE_RESERVE_INHERITANCE 지정하지 않은 경우 파일의 이름을 새 디렉터리로 바꾸는 경우 필요에 따라 영향을 받는 스토리지 예약 영역의 크기를 자동으로 조정하여 볼륨의 여유 공간이 증가하지 않도록 합니다. 볼륨 액세스를 관리해야 합니다. |
FILE_RENAME_NO_DECREASE_AVAILABLE_SPACE (0x00000020) | FILE_RENAME_SUPPRESS_STORAGE_RESERVE_INHERITANCE 지정하지 않은 경우 파일의 이름을 새 디렉터리로 바꾸는 경우 필요에 따라 영향을 받는 스토리지 예약 영역의 크기를 자동으로 조정하여 볼륨의 여유 공간이 줄어들지 않도록 합니다. 볼륨 액세스를 관리해야 합니다. |
FILE_RENAME_PRESERVE_AVAILABLE_SPACE (0x00000030) | FILE_RENAME_NO_INCREASE_AVAILABLE_SPACE 및 FILE_RENAME_NO_DECREASE_AVAILABLE_SPACE 모두 지정하는 것과 같습니다. |
FILE_RENAME_IGNORE_READONLY_ATTRIBUTE (0x00000040) | FILE_RENAME_REPLACE_IF_EXISTS 지정한 경우 읽기 전용인 경우에도 파일을 바꿀 수 있습니다. 대체된 파일에 대한 WRITE_ATTRIBUTES 액세스 권한이 필요합니다. |
FILE_RENAME_FORCE_RESIZE_TARGET_SR (0x00000080) | FILE_RENAME_SUPPRESS_STORAGE_RESERVE_INHERITANCE 지정하지 않은 경우 파일 이름을 다른 스토리지 예약 영역의 일부인 새 디렉터리로 바꿀 때 항상 대상 디렉터리의 스토리지 예약 영역을 이름을 바꿀 파일의 전체 크기로 확장합니다. 볼륨 액세스를 관리해야 합니다. |
FILE_RENAME_FORCE_RESIZE_SOURCE_SR (0x00000100) | FILE_RENAME_SUPPRESS_STORAGE_RESERVE_INHERITANCE 지정하지 않은 경우 파일 이름을 다른 스토리지 예약 영역의 일부인 새 디렉터리로 바꿀 때 항상 원본 디렉터리의 스토리지 예약 영역을 이름이 바뀐 파일의 전체 크기로 축소합니다. 볼륨 액세스를 관리해야 합니다. |
FILE_RENAME_FORCE_RESIZE_SR (0x00000180) | FILE_RENAME_FORCE_RESIZE_TARGET_SR 및 FILE_RENAME_FORCE_RESIZE_SOURCE_SR 모두 지정하는 것과 같습니다. |
ReplaceIfExists
지정된 이름의 파일이 이미 있는 경우 지정된 파일로 바꿔야 하므로 TRUE로 설정합니다. 지정된 이름의 파일이 이미 있는 경우 이름 바꾸기 작업이 실패하는 경우 FALSE로 설정합니다.
RootDirectory
IopOpenLinkOrRenameTarget에서 대상 디렉터리를 여는 데 사용하는 핸들입니다.
파일이 다른 디렉터리로 이동되지 않거나 FileName 멤버에 전체 경로 이름이 포함된 경우 이 멤버는 NULL입니다. 그렇지 않으면 파일 이름이 변경된 후 상주할 루트 디렉터리에 대한 핸들입니다.
공유 충돌을 일으키지 않는 두 개의 열린 작업을 수행하려면 트래버스를 요청하여 RootDirectory 를 열 수 있습니다. | read-attribute. 그런 다음 IopOpenLinkOrRenameTarget 에서 FILE_WRITE_DATA 요청하여 상대 열기를 수행할 수 있습니다. | 동기화. 이 두 개의 열기는 공유 충돌을 일으키지 않습니다.
FileNameLength
파일의 새 이름의 길이(바이트)입니다.
FileName[1]
파일의 새 이름을 포함하는 와이드 문자열의 첫 번째 문자입니다. 이 뒤에는 나머지 문자열이 메모리에서 수행됩니다. RootDirectory 멤버가 NULL이고 파일이 다른 디렉터리로 이동되는 경우 이 멤버는 파일에 할당할 전체 경로 이름을 지정합니다. 그렇지 않으면 파일 이름 또는 상대 경로 이름만 지정합니다.
설명
FILE_RENAME_INFORMATION 구조체는 파일 이름을 바꾸는 데 사용됩니다. 이 작업은 다음 방법 중 하나로 수행할 수 있습니다.
FltSetInformationFile 또는 ZwSetInformationFile을 호출하여 FileRenameInformation을 FileInformationClass 값으로 전달하고 FileInformation 값에 대한 FILE_RENAME_INFORMATION 구조로 형식이 지정된 호출자 할당 버퍼를 전달합니다. FileHandle 매개 변수는 이름을 바꿀 파일을 지정합니다.
주 함수 코드 IRP_MJ_SET_INFORMATION 사용하여 IRP를 만듭니다.
파일 시스템 미니필터는 파일 이름을 바꾸려면 ZwSetInformationFile이 아닌 FltSetInformationFile을 사용해야 합니다.
파일 이름을 변경하려면 디렉터리 항목을 현재 부모 디렉터리에서 제거할 수 있도록 파일에 대한 DELETE 액세스 권한과 새 부모 디렉터리 파일에 새 항목을 만들 수 있는 적절한 액세스 권한이 필요합니다.
FileName 멤버의 파일 이름 문자열은 다음 양식 중 하나로 지정해야 합니다.
간단한 파일 이름입니다. RootDirectory 멤버는 NULL입니다. 이 경우 파일의 이름은 단순히 동일한 디렉터리 내에서 변경됩니다. 즉, 이름 바꾸기 작업은 파일의 이름을 변경하지만 해당 위치는 변경하지 않습니다.
정규화된 파일 이름입니다. RootDirectory 멤버는 NULL입니다. 이 경우 이름 바꾸기 작업은 파일의 이름과 위치를 변경합니다.
상대 파일 이름입니다. 이 경우 RootDirectory 멤버에는 이름 바꾸기 작업에 대한 대상 디렉터리에 대한 핸들이 포함됩니다. 파일 이름 자체는 간단한 파일 이름이어야 합니다.
작업 이름 바꾸기에 대한 일반 규칙:
파일 또는 디렉터리의 이름은 볼륨 내에서만 바꿀 수 있습니다. 즉, 이름 바꾸기 작업으로 인해 파일 또는 디렉터리가 다른 볼륨으로 이동될 수 없습니다.
볼륨의 루트 디렉터리의 이름을 바꿀 수 없습니다.
ReplaceIfExists가 FALSE로 설정되고 대상이 있으면 이름 바꾸기 작업이 실패합니다.
ReplaceIfExists가 TRUE로 설정되어 있더라도 이름이 같은 파일이 이미 있고 디렉터리, 읽기 전용 파일 또는 현재 실행 중인 파일인 경우에도 이름 바꾸기 작업이 실패합니다.
볼륨이 CDFS 볼륨 또는 읽기 전용 NTFS 볼륨과 같은 읽기 전용 볼륨인 경우 볼륨의 파일 및 디렉터리의 이름을 바꿀 수 없습니다.
열려 있는 파일의 이름을 바꾸기 위한 특수 규칙:
열려 있는 핸들이 있는 경우 파일의 이름을 바꿀 수 없습니다. 단, 일괄 처리 기회 잠금(oplock)으로 인해 열려 있고 일괄 처리 oplock이 즉시 끊어질 수 있는 경우가 아니면 파일의 이름을 바꿀 수 없습니다.
이름이 같은 파일이 있고 열려 있는 핸들이 있는 경우 파일의 이름을 바꿀 수 없습니다(앞에서 설명한 batch-oplock 사례 제외).
디렉터리 또는 해당 하위 디렉터리에 열려 있는 핸들이 있는 파일이 포함되어 있으면 디렉터리의 이름을 바꿀 수 없습니다(앞에서 설명한 batch-oplock 사례 제외).
NTFS 데이터 스트림의 이름을 바꾸기 위한 특수 규칙:
기본 디렉터리 스트림의 이름을 바꿀 수 없습니다.
스트림의 새 이름은 콜론(:))으로 시작해야 합니다.
데이터 스트림은 동일한 파일 내에서 만 이름을 바꿀 수 있습니다. 즉, 이름 바꾸기 작업으로 인해 데이터 스트림이 다른 파일로 이동될 수 없습니다.
디렉터리의 데이터 스트림 이름을 기본 데이터 스트림으로 바꿀 수 없습니다.
ReplaceIfExists가 TRUE로 설정된 경우 이름이 같은 스트림이 없거나 길이가 0인 데이터 스트림인 경우에만 이름 바꾸기 작업이 성공합니다.
기본 데이터 스트림의 "이름 바꾸기"는 허용되지만 길이가 0인 기본 데이터 스트림 뒤에 남겨 두므로 실제 이름 바꾸기는 아닙니다.
ZwSetInformationFile 또는 FltSetInformationFile에 전달된 FileInformation 버퍼의 크기는 = sizeof(FILE_RENAME_INFORMATION)와 FileName 문자열의 크기(바이트)여야 합니다.>
요구 사항
요구 사항 | 값 |
---|---|
헤더 | ntifs.h(Ntifs.h, Fltkernel.h 포함) |