정보: FILE_FLAG_WRITE_THROUGH 및 FILE_FLAG_NO_BUFFERING

요약

Createfile ()에 FILE_FLAG_WRITE_THROUGH 플래그 하면 해당 핸들에 모든 쓰기를 버퍼링 되지 않고 파일에 직접 쓸 수 있습니다. 데이터 캐싱 (디스크 캐시에 저장 됨); 그러나 파일에 직접 기록 계속 됩니다. 이 메서드를 사용 하면 (이것은) 하는 경우 캐시 된 데이터의 읽기 요청을 처리 하는 해당 데이터에 대해 읽기 작업, 것이 아니라, 실행 파일을 읽어 데이터를 가져올 수 있습니다. 데이터 파일에 기록 됩니다 때까지 쓰기 호출을 반환 합니다. 원격 쓰기도-이 적용 서버 데이터 파일에 기록 됩니다 때까지 쓰기 요청을 수행할 필요가 알 수 있도록 서버에는 FILE_FLAG_WRITE_THROUGH 플래그 네트워크 리디렉터가 전달 합니다.


해당 FILE_FLAG_NO_BUFFERING이 개념이 한 단계 더 걸리며 모든 읽기 파일에서 및 시스템 버퍼 또는 디스크 캐시에서 아닌 상태로 항상 있도록 미리 읽기 파일 버퍼링 및 디스크, 캐싱을 모두 제거 합니다. FILE_FLAG_NO_BUFFERING를 사용 하면 디스크 읽기 및 쓰기를 섹터 경계에 이루어져야 합니다. 버퍼 주소를 메모리에 디스크 섹터 경계에 정렬 되어야 합니다.


이러한 제한 사항은 읽기에 전달 하거나 API 쓸 하면 버퍼 I/O 장치 수준에 직접 사용 되기 때문에 필요 해당 수준의 사용자 버퍼 주소가 및 섹터 크기에서 실행 중인 하드웨어의 프로세서 및 미디어 맞춤 제한을 충족 해야 합니다.

자세한 내용

Windows 95 CDFS (CD-ROM 파일 시스템)는 createfile ()에 대 한 FILE_FLAG_NO_BUFFERING 플래그를 지원 하지 않습니다. VFAT 같은 Windows 95 FSD를 구현할 수 있습니다 FILE_FLAG_NO_BUFFERING 플래그 필요한 파일 시스템 드라이버를 아닙니다 하 고 CDFS 지원 하지 않습니다.


이 코드 조각에서는 버퍼의 데이터를 섹터 맞춤 및 createfile ()에 전달 하는 방법을 보여 줍니다.

  char buf[2 * SECTOR_SIZE - 1], *p;
p = (char *) ((DWORD) (buf + SECTOR_SIZE - 1) & ~(SECTOR_SIZE - 1));
h = CreateFile(argv[1], GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING, NULL);
WriteFile(h, p, SECTOR_SIZE, &dwWritten, NULL);


포인터 p 섹터 단위로 맞춰져 이며 버퍼에 가리킵니다.


현재 논리 드라이브에 열려 있는 모든 파일을 플러시할 상황에 있을 경우이 의해 수행할 수 있습니다.

   hFile = CreateFile("\\\\.\\c:", ....);   FlushFileBuffers(hFile);

이 방법을 사용 하면 모든 버퍼링 된 쓰기 데이터를 c: 파티션에 플러시되고 디스크에 기록 하는 열려 있는 모든 파일에 대 한. Note 여 아닌 다른 시스템 버퍼링은 영향을 받지 않도록이 플러시; 버퍼링 C 런타임 C 런타임 루틴을 사용 하 여 연 파일에서 수행 하 고 모든 가능한 파일 영향 을지 않습니다.


네트워크를 통해 원격 파일을 열 때 서버 항상 캐시 하 고 클라이언트에서 지정한 없음 버퍼링 플래그는 무시 합니다. 이것은 의도적인 것입니다. 리디렉터 및 서버 네트워크 FILE_FLAG_NO_BUFFERING의 전체 의미를 제대로 구현할 수 없습니다. 특히, 섹터 크기, 섹터 단위로 맞춰져 i/o 요구 사항을 충족할 수 없습니다. 따라서 Win32 기반 응용 프로그램에서 FILE_FLAG_NO_BUFFERING에 물어보면, 리디렉터 및 서버 작업 하듯이 요청으로 FILE_FLAG_WRITE_THROUGH에 대 한. 파일이 클라이언트에서 캐시 되지 않습니다 하 고 쓰기 이동한 서버에 직접 디스크에 서버에 네트워크에서 읽기/쓰기 크기는 정확히 어떤 응용 프로그램을 요청 합니다. 그러나 파일 서버에서 캐시 됩니다.


없는 클라이언트 캐싱 I/O 유형에 따라 다른 효과 가질 수 있습니다. 또한의 크기를 줄일 수 있지만 캐시 적중 제거 하거나, 미리 읽기를 전송 하 고 수신 합니다. 일반적으로 순차 I/O에 대 한 클라이언트 캐시에 좋은 방법입니다. 소규모, 임의 액세스 I/O 위한 것이 가장 좋습니다 캐시에 없습니다.
속성

문서 ID: 99794 - 마지막 검토: 2017. 1. 12. - 수정: 1

피드백