SetFileValidData 함수(fileapi.h)
지정된 파일의 유효한 데이터 길이를 설정합니다. 이 함수는 매우 제한된 시나리오에서 유용합니다. 자세한 내용은 주의 섹션을 참조하세요.
구문
BOOL SetFileValidData(
[in] HANDLE hFile,
[in] LONGLONG ValidDataLength
);
매개 변수
[in] hFile
파일에 대한 핸들입니다. 파일은 GENERIC_WRITE 액세스 권한으로 열려 있어야 하며 SE_MANAGE_VOLUME_NAME 권한이 활성화되어 있어야 합니다. 자세한 내용은 파일 보안 및 액세스 권한을 참조하세요.
[in] ValidDataLength
유효한 새 데이터 길이입니다.
이 매개 변수는 현재 유효한 데이터 길이보다 크지만 현재 파일 크기보다 작은 양수 값이어야 합니다.
반환 값
함수가 성공하면 반환 값이 0이 아닙니다.
함수가 실패하면 반환 값은 0입니다. 확장 오류 정보를 가져오려면 GetLastError를 호출합니다.
설명
SetFileValidData 함수는 파일의 논리적 끝을 설정합니다. 파일 크기를 설정하려면 SetEndOfFile 함수를 사용합니다. 실제 파일 크기를 파일의 끝이라고도 합니다.
각 파일 스트림에는 다음과 같은 속성이 있습니다.
- 파일 크기: 파일의 데이터 크기에서 바이트까지의 크기입니다.
- 할당 크기: 디스크의 파일에 할당되는 공간의 크기이며, 이는 항상 클러스터 크기의 짝수 배수입니다.
- 유효한 데이터 길이: 실제로 기록된 파일의 데이터 길이를 바이트에 지정합니다. 이 값은 항상 파일 크기보다 작거나 같습니다.
SetFileValidData 함수를 사용하면 파일에 순차적으로 쓸 때 데이터가 0으로 채워지는 것을 방지할 수 있습니다. 함수는 파일에 쓰지 않고 파일의 데이터를 유효하게 만듭니다. 따라서 일부 성능 향상이 실현될 수 있지만, 기존 파일의 디스크에 있는 기존 데이터를 의도하지 않은 판독기에서 실수로 사용할 수 있게 될 수 있습니다. 다음 단락에서는 이 잠재적인 보안 및 개인 정보 문제에 대한 자세한 설명을 제공합니다.
호출자는 파일을 처음 열 때 SE_MANAGE_VOLUME_NAME 권한을 사용하도록 설정해야 합니다. 애플리케이션은 SE_MANAGE_VOLUME_NAME 액세스 권한이 있는 엔터티에 대한 액세스를 제한하는 파일에서만 SetFileValidData를 호출해야 합니다. 애플리케이션은 파일의 기록되지 않은 범위가 노출되지 않도록 해야 합니다. 그렇지 않으면 다음과 같이 보안 문제가 발생할 수 있습니다.
SetFileValidData를 파일에서 사용하는 경우 파일에 할당된 클러스터를 0으로 채우지 않으면 잠재적인 성능 향상을 얻을 수 있습니다. 따라서 파일에서 읽으면 할당된 클러스터에 포함된 모든 내용과 다른 사용자의 콘텐츠가 반환됩니다. 호출자가 SetFileValidData가 성공하려면 SE_MANAGE_VOLUME_NAME 권한이 있어야 하며 이러한 사용자가 디스크의 모든 데이터를 읽을 수 있기 때문에 이 시점에서 반드시 보안 문제가 되는 것은 아닙니다. 그러나 이 호출자는 다음이 유지되는 경우 SE_MANAGE_VOLUME_PRIVILEGE 권한을 얻을 수 없는 다른 사용자에게 이 데이터를 실수로 노출할 수 있습니다.
- 다른 판독기를 거부하는 공유 모드로 파일을 열지 않은 경우 권한이 없는 사용자가 파일을 열고 노출된 데이터를 읽을 수 있습니다.
- 호출자가 호출에 제공된 ValidDataLength 작성을 완료하기 전에 시스템이 응답을 중지하면 다시 부팅 시 해당 권한이 없는 사용자가 파일을 열고 노출된 콘텐츠를 읽을 수 있습니다.
SetFileValidData 호출자가 적절하게 제한적인 액세스 제어를 사용하여 파일을 연 경우 이전 조건이 적용되지 않습니다. 그러나 SetFileValidData 로 확장된 부분적으로 작성된 파일(즉, 호출에서 제공된 ValidDataLength 까지 쓰기가 완료되지 않음)의 경우 또 다른 잠재적인 개인 정보 보호 또는 보안 취약성이 있습니다. 관리자는 제한된 ACL 권한으로 제대로 제어되지 않는 대상에 파일을 복사하여 확장 영역의 데이터를 무단 읽기에 실수로 노출할 수 있습니다.
이러한 이유로 SetFileValidData 는 아래에 설명된 대로 성능 고려 사항 외에도 범용 용도로 권장되지 않습니다.
보안 및 액세스 권한에 대한 자세한 내용은 특별 권한으로 실행 및 파일 보안 및 액세스 권한을 참조하세요.
SetFileValidData 함수를 사용하여 매우 구체적인 상황에서 대용량 파일을 만들 수 있으므로 후속 파일 I/O의 성능이 다른 메서드보다 더 좋을 수 있습니다. 특히 파일의 확장 부분이 크고 애플리케이션의 데이터베이스 형식과 같이 임의로 기록되는 경우 파일을 확장하고 쓰는 데 걸리는 시간이 SetEndOfFile 을 사용하고 임의로 작성하는 것보다 빠릅니다. 대부분의 다른 상황에서는 일반적으로 SetFileValidData를 사용하는 데 성능이 향상되지 않으며 경우에 따라 성능 저하가 발생할 수 있습니다.
Windows 8 및 Windows Server 2012에서 이 함수는 다음 기술을 통해 지원됩니다.
기술 | 지원됨 |
---|---|
SMB(서버 메시지 블록) 3.0 프로토콜 | Yes |
SMB 3.0 TFO(투명 장애 조치(failover)) | Yes |
SO(스케일 아웃 파일 공유)를 사용하는 SMB 3.0 | Yes |
CsvFS(클러스터 공유 볼륨 파일 시스템) | Yes |
ReFS(Resilient File System) | Yes |
요구 사항
지원되는 최소 클라이언트 | Windows XP [데스크톱 앱만 해당] |
지원되는 최소 서버 | Windows Server 2003 [데스크톱 앱만 해당] |
대상 플랫폼 | Windows |
헤더 | fileapi.h(Windows.h 포함) |
라이브러리 | Kernel32.lib |
DLL | Kernel32.dll |