CreateFile()을 호출해도 대상 파일의 내용을 버퍼링하거나 읽지 않습니다. 또한
DWORD cbRead;
BYTE buffer[1024];
HANDLE hFile = ::CreateFile(filename,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
::ReadFile(hFile, sizeof(buffer), &cbRead, NULL);
::CloseHandle(hFile);
당신의 임의의 부분을 읽으려면 : CreateFile이()를 호출 한 후에 예제는 파일의 첫 번째 킬로바이트를 읽을 원하는 파일의 어떤 부분을 얻기 위해 ReadFile()를 호출해야합니다
DWORD cbRead;
BYTE buffer[1024];
HANDLE hFile = ::CreateFile(filename,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
::SetFilePointer(hFile, 1024 * 1024, NULL, FILE_BEGIN);
::ReadFile(hFile, sizeof(buffer), &cbRead, NULL);
::CloseHandle(hFile);
당신은 물론, SetFilePointer를() 및 ReadFile을을 (호출 할 수 있습니다) 여러 번 : 파일, 당신은 일킬로바이트 파일에 일메가바이트를 시작 읽을 예를 들어, ReadFile을()를 호출하기 전에 SetFilePointer()을 사용할 수 있습니다 파일이 열려있는 동안 원하는대로 ReadFile() 호출은 파일 포인터를 ReadFile()이 읽은 마지막 바이트 바로 다음의 바이트로 암시 적으로 설정합니다.
또한 사용하는 File Management Functions에 대한 설명서를 읽고 반환 값을 적절하게 검사하여 발생할 수있는 오류를 잡아 두어야합니다.
Windows는 자유 재량에 따라 열려있는 파일의 내용을 캐시하기 위해 사용 가능한 시스템 메모리를 사용할 수 있지만 실행중인 프로그램에서 메모리가 필요한 경우이 프로세스로 캐시 된 데이터는 삭제됩니다 (결국 캐시 된 데이터는 필요한 경우 디스크에서 다시 읽음).
왜'CreateFile'가 전체 파일을 메모리에 저장한다고 생각합니까? –
@pavel 좋은 점 CreateFileW는 전체 파일을 메모리에 버퍼링하지 않습니다. 꽤 많은 파일을 처리합니다. 이 핸들을 사용하여 전체 파일 또는 파일의 일부 (선택한 부분)를 읽을 수 있습니다. – leeeroy
맞아요, 방금 내가 수동으로보고 있던 코드가 모든 것을 메모리에 저장 했으므로, 거대한 발자국임을 깨달았습니다. 그래서 이것은 레거시 코드, grr을 다루는 것 같은 느낌입니다 ... –