728x90

파일 읽기는 자주 사용하실 것인데..
CFile::Read를 사용하여도 되지만 속도 문제때문에
메모리 맵 파일을 이용한 파일 읽기 방법을 올려 들립니다..
 
  1. BOOL OpenFiles(LPCSTR lpszPathName)   
  2. {   
  3. DWORD dwFileSize;   
  4. HANDLE hFile, hFileMap;   
  5. LPVOID lpvFile;   
  6.   
  7. hFile = ::CreateFile(lpszPathName, GENERIC_READ , 0, NULL   
  8. OPEN_EXISTING, FILE_ATTRIBUTTE_NORMAL, NULL);   
  9. if(hFile == INVALID_HANDLE_VALUE) {   
  10. //여기에서 에러 메세지 처리..   
  11. }   
  12. dwFileSize = ::GetFileSize(hFile, NULL);   
  13.   
  14. hFileMap = CreateFileMapping(hFile, NULL, PAGE_WRITECOPY, 0,   
  15. dwFileSize, NULL);   
  16.   
  17. if(hFileMap == NULL) {   
  18. CloseHandle(hFile);   
  19. //여기에서 에러 메세지 처리..   
  20. }   
  21.   
  22. lpFile = MapViewOfFile(hFileMap, FILE_MAP_COPY, 0,0,0);   
  23.   
  24. if(lpFile == NULL) {   
  25. CloseHandle(hFile);   
  26. CloseHandle(hFileMap);   
  27. //여기에서 에러 처리   
  28. }   
  29. }   


이렇게 하면.. 대용량의 파일을 빠르게 읽을 수 있습니다..


위의 예제는 메모리 맵파일을 이용한건데 좀 복잡해 보이나요 ??
이번에는 메모리 맵파일을 이용한 방법외에 간단한 방법이 있어서 올려봅니다.

그냥 도스용 시절에 사용했던 fread함수를 사용한 것입니다.
물론 fread대신 다른 파일 읽기 함수를 사용해도 됩니다.

 
  1. char *ReadFile( char *FileName )   
  2. {   
  3. FILE *fp;   
  4. int FileSize;   
  5. char *buffer;   
  6.   
  7. try {   
  8. fp = fopen( FileName, "rb" );   
  9. if( !fp ) throw "File Not Found!";   
  10.   
  11. FileSize = filelength( fileno(fp) );   
  12. buffer = new char [FileSize+1];   
  13. fread( buffer, FileSize, 1, fp );   
  14. *(buffer + FileSize) = 0;   
  15. fclose( fp );   
  16. return buffer;    
  17. }   
  18. catchchar *msg ) {   
  19. printf( msg );   
  20. return NULL;   
  21. }   
  22. }   

    출처 : http://webdizen.new21.net

+ Recent posts