bool file_copy_using_memory_map2( _In_ const wchar_t* src_file, _In_ const wchar_t* dst_file ) { _ASSERTE(NULL != src_file); _ASSERTE(NULL != dst_file); if (NULL == src_file || NULL == dst_file) return false; if (!is_file_existsW(src_file)) { print("err ] no src file = %ws", src_file); return false; } if (is_file_existsW(dst_file)) { DeleteFileW(dst_file); } // map src, dst file pmap_context src_ctx = open_map_context(src_file); pmap_context dst_ctx = create_map_context(dst_file, src_ctx->size); if (NULL == src_ctx || NULL == dst_ctx) { print("err ] open_map_context() failed."); close_map_context(src_ctx); close_map_context(dst_ctx); return false; } // copy src to dst by mmio uint32_t i = 0; uint32_t bs = 0; uint32_t rest = src_ctx->size; while (0 < rest) { if (rest > 4096) { bs = 4096; rest -= 4096; } else { bs = rest; rest = 0; } RtlCopyMemory(&dst_ctx->view[i], &src_ctx->view[i], bs); i += bs; } return true; }
bool create_bob_txt() { wchar_t *buf = getCurrentDir(); // current dir \\ bob.txt 파일명 생성 wchar_t file_name[260]; if (!SUCCEEDED(StringCbPrintfW( // safe하도록 모든 boundary check를 다 해주는 API file_name, sizeof(file_name), L"%ws\\bob.txt", buf))) { print("err, cannot create file name"); free(buf); return false; } free(buf); buf = NULL; if (true == is_file_existsW(file_name)) { ::DeleteFileW(file_name); } // 파일 생성 HANDLE file_handle = CreateFileW( file_name, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); if (file_handle == INVALID_HANDLE_VALUE) { print("err, CreateFile(path=%ws), gle=0x%08x", file_name, GetLastError()); return false; } // 파일에 데이터 쓰기 DWORD cbWritten = 0; BYTE ByteOrderMark[] = { 0xEF, 0xBB, 0xBF }; if (TRUE != WriteFile(file_handle, ByteOrderMark, sizeof(ByteOrderMark), &cbWritten, NULL)) { print("err, BOM writing failed, gle=0x%08x", GetLastError()); CloseHandle(file_handle); return false; } wchar_t file_content[] = L"안녕하십니까. 이 테이프는 2015학년도 대학수학능력시험 언어 영역 듣기 평가 안내 녹음테이프입니다. 지금부터 2015학년도 대학수학능력시험 1교시 언어 영역 듣기 방송을 시작하겠습니다."; char *utf8_file_content = WcsToMbsUTF8(file_content); WriteFile(file_handle, utf8_file_content, strlen(utf8_file_content), &cbWritten, NULL); wchar_t file_content2[] = L"'Cause baby now we got bad blood. You know it used to be mad love. So take a look what you've done. 'Cause baby now we got bad blood."; utf8_file_content = WcsToMbsUTF8(file_content2); WriteFile(file_handle, utf8_file_content, strlen(utf8_file_content), &cbWritten, NULL); free(utf8_file_content); // 파일 닫기 CloseHandle(file_handle); return true; }
/** * @brief * @param * @see * @remarks * @code * @endcode * @return **/ bool is_file_existsA(_In_ const char* file_path) { WCHAR* wcs = MbsToWcs(file_path); if (NULL == wcs) { return false; } bool ret = is_file_existsW(wcs); free(wcs); return ret; }
/** * @brief * @param * @see * @remarks * @code * @endcode * @return **/ bool file_copy_using_memory_map( _In_ const wchar_t* src_file, _In_ const wchar_t* dst_file ) { _ASSERTE(NULL != src_file); _ASSERTE(NULL != dst_file); if (NULL == src_file || NULL == dst_file) return false; if (!is_file_existsW(src_file)) { print("err ] no src file = %ws", src_file); return false; } if (is_file_existsW(dst_file)) { DeleteFileW(dst_file); } // map src, dst file pmap_context src_ctx = open_map_context(src_file); pmap_context dst_ctx = create_map_context(dst_file, src_ctx->size); if (NULL == src_ctx || NULL == dst_ctx) { print("err ] open_map_context() failed."); close_map_context(src_ctx); close_map_context(dst_ctx); return false; } // copy src to dst by mmio for (uint32_t i = 0; i < src_ctx->size; ++i) { dst_ctx->view[i] = src_ctx->view[i]; } close_map_context(src_ctx); close_map_context(dst_ctx); return true; }
/** * @brief * @param * @see * @remarks * @code * @endcode * @return **/ bool analyzer::initialize(_In_ const wchar_t* db_path) { _ASSERTE(NULL != db_path); if (NULL == db_path) return false; if (true != is_file_existsW(db_path)) { log_err L"no db file, path = %s", db_path log_end return false; }
/** * @brief 존재하는 db 파일을 오픈한다. * @param * @see * @remarks * @code * @endcode * @return **/ bool CLocalDb::initialize(_In_ std::wstring& local_db_path) { if (true == _initialized) return true; if (true != is_file_existsW(local_db_path.c_str())) { log_info L"[CLocalDb::initialize] db does not exist. file = %s", local_db_path.c_str() log_end return false; }
/**---------------------------------------------------------------------------- \brief 파일 IO 를 위해 파일을 오픈한다. \param \return \code \endcode -----------------------------------------------------------------------------*/ DTSTATUS FileIoHelper::FIOpenForRead( IN std::wstring FilePath ) { if (TRUE == Initialized()) { FIOClose(); } mReadOnly = TRUE; if (TRUE != is_file_existsW(FilePath.c_str())) { log_err "no file exists. file=%ws", FilePath.c_str() log_end return DTS_NO_FILE_EXIST; }
/** * @brief * @param * @see * @remarks * @code * @endcode * @return **/ int _tmain(int argc, _TCHAR* argv[]) { if (argc!= 2) { show_usage(argv[0]); return -1; } // check driver file exists wchar_t* driver_path = argv[1]; if (true != is_file_existsW(driver_path)) { log_err L"file does not exists. file = %s", driver_path log_end return -1; }
/** * @brief * @param * @see * @remarks * @code * @endcode * @return **/ bool create_very_big_file(_In_ const wchar_t* file_path, _In_ uint64_t size_in_mb) { _ASSERTE(NULL != file_path); if (NULL == file_path) return false; if (is_file_existsW(file_path)) { ::DeleteFileW(file_path); } // create very big file HANDLE file_handle = CreateFile( file_path, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL ); if (INVALID_HANDLE_VALUE == file_handle) { print("err ] CreateFile( %ws ) failed. gle = %u", file_path, GetLastError()); return false; } LARGE_INTEGER file_size = { 0 }; //file_size.LowPart = 0; //file_size.HighPart = 1; file_size.QuadPart = (1024 * 1024) * size_in_mb; if (!SetFilePointerEx(file_handle, file_size, NULL, FILE_BEGIN)) { print("err ] SetFilePointerEx() failed. gle = %u", GetLastError()); CloseHandle(file_handle); return false; } SetEndOfFile(file_handle); CloseHandle(file_handle); return true; }
/** * @brief * @param * @see * @remarks * @code * @endcode * @return **/ pmap_context create_map_context(_In_ const wchar_t* file_path, _In_ uint32_t file_size) { _ASSERTE(NULL != file_path); if (NULL == file_path) return false; if (is_file_existsW(file_path)) { DeleteFileW(file_path); } pmap_context ctx = (pmap_context)malloc(sizeof(map_context)); RtlZeroMemory(ctx, sizeof(map_context)); bool ret = false; #pragma warning(disable: 4127) do { ctx->handle = CreateFileW( (LPCWSTR)file_path, GENERIC_READ | GENERIC_WRITE, NULL, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL ); if (INVALID_HANDLE_VALUE == ctx->handle) { print("err ] CreateFile( %ws ) failed. gle = %u", file_path, GetLastError()); break; } ctx->size = file_size; ctx->map = CreateFileMapping( ctx->handle, NULL, PAGE_READWRITE, 0, ctx->size, NULL ); if (NULL == ctx->map) { print("err ] CreateFileMapping( %ws ) failed. gle = %u", file_path, GetLastError()); break; } ctx->view = (PCHAR)MapViewOfFile( ctx->map, FILE_MAP_WRITE, 0, 0, ctx->size ); if (ctx->view == NULL) { print("err ] MapViewOfFile( %ws ) failed. gle = %u", file_path, GetLastError()); break; } ret = true; } while (FALSE); #pragma warning(default: 4127) if (!ret) { if (NULL != ctx->view) UnmapViewOfFile(ctx->view); if (NULL != ctx->map) CloseHandle(ctx->map); if (INVALID_HANDLE_VALUE != ctx->handle) CloseHandle(ctx->handle); free(ctx); ctx = NULL; } return ctx; }
/** * @brief * @param * @see * @remarks * @code * @endcode * @return **/ bool read_file_using_memory_map() { // current directory 를 구한다. wchar_t *buf = NULL; uint64_t buflen = 0; buflen = GetCurrentDirectoryW(buflen, buf); if (0 == buflen) { print("err ] GetCurrentDirectoryW() failed. gle = 0x%08x", GetLastError()); return false; } buf = (PWSTR)malloc(sizeof(WCHAR) * buflen); if (0 == GetCurrentDirectoryW(buflen, buf)) { print("err ] GetCurrentDirectoryW() failed. gle = 0x%08x", GetLastError()); free(buf); return false; } // current dir \\ test.txt 파일명 생성 wchar_t file_name[260]; if (!SUCCEEDED(StringCbPrintfW( file_name, sizeof(file_name), L"%ws\\test.txt", buf))) { print("err ] can not create file name"); free(buf); return false; } free(buf); buf = NULL; if (true != is_file_existsW(file_name)) { print("err ] no file exists. file = %ws", file_name); return false; } HANDLE file_handle = CreateFileW( (LPCWSTR)file_name, GENERIC_READ, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if (INVALID_HANDLE_VALUE == file_handle) { print("err ] CreateFile(%ws) failed, gle = %u", file_name, GetLastError()); return false; } // check file size // LARGE_INTEGER fileSize; if (TRUE != GetFileSizeEx(file_handle, &fileSize)) { print("err ] GetFileSizeEx(%ws) failed, gle = %u", file_name, GetLastError()); CloseHandle(file_handle); return false; } // [ WARN ] // // 4Gb 이상의 파일의 경우 MapViewOfFile()에서 오류가 나거나 // 파일 포인터 이동이 문제가 됨 // FilIoHelperClass 모듈을 이용해야 함 // _ASSERTE(fileSize.HighPart == 0); if (fileSize.HighPart > 0) { print("file size = %I64d (over 4GB) can not handle. use FileIoHelperClass", fileSize.QuadPart); CloseHandle(file_handle); return false; } DWORD file_size = (DWORD)fileSize.QuadPart; HANDLE file_map = CreateFileMapping( file_handle, NULL, PAGE_READONLY, 0, 0, NULL ); if (NULL == file_map) { print("err ] CreateFileMapping(%ws) failed, gle = %u", file_name, GetLastError()); CloseHandle(file_handle); return false; } PCHAR file_view = (PCHAR)MapViewOfFile( file_map, FILE_MAP_READ, 0, 0, 0 ); if (file_view == NULL) { print("err ] MapViewOfFile(%ws) failed, gle = %u", file_name, GetLastError()); CloseHandle(file_map); CloseHandle(file_handle); return false; } // do some io char a = file_view[0]; // 0x d9 char b = file_view[1]; // 0xb3 // close all UnmapViewOfFile(file_view); CloseHandle(file_map); CloseHandle(file_handle); return true; }
/** * @brief * @param * @see * @remarks * @code * @endcode * @return **/ pmap_context open_map_context(_In_ const wchar_t* file_path) { _ASSERTE(NULL != file_path); if (NULL == file_path) return false; if (!is_file_existsW(file_path)) return false;; pmap_context ctx = (pmap_context)malloc(sizeof(map_context)); RtlZeroMemory(ctx, sizeof(map_context)); bool ret = false; #pragma warning(disable: 4127) do { ctx->handle = CreateFileW( (LPCWSTR)file_path, GENERIC_READ, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if (INVALID_HANDLE_VALUE == ctx->handle) { print("err ] CreateFile( %ws ) failed. gle = %u", file_path, GetLastError()); break; } // check file size // LARGE_INTEGER fileSize; if (TRUE != GetFileSizeEx(ctx->handle, &fileSize)) { print("err ] GetFileSizeEx( %ws ) failed. gle = %u", file_path, GetLastError()); break; } // [ WARN ] // // 4Gb 이상의 파일의 경우 MapViewOfFile()에서 오류가 나거나 // 파일 포인터 이동이 문제가 됨 // FilIoHelperClass 모듈을 이용해야 함 // _ASSERTE(fileSize.HighPart == 0); if (fileSize.HighPart > 0) { print("err ] file is too large to map. file = %ws, size = %llu", file_path, fileSize.QuadPart); break; } ctx->size = (DWORD)fileSize.QuadPart; ctx->map = CreateFileMapping( ctx->handle, NULL, PAGE_READONLY, 0, 0, NULL ); if (NULL == ctx->map) { print("err ] CreateFileMapping( %ws ) failed. gle = %u", file_path, GetLastError()); break; } ctx->view = (PCHAR)MapViewOfFile( ctx->map, FILE_MAP_READ, 0, 0, 0 ); if (ctx->view == NULL) { print("err ] MapViewOfFile( %ws ) failed. gle = %u", file_path, GetLastError()); break; } ret = true; } while (FALSE); #pragma warning(default: 4127) if (!ret) { if (NULL != ctx->view) UnmapViewOfFile(ctx->view); if (NULL != ctx->map) CloseHandle(ctx->map); if (INVALID_HANDLE_VALUE != ctx->handle) CloseHandle(ctx->handle); free(ctx); ctx = NULL; } return ctx; }
bool create_bob_txt() { // current directory 를 구한다. wchar_t *buf=NULL; uint32_t buflen = 0; buflen = GetCurrentDirectoryW(buflen, buf); if (0 == buflen) { print("err, GetCurrentDirectoryW() failed. gle = 0x%08x", GetLastError()); return false; } buf = (PWSTR) malloc(sizeof(WCHAR) * buflen); if (0 == GetCurrentDirectoryW(buflen, buf)) { print("err, GetCurrentDirectoryW() failed. gle = 0x%08x", GetLastError()); free(buf); return false; } // current dir \\ bob.txt 파일명 생성 wchar_t file_name[260]; if (!SUCCEEDED(StringCbPrintfW( file_name, sizeof(file_name), L"%ws\\bob.txt", buf))) { print("err, can not create file name"); free(buf); return false; } if (true == is_file_existsW(file_name)) { ::DeleteFileW(file_name); } // 파일 생성 HANDLE file_handle = CreateFileW( file_name, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); if(file_handle == INVALID_HANDLE_VALUE) { print("err, CreateFile(path=%ws), gle=0x%08x", file_name, GetLastError()); return false; } // 파일에 데이터 쓰기 DWORD bytes_written = 0; wchar_t string_buf[1024]; if (!SUCCEEDED(StringCbPrintfW( string_buf, sizeof(string_buf), L"동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라만세"))) { print("err, can not create data to write."); CloseHandle(file_handle); return false; } char *pUtf8 =NULL; int len = UnicodeToUtf8(string_buf,&pUtf8); if (!WriteFile(file_handle, pUtf8, len, &bytes_written, NULL)) { print("err, WriteFile() failed. gle = 0x%08x", GetLastError()); CloseHandle(file_handle); return false; } // 영어로 쓰기 if (!SUCCEEDED(StringCbPrintfW( string_buf, sizeof(string_buf), L"All work and no play makes jack a dull boy."))) { print("err, can not create data to write."); CloseHandle(file_handle); return false; } free(pUtf8); *pUtf8 =NULL; len = UnicodeToUtf8(string_buf,&pUtf8); if (!WriteFile(file_handle, string_buf, wcslen(string_buf), &bytes_written, NULL)) { print("err, WriteFile() failed. gle = 0x%08x", GetLastError()); CloseHandle(file_handle); return false; } char string_bufa[1024]; if (!SUCCEEDED(StringCbPrintfA( string_bufa, sizeof(string_bufa), "동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라만세"))) { print("err, can not create data to write."); CloseHandle(file_handle); return false; } free(pUtf8); pUtf8 =NULL; pUtf8 =ANSIToUTF8(string_bufa); len = strlen(pUtf8); if (!WriteFile(file_handle, pUtf8, len, &bytes_written, NULL)) { print("err, WriteFile() failed. gle = 0x%08x", GetLastError()); CloseHandle(file_handle); return false; } // 영어로 쓰기 if (!SUCCEEDED(StringCbPrintfA( string_bufa, sizeof(string_bufa), "All work and no play makes jack a dull boy."))) { print("err, can not create data to write."); CloseHandle(file_handle); return false; } free(pUtf8); pUtf8 =NULL; pUtf8 =ANSIToUTF8(string_bufa); len = strlen(pUtf8); if (!WriteFile(file_handle, string_bufa, strlen(string_bufa), &bytes_written, NULL)) { print("err, WriteFile() failed. gle = 0x%08x", GetLastError()); CloseHandle(file_handle); return false; } free(pUtf8); // 파일 닫기 CloseHandle(file_handle); wchar_t copy_file_name[260]; if (!SUCCEEDED(StringCbPrintfW( copy_file_name, sizeof(copy_file_name), L"%ws\\bob2.txt", buf))) { print("err, can not copy file name"); free(buf); return false; } free(buf); buf = NULL; /* BOB.txt -> BOB2.txt 파일 복사 */ if(!CopyFileW(file_name,copy_file_name,false)){ print("CopyFileW fail"); return false; } /* ReadFile()을 통한 읽기 후 출력*/ HANDLE read_file_handle = CreateFileW( copy_file_name, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); if(read_file_handle == INVALID_HANDLE_VALUE) { print("err, CreateFile(path=%ws), gle=0x%08x", read_file_handle, GetLastError()); return false; } char read_buf[512]; char buf_noNull[512]; char* ansi_buf; DWORD result=0; ReadFile(read_file_handle,read_buf,sizeof(char)*512,&result,NULL); // read_buf의 글자 사이사이에 있는 NULL값 제거 ( UTF8ToANSI 에서 strlen을 사용하기 때문) int j=0; for(int i=0;i<256;i++){ if(read_buf[i] != '\0'){ buf_noNull[j++] = read_buf[i]; } } buf_noNull[j]='\0'; // 출력 ansi_buf=UTF8ToANSI(buf_noNull); printf("%s\n",ansi_buf); CloseHandle(read_file_handle); /* MMIO()을 통한 읽기 후 출력*/ read_file_handle = CreateFileW( copy_file_name, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); if(read_file_handle == INVALID_HANDLE_VALUE) { print("err, CreateFile(path=%ws), gle=0x%08x", read_file_handle, GetLastError()); return false; } HANDLE file_map = CreateFileMapping( read_file_handle, NULL, PAGE_READONLY, 0, 0, NULL ); if (NULL == file_map) { print("err, CreateFileMapping(%ws) failed, gle = %u", file_name, GetLastError()); CloseHandle(read_file_handle); return false; } PCHAR file_view = (PCHAR) MapViewOfFile( file_map, FILE_MAP_READ, 0, 0, 0 ); if(file_view == NULL) { print("err, MapViewOfFile(%ws) failed, gle = %u", file_name, GetLastError()); CloseHandle(file_map); CloseHandle(read_file_handle); return false; } // read_buf의 글자 사이사이에 있는 NULL값 제거 ( UTF8ToANSI 에서 strlen을 사용하기 때문) j=0; for(int i=0;i<256;i++){ if(read_buf[i] != '\0'){ buf_noNull[j++] = file_view[i]; } } buf_noNull[j]='\0'; // 출력 ansi_buf=UTF8ToANSI(buf_noNull); printf("%s\n",ansi_buf); UnmapViewOfFile(file_view); CloseHandle(file_map); CloseHandle(read_file_handle); /* BOB.txt 파일 삭제*/ ::DeleteFileW(file_name); return true; }
/**---------------------------------------------------------------------------- \brief 파일 IO 를 위해 파일을 오픈한다. \param \return \code \endcode -----------------------------------------------------------------------------*/ DTSTATUS FileIoHelper::FIOpenForRead( IN std::wstring FilePath ) { if (TRUE == Initialized()) { FIOClose(); } mReadOnly = TRUE; if (TRUE != is_file_existsW(FilePath.c_str())) { printf( "no file exists. file=%ws", FilePath.c_str() ); return DTS_NO_FILE_EXIST; } #pragma warning(disable: 4127) DTSTATUS status = DTS_WINAPI_FAILED; do { mFileHandle = CreateFileW( FilePath.c_str(), GENERIC_READ, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if (INVALID_HANDLE_VALUE == mFileHandle) { printf( "CreateFile(%ws) failed, gle=0x%08x", FilePath.c_str(), GetLastError() ); break; } // check file size // if (TRUE != GetFileSizeEx(mFileHandle, &mFileSize)) { printf( "%ws, can not get file size, gle=0x%08x", FilePath.c_str(), GetLastError() ); break; } mFileMap = CreateFileMapping( mFileHandle, NULL, PAGE_READONLY, 0, 0, NULL ); if (NULL == mFileMap) { printf( "CreateFileMapping(%ws) failed, gle=0x%08x", FilePath.c_str(), GetLastError() ); break; } status = DTS_SUCCESS; } while (FALSE); #pragma warning(default: 4127) if (TRUE != DT_SUCCEEDED(status)) { if (INVALID_HANDLE_VALUE != mFileHandle) { CloseHandle(mFileHandle); mFileHandle = INVALID_HANDLE_VALUE; } if (NULL != mFileMap) CloseHandle(mFileMap); } return status; }
bool create_bob_txt() { // current directory 를 구한다. wchar_t *buf=NULL; uint32_t buflen = 0; buflen = GetCurrentDirectoryW(buflen, buf); if (0 == buflen) { print("err, GetCurrentDirectoryW() failed. gle = 0x%08x", GetLastError()); return false; } buf = (PWSTR) malloc(sizeof(WCHAR) * buflen); if (0 == GetCurrentDirectoryW(buflen, buf)) { print("err, GetCurrentDirectoryW() failed. gle = 0x%08x", GetLastError()); free(buf); return false; } // current dir \\ bob.txt 파일명 생성 wchar_t file_name[260]; if (!SUCCEEDED(StringCbPrintfW( file_name, sizeof(file_name), L"%ws\\bob.txt", buf))) { print("err, can not create file name"); free(buf); return false; } free(buf); buf = NULL; if (true == is_file_existsW(file_name)) { ::DeleteFileW(file_name); } // 파일 생성 HANDLE file_handle = CreateFileW( file_name, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); if(file_handle == INVALID_HANDLE_VALUE) { print("err, CreateFile(path=%ws), gle=0x%08x", file_name, GetLastError()); return false; } // 파일에 데이터 쓰기 DWORD bytes_written = 0; wchar_t string_buf[1024]; if (!SUCCEEDED(StringCbPrintfW( string_buf, sizeof(string_buf), L"동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라만세"))) { print("err, can not create data to write."); CloseHandle(file_handle); return false; } if (!WriteFile(file_handle, string_buf, wcslen(string_buf), &bytes_written, NULL)) { print("err, WriteFile() failed. gle = 0x%08x", GetLastError()); CloseHandle(file_handle); return false; } // 영어로 쓰기 if (!SUCCEEDED(StringCbPrintfW( string_buf, sizeof(string_buf), L"All work and no play makes jack a dull boy."))) { print("err, can not create data to write."); CloseHandle(file_handle); return false; } if (!WriteFile(file_handle, string_buf, wcslen(string_buf), &bytes_written, NULL)) { print("err, WriteFile() failed. gle = 0x%08x", GetLastError()); CloseHandle(file_handle); return false; } char string_bufa[1024]; if (!SUCCEEDED(StringCbPrintfA( string_bufa, sizeof(string_bufa), "동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라만세"))) { print("err, can not create data to write."); CloseHandle(file_handle); return false; } if (!WriteFile(file_handle, string_bufa, strlen(string_bufa), &bytes_written, NULL)) { print("err, WriteFile() failed. gle = 0x%08x", GetLastError()); CloseHandle(file_handle); return false; } // 영어로 쓰기 if (!SUCCEEDED(StringCbPrintfA( string_bufa, sizeof(string_bufa), "All work and no play makes jack a dull boy."))) { print("err, can not create data to write."); CloseHandle(file_handle); return false; } if (!WriteFile(file_handle, string_bufa, strlen(string_bufa), &bytes_written, NULL)) { print("err, WriteFile() failed. gle = 0x%08x", GetLastError()); CloseHandle(file_handle); return false; } // 파일 닫기 CloseHandle(file_handle); return true; }
bool create_bob_txt() { wchar_t *buf = NULL; uint32_t buflen = 0; buflen = GetCurrentDirectoryW(buflen, buf); if (buflen == 0) { printf("[error] GetCurrentDirectoryW() failed!!! gle = 0x%08x\n", GetLastError()); return false; } buf = (PWSTR)malloc(sizeof(WCHAR)*buflen); if (GetCurrentDirectoryW(buflen, buf) == 0) { printf("[error] GetCurrentDirectoryW() failed!!! gle = 0x%08x\n", GetLastError()); free(buf); return false; } // current directory\\bob.txt 생성 wchar_t file_name[260]; if (!SUCCEEDED(StringCbPrintfW( file_name, sizeof(file_name), L"%ws\\bob.txt", buf))) { printf("[error] can not create bob.txt\n"); free(buf); return false; } free(buf); buf = NULL; if (is_file_existsW(file_name)) { DeleteFileW(file_name); } // 파일 생성 HANDLE file_handle = CreateFileW( file_name, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); ///////////////////////////////////////////////////////// DWORD numberOfBytesWritten; int result; unsigned char mark[3]; mark[0] = 0xEF; mark[1] = 0xBB; // UTF-8 mark[2] = 0xBF; wchar_t strUnicode[256] = L"안녕하세요 굳 굳굳 HelloWorld"; char strUtf8[256] = { 0, }; if (file_handle == INVALID_HANDLE_VALUE) { printf("[error] can not CreateFile, gle=0x%08x\n", GetLastError()); return false; } int nlen = WideCharToMultiByte(CP_UTF8, 0, strUnicode, lstrlenW(strUnicode), NULL, 0, NULL, NULL); WideCharToMultiByte(CP_UTF8, 0, strUnicode, lstrlenW(strUnicode), strUtf8, nlen, NULL, NULL); result = WriteFile(file_handle, &mark, 3, &numberOfBytesWritten, NULL); result = WriteFile(file_handle, strUtf8, strlen(strUtf8), &numberOfBytesWritten, NULL); // bob.txt -> bob2.txt 파일 복사 LPCWSTR file_name2 = L"C:\\Users\\kahissa\\Documents\\Visual Studio 2013\\Projects\\Console_test1\\bob2.txt"; CopyFile(file_name, file_name2, false); // bob2.txt 파일 내용 읽기 char readBuf[256] = { 0, }; DWORD dwRead = 0; BOOL readOK; HANDLE file_handle2 = CreateFileW(file_name2, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (file_handle2 == INVALID_HANDLE_VALUE) { printf("[error] can not file open, gle=0x%08x\n", GetLastError()); } readOK = ReadFile(file_handle2, readBuf, 256, &dwRead, NULL); // 파일 내용 읽어서 rBuf에 저장 if (readOK && dwRead == 0) printf("[error] can not read file, gle=0x%08x\n", GetLastError()); //readBuf에 UTF8 적용 int len = MultiByteToWideChar(CP_UTF8, 0, readBuf, strlen(readBuf), NULL, NULL); wchar_t MultiByte[256] = { 0, }; // UTF8 -> 유니코드 MultiByteToWideChar(CP_UTF8, 0, readBuf, strlen(readBuf), MultiByte, len); char MultiByte2[256] = { 0, }; /// 유니코드 -> 멀티바이트 len = WideCharToMultiByte(CP_ACP, 0, MultiByte, -1, NULL, 0, NULL, NULL); WideCharToMultiByte(CP_ACP, 0, MultiByte, -1, MultiByte2, len, NULL, NULL); printf("%s\n", MultiByte2 + 1); // header 다음부터 출력 CloseHandle(file_handle); CloseHandle(file_handle2); DeleteFile(file_name); DeleteFile(file_name2); return true; }
/** * @brief * @param * @see * @remarks * @code * @endcode * @return **/ bool file_copy_using_read_write( _In_ const wchar_t* src_file, _In_ const wchar_t* dst_file ) { _ASSERTE(NULL != src_file); _ASSERTE(NULL != dst_file); if (NULL == src_file || NULL == dst_file) return false; if (!is_file_existsW(src_file)) { print("err ] no src file = %ws", src_file); return false; } if (is_file_existsW(dst_file)) { DeleteFileW(dst_file); } // open src file with READ mode HANDLE src_handle = CreateFileW( src_file, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if (INVALID_HANDLE_VALUE == src_handle) { print("err ] CreateFile( %ws ) failed. gle = %u", src_file, GetLastError()); return false; } // open dst file with WRITE mode HANDLE dst_handle = CreateFileW( dst_file, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL ); if (INVALID_HANDLE_VALUE == dst_handle) { print("err ] CreateFile( %ws ) failed. gle = %u", dst_file, GetLastError()); CloseHandle(src_handle); return false; } // file copy bool ret = false; char buf[4096] = { 0 }; DWORD bytes_written = 0; DWORD bytes_read = 0; do { // read from src if (!ReadFile(src_handle, buf, sizeof(buf), &bytes_read, NULL)) { print("err ] ReadFile( src_handle ) failed. gle = %u", GetLastError()); break; } else { // please read // https://msdn.microsoft.com/en-us/library/windows/desktop/aa365690(v=vs.85).aspx if (0 == bytes_read) { ret = true; break; } } // write to dst if (!WriteFile(dst_handle, buf, sizeof(buf), &bytes_written, NULL)) { print("err ] WriteFile( dst_handle ) failed. gle = %u", GetLastError()); break; } } while (true); CloseHandle(src_handle); CloseHandle(dst_handle); return ret; }
bool OpenFileContext(IN PCWSTR FilePath, IN bool ReadOnly, OUT PFILE_CTX& Ctx) { _ASSERTE(NULL != FilePath); if (NULL == FilePath) return false; if (!is_file_existsW(FilePath)) return false;; _ASSERT(NULL == Ctx); if (NULL != Ctx) return false;; Ctx = (PFILE_CTX)malloc(sizeof(FILE_CTX)); if (NULL == Ctx) return false; RtlZeroMemory(Ctx, sizeof(FILE_CTX)); bool ret = false; #pragma warning(disable: 4127) do { Ctx->FileHandle = CreateFileW( (LPCWSTR)FilePath, (true == ReadOnly) ? GENERIC_READ : GENERIC_READ | GENERIC_WRITE, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if (INVALID_HANDLE_VALUE == Ctx->FileHandle) { print( "CreateFile(%ws) failed, gle = %u", FilePath, GetLastError() ); break; } // check file size // LARGE_INTEGER fileSize; if (TRUE != GetFileSizeEx(Ctx->FileHandle, &fileSize)) { print( "%ws, can not get file size, gle = %u", FilePath, GetLastError() ); break; } // [ WARN ] // // 4Gb 이상의 파일의 경우 MapViewOfFile()에서 오류가 나거나 // 파일 포인터 이동이 문제가 됨 // FilIoHelperClass 모듈을 이용해야 함 // _ASSERTE(fileSize.HighPart == 0); if (fileSize.HighPart > 0) { print( "file size = %I64d (over 4GB) can not handle. use FileIoHelperClass", fileSize.QuadPart ); break; } Ctx->FileSize = (DWORD)fileSize.QuadPart; Ctx->FileMap = CreateFileMapping( Ctx->FileHandle, NULL, (true == ReadOnly) ? PAGE_READONLY : PAGE_READWRITE, 0, 0, NULL ); if (NULL == Ctx->FileMap) { print( "CreateFileMapping(%ws) failed, gle = %u", FilePath, GetLastError() ); break; } Ctx->FileView = (PCHAR)MapViewOfFile( Ctx->FileMap, (true == ReadOnly) ? FILE_MAP_READ : FILE_MAP_WRITE, 0, 0, 0 ); if (Ctx->FileView == NULL) { print( "MapViewOfFile(%ws) failed, gle = %u", FilePath, GetLastError() ); break; } ret = true; } while (FALSE); #pragma warning(default: 4127) if (!ret) { if (NULL != Ctx->FileView) UnmapViewOfFile(Ctx->FileView); if (NULL != Ctx->FileMap) CloseHandle(Ctx->FileMap); if (INVALID_HANDLE_VALUE != Ctx->FileHandle) CloseHandle(Ctx->FileHandle); free(Ctx); } return ret; }
/// @brief bool FileInfoCache::initialize( _In_ const wchar_t* db_file_path, _In_ int64_t cache_size, _In_ bool delete_if_exist ) { _ASSERTE(NULL != db_file_path); if (NULL == db_file_path) return false; if (true == _initialized) return true; if (true == is_file_existsW(db_file_path) && true == delete_if_exist) { if (!DeleteFileW(db_file_path)) { log_err "DeleteFileW( %ws ) failed. gle = %u", db_file_path, GetLastError() log_end; return false; } } try { // // 데이터베이스 파일을 열고, precompiled statement 들을 생성한다. // _db.open(db_file_path); // // "file_hash" 테이블 존재 유무를 체크 한 후 없으면 새로 만든다. // if (true != _db.tableExists("file_hash")) { _db.execDML(_create_file_cache); } if (nullptr != _select_cache_stmt) { delete _select_cache_stmt; } if (nullptr != _insert_cache_stmt) { delete _insert_cache_stmt; } if (nullptr != _update_cache_stmt) { delete _update_cache_stmt; } if (nullptr != _delete_cache_stmt) { delete _delete_cache_stmt; } // // statement 객체들을 생성한다. // _select_cache_stmt = _db.compileStatement(_select_file_cache); _insert_cache_stmt = _db.compileStatement(_insert_file_cache); _update_cache_stmt = _db.compileStatement(_update_file_cache); _delete_cache_stmt = _db.compileStatement(_delete_file_cache); } catch (CppSQLite3Exception& e) { log_err "sqlite exception. FileInfoCache::initialize, code = %d, msg = %s", e.errorCode(), e.errorMessage() log_end; return false; } // 캐시 사이즈 초기화 _cache_size = cache_size; _initialized = true; return true; }
bool file_copy_using_memory_map_extended( _In_ const wchar_t* src_file, _In_ const wchar_t* dst_file ) { _ASSERTE(NULL != src_file); _ASSERTE(NULL != dst_file); if (NULL == src_file || NULL == dst_file) return false; if (!is_file_existsW(src_file)) { print("err ] no src file = %ws", src_file); return false; } if (is_file_existsW(dst_file)) { //print("err ] des file already exists = %ws", dst_file); //return false; DeleteFileW(dst_file); } bool ret = true; pmap_context src_ctx = (pmap_context)malloc(sizeof(map_context)); pmap_context dst_ctx = (pmap_context)malloc(sizeof(map_context)); RtlZeroMemory(src_ctx, sizeof(map_context)); RtlZeroMemory(dst_ctx, sizeof(map_context)); /* src */ src_ctx->handle = CreateFile(src_file, GENERIC_READ, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE == src_ctx->handle) { print("err ] CreateFile( %ws ) failed. gle = %u", src_file, GetLastError()); return false; } LARGE_INTEGER fileSize; if (TRUE != GetFileSizeEx(src_ctx->handle, &fileSize)) { print("err ] GetFileSizeEx( %ws ) failed. gle = %u", src_file, GetLastError()); ret = false; goto clean1; } src_ctx->map = CreateFileMapping(src_ctx->handle, NULL, PAGE_READONLY, 0, 0, NULL); if (NULL == src_ctx->map) { print("err ] CreateFileMapping( %ws ) failed. gle = %u", src_file, GetLastError()); ret = false; goto clean1; } /* dst */ dst_ctx->handle = CreateFile(dst_file, GENERIC_READ | GENERIC_WRITE, NULL, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE == dst_ctx->handle) { print("err ] CreateFile( %ws ) failed. gle = %u", dst_file, GetLastError()); ret = false; goto clean2; } dst_ctx->map = CreateFileMapping(dst_ctx->handle, NULL, PAGE_READWRITE, fileSize.HighPart, fileSize.LowPart, NULL); if (NULL == dst_ctx->map) { print("err ] CreateFileMapping( %ws ) failed. gle = %u", dst_file, GetLastError()); ret = false; goto clean3; } uint32_t blockSize = 512 * MB; uint64_t curOffset = 0; /* iterated copy */ while (curOffset < (uint64_t)fileSize.QuadPart) { /* if remaining block is less than blocksize */ if (blockSize >(uint64_t)fileSize.QuadPart - curOffset) { blockSize = (uint64_t)fileSize.QuadPart - curOffset; } /* src */ src_ctx->view = (PCHAR)MapViewOfFile(src_ctx->map, FILE_MAP_READ, 0, 0, blockSize); if (NULL == src_ctx->view) { print("err ] MapViewOfFile( %ws ) failed. gle = %u", src_file, GetLastError()); ret = false; goto clean4; } /* dst */ dst_ctx->view = (PCHAR)MapViewOfFile(dst_ctx->map, FILE_MAP_WRITE, curOffset >> 32, curOffset & 0xffffffff, blockSize); if (NULL == dst_ctx->view) { print("err ] MapViewOfFile( %ws ) failed. gle = %u", dst_file, GetLastError()); ret = false; goto clean5; } /* copy */ memcpy(dst_ctx->view, src_ctx->view, blockSize); UnmapViewOfFile(dst_ctx->view); clean5: UnmapViewOfFile(src_ctx->view); if (!ret) break; curOffset += blockSize; } clean4: CloseHandle(dst_ctx->map); clean3: CloseHandle(src_ctx->map); clean2: CloseHandle(src_ctx->handle); clean1: CloseHandle(dst_ctx->handle); free(src_ctx); free(dst_ctx); return ret; }
/** * @brief * @param * @see * @remarks * @code * @endcode * @return **/ bool create_bob_txt() { // current directory 를 구한다. wchar_t *buf = NULL; uint32_t buflen = 0; buflen = GetCurrentDirectoryW(buflen, buf); if (0 == buflen) { print("err, GetCurrentDirectoryW() failed. gle = 0x%08x", GetLastError()); return false; } buf = (PWSTR)malloc(sizeof(WCHAR) * buflen); if (0 == GetCurrentDirectoryW(buflen, buf)) { print("err, GetCurrentDirectoryW() failed. gle = 0x%08x", GetLastError()); free(buf); return false; } // current dir \\ bob.txt 파일명 생성 wchar_t file_name[260]; if (!SUCCEEDED(StringCbPrintfW( file_name, sizeof(file_name), L"%ws\\bob.txt", buf))) { print("err, can not create file name"); free(buf); return false; } // current dir \\ bob2.txt 파일명 생성 wchar_t file_name2[260]; if (!SUCCEEDED(StringCbPrintfW( file_name2, sizeof(file_name2), L"%ws\\bob2.txt", buf))) { print("err, can not create file name"); free(buf); return false; } free(buf); buf = NULL; if (true == is_file_existsW(file_name)) { ::DeleteFileW(file_name); } if (true == is_file_existsW(file_name2)) { ::DeleteFileW(file_name); } // 파일 생성 HANDLE file_handle = CreateFileW( file_name, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); if (file_handle == INVALID_HANDLE_VALUE) { print("err, CreateFile(path=%ws), gle=0x%08x", file_name, GetLastError()); return false; } // 파일에 데이터 쓰기 DWORD bytes_written = 0; wchar_t string_buf[1024]; if (!SUCCEEDED(StringCbPrintfW( string_buf, sizeof(string_buf), L"bob 베스트 오브 더 베스트 bob"))) { print("err, can not create data to write."); CloseHandle(file_handle); return false; } if (!WriteFile(file_handle, string_buf, wcslen(string_buf)*2, &bytes_written, NULL)) { print("err, WriteFile() failed. gle = 0x%08x", GetLastError()); CloseHandle(file_handle); return false; } // 파일 닫기 CloseHandle(file_handle); // 파일 복사 if (!CopyFile(file_name, file_name2 , false)) printf("복사 실패? \n"); // 파일 읽기 HANDLE file_handle2 = CreateFileW( file_name2, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (file_handle2 == INVALID_HANDLE_VALUE) { print("%ws 를 읽어오지 못했습니다.", file_name2); return false; } DWORD bytes_read; wchar_t string_buf2[1024]; memset(string_buf2, NULL, sizeof(string_buf2)); if (!ReadFile(file_handle2, string_buf2, sizeof(string_buf2), &bytes_read, NULL)) { printf("파일을 읽어오지 못했습니다!"); CloseHandle(file_handle2); } // wchar -> mbs 변환 int wcstrsize = wcslen(string_buf2) * 2 + 1; int mbstrsize = WideCharToMultiByte(CP_ACP, 0, string_buf2, -1, NULL, 0, NULL, NULL); char* mbstr; mbstr = new char[mbstrsize+1]; WideCharToMultiByte(CP_ACP, 0, string_buf2, -1, mbstr, mbstrsize, 0, 0); printf("%ws\n-> %s\n\n", file_name2, mbstr); // mmio 시작 // 파일 열기 // mmio 를 위한 filesize 체크 LARGE_INTEGER fileSize; if (!GetFileSizeEx(file_handle2, &fileSize)) { print("err, GetFileSizeEx(%ws) failed, gle = %u", file_name2, GetLastError()); CloseHandle(file_handle2); return false; } // file size가 4GB가 넘는지 확인 // 파일이 4GB보다 크면 Memory상에 올려 화인하는데 오류가 생길 수 있음. _ASSERTE(fileSize.HighPart == 0); if (fileSize.HighPart > 0) { print("file size = %I64d (over 4GB) can not handle. use FileIoHelperClass", fileSize.QuadPart); CloseHandle(file_handle2); return false; } DWORD file_size = (DWORD)fileSize.QuadPart; HANDLE file_map = CreateFileMapping( file_handle2, NULL, PAGE_READONLY, 0, 0, NULL ); if (NULL == file_map) { print("err, CreateFileMapping(%ws) failed, gle = %u", file_name2, GetLastError()); CloseHandle(file_handle2); return false; } PCHAR file_view = (PCHAR)MapViewOfFile( file_map, FILE_MAP_READ, 0, 0, 0 ); if (file_view == NULL) { print("err, MapViewOfFile(%ws) failed, gle = %u", file_name2, GetLastError()); CloseHandle(file_map); CloseHandle(file_handle2); return false; } wchar_t mmio_get_string_buf[1024]; memset(mmio_get_string_buf, NULL, sizeof(mmio_get_string_buf)); int i; unsigned char b1, b2; for (i = 0; i < file_size/2; i++) { b1 = (unsigned char)file_view[2 * i]; b2 = (unsigned char)file_view[2 * i+1]; mmio_get_string_buf[i] = b2*256+b1; } // wchar -> mbs 변환 int mmio_wcstrsize = file_size + 1; int mmio_mbstrsize = WideCharToMultiByte(CP_ACP, 0, mmio_get_string_buf, -1, NULL, 0, NULL, NULL); char* mmio_mbstr; mmio_mbstr = new char[mmio_mbstrsize + 1]; WideCharToMultiByte(CP_ACP, 0, mmio_get_string_buf, -1, mmio_mbstr, mmio_mbstrsize, 0, 0); printf("mmio : %ws\n-> %s\n\n", file_name2, mmio_mbstr); UnmapViewOfFile(file_view); CloseHandle(file_map); CloseHandle(file_handle2); if (!DeleteFile(file_name)) { printf("%ws 파일을 지우는데 실패했습니다 ", file_name); } if (!DeleteFile(file_name2)) { printf("%ws 파일을 지우는데 실패했습니다 ", file_name2); } return true; }
/** * @brief * @param * @see * @remarks * @code * @endcode * @return **/ bool file_copy_using_memory_map( _In_ const wchar_t* src_file, _In_ const wchar_t* dst_file ) { _ASSERTE(NULL != src_file); _ASSERTE(NULL != dst_file); if (NULL == src_file || NULL == dst_file) return false; if (!is_file_existsW(src_file)) { print("err ] no src file = %ws", src_file); return false; } if (is_file_existsW(dst_file)) { DeleteFileW(dst_file); } static DWORD AllocationGranularity = 0; if (0 == AllocationGranularity) { SYSTEM_INFO si = { 0 }; GetSystemInfo(&si); AllocationGranularity = si.dwAllocationGranularity; } pmap_context src_ctx = open_map_context(src_file); pmap_context dest_ctx = user_create_map_context(dst_file, src_ctx->size); LARGE_INTEGER FileOffset = { 0 }; LARGE_INTEGER FileSize = { dest_ctx->size }; LARGE_INTEGER i = { 0 }; LARGE_INTEGER BytesInBlock = { 0 }; PUCHAR buffer = (PUCHAR)malloc((uint64_t)(1024 * 1024)); while (FileSize.QuadPart > 0) { BytesInBlock.QuadPart = AllocationGranularity * 1; if (FileSize.QuadPart < AllocationGranularity * 1) { BytesInBlock.QuadPart = FileSize.QuadPart; } dest_ctx->view = (PCHAR)MapViewOfFile( dest_ctx->map, FILE_MAP_WRITE, (FileOffset.HighPart), (FileOffset.LowPart), BytesInBlock.QuadPart ); if (dest_ctx->view == NULL) { print("err ] MapViewOfFile( %ws ) failed. gle = %u", dst_file, GetLastError()); break; } RtlCopyMemory(buffer, &src_ctx->view[FileOffset.QuadPart], BytesInBlock.QuadPart); RtlCopyMemory(&dest_ctx->view[FileOffset.QuadPart], buffer, BytesInBlock.QuadPart); UnmapViewOfFile(dest_ctx->view); FileOffset.QuadPart += BytesInBlock.QuadPart; FileSize.QuadPart -= BytesInBlock.QuadPart; } CloseHandle(dest_ctx->map); CloseHandle(dest_ctx->handle); return true; }
/** * @brief * @param * @see * @remarks * @code * @endcode * @return **/ bool create_bob_txt() { // current directory 를 구한다. wchar_t *buf=NULL; uint32_t buflen = 0; buflen = GetCurrentDirectoryW(buflen, buf); if (0 == buflen) { print("err, GetCurrentDirectoryW() failed. gle = 0x%08x", GetLastError()); return false; } buf = (PWSTR) malloc(sizeof(WCHAR) * buflen); if (0 == GetCurrentDirectoryW(buflen, buf)) { print("err, GetCurrentDirectoryW() failed. gle = 0x%08x", GetLastError()); free(buf); return false; } // current dir \\ bob.txt 파일명 생성 wchar_t file_name[260]; if (!SUCCEEDED(StringCbPrintfW( file_name, sizeof(file_name), L"%ws\\bob.txt", buf))) { print("err, can not create file name"); free(buf); return false; } free(buf); buf = NULL; if (true == is_file_existsW(file_name)) { ::DeleteFileW(file_name); } // 파일 생성 HANDLE file_handle = CreateFileW( file_name, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); if(file_handle == INVALID_HANDLE_VALUE) { print("err, CreateFile(path=%ws), gle=0x%08x", file_name, GetLastError()); return false; } // 파일에 데이터 쓰기 DWORD bytes_written = 0; wchar_t string_buf[1024]; char string_buf_utf8[1024] ={0,}; if (!SUCCEEDED(StringCbPrintfW( string_buf, sizeof(string_buf), L"가갸거겨고교구규그기 ABCDEFGHIJKLMNOPQRSTUVWXYZ"))) { print("err, can not create data to write."); CloseHandle(file_handle); return false; } //유니코드-> UTF-8 int nLen = WideCharToMultiByte(CP_UTF8, 0, string_buf, lstrlenW(string_buf), NULL, 0, NULL, NULL); WideCharToMultiByte (CP_UTF8, 0, string_buf, lstrlenW(string_buf), string_buf_utf8, nLen, NULL, NULL); if (!WriteFile(file_handle, string_buf_utf8, strlen(string_buf_utf8), &bytes_written, NULL)) { print("err, WriteFile() failed. gle = 0x%08x", GetLastError()); CloseHandle(file_handle); return false; } // 파일 닫기 CloseHandle(file_handle); return true; }
int _tmain(int argc, _TCHAR* argv[]) { // current directory 를 구한다. wchar_t *buf = NULL; uint32_t buflen = 0; buflen = GetCurrentDirectoryW(buflen, buf); if (0 == buflen) { print("err ] GetCurrentDirectoryW() failed. gle = 0x%08x", GetLastError()); return false; } buf = (PWSTR)malloc(sizeof(WCHAR) * buflen); if (0 == GetCurrentDirectoryW(buflen, buf)) { print("err ] GetCurrentDirectoryW() failed. gle = 0x%08x", GetLastError()); free(buf); return false; } // current dir \\ test.txt 파일명 생성 wchar_t file_name[260]; if (!SUCCEEDED(StringCbPrintfW( file_name, sizeof(file_name), L"%ws\\test.txt", buf))) { print("err ] can not create file name"); free(buf); return false; } // current dir \\ test2.txt 파일명 생성 wchar_t file_name2[260]; if (!SUCCEEDED(StringCbPrintfW( file_name2, sizeof(file_name2), L"%ws\\test2.txt", buf))) { print("err ] can not create file name"); free(buf); return false; } free(buf); buf = NULL; FileIoHelper MMIOFILE; FileIoHelper MMIOFILE2; LARGE_INTEGER file_size; LARGE_INTEGER offset; PUCHAR buff; offset.QuadPart = 0; if (is_file_existsW(file_name)) { MMIOFILE.FIOpenForRead(file_name); file_size = *MMIOFILE.FileSize(); } else { file_size.QuadPart = (unsigned long long)1 * 501 * 1024 * 1024; MMIOFILE.FIOCreateFile(file_name, file_size); } MMIOFILE2.FIOCreateFile(file_name2, file_size); // 복사의 개념과는 약간 다른 것 같지만 복사를 하기 위해 먼저 같은 크기의 파일을 생성한 다음 내부 데이터를 덮어씌우는 형태로 구현하였다. // copy buff = (PUCHAR) malloc((500 * 1024 * 1024 + 1)*sizeof(UCHAR)); while (1) { if (offset.QuadPart + 500 * 1024 * 1024 < file_size.QuadPart) { MMIOFILE.FIOReadFromFile(offset, 500 * 1024 * 1024, buff); MMIOFILE2.FIOWriteToFile(offset, 500 * 1024 * 1024, buff); offset.QuadPart += 500 * 1024 * 1024; } else { MMIOFILE.FIOReadFromFile(offset, file_size.QuadPart - offset.QuadPart, buff); MMIOFILE2.FIOWriteToFile(offset, file_size.QuadPart - offset.QuadPart, buff); offset.QuadPart = file_size.QuadPart; break; } } return 0; }
/** * @brief * @param * @see * @remarks * @code * @endcode * @return **/ bool create_bob_txt() { wchar_t *buf = NULL; uint32_t buflen = 0; buflen = GetCurrentDirectoryW(buflen, buf); if (0 == buflen) { print("err, GetCurrentDirectoryW() failed. gle = 0x%08x", GetLastError()); return false; } buf = (PWSTR)malloc(sizeof(WCHAR)* buflen); if (0 == GetCurrentDirectoryW(buflen, buf)) { print("err, GetCurrentDirectoryW() failed. gle = 0x%08x", GetLastError()); free(buf); return false; } wchar_t file_name[260]; wchar_t copy_name[260]; if (!SUCCEEDED(StringCbPrintfW( file_name, sizeof(file_name), L"%ws\\bob.txt", buf))) { print("err, can not create file name"); free(buf); return false; } if (!SUCCEEDED(StringCbPrintfW( copy_name, sizeof(copy_name), L"%ws\\bob2.txt", buf))) { print("err, can not copy file name"); free(buf); return false; } free(buf); buf = NULL; if (true == is_file_existsW(file_name)) { ::DeleteFileW(file_name); } HANDLE file_handle = CreateFileW( file_name, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); if (file_handle == INVALID_HANDLE_VALUE) { print("err, CreateFile(path=%ws), gle=0x%08x", file_name, GetLastError()); return false; } DWORD bytes_written = 0; wchar_t string_buf[1024]; if (!SUCCEEDED(StringCbPrintfW( string_buf, sizeof(string_buf), L"ddfsjjkfhkse 가나다라마바사아자차카타파하"))) { print("err, can not create data to write."); CloseHandle(file_handle); return false; } char strUtf8[1024]; int nLen = WideCharToMultiByte(CP_UTF8, 0, string_buf, lstrlenW(string_buf), NULL, 0, NULL, NULL); WideCharToMultiByte(CP_UTF8, 0, string_buf, lstrlenW(string_buf), strUtf8, nLen, NULL, NULL); if (!WriteFile(file_handle, strUtf8, nLen, &bytes_written, NULL)) { print("err, WriteFile() failed. gle = 0x%08x", GetLastError()); CloseHandle(file_handle); return false; } CloseHandle(file_handle); CopyFileW(file_name, copy_name, NULL); HANDLE copy_handle = CreateFileW( copy_name, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (file_handle == INVALID_HANDLE_VALUE) { print("err, CreateFile(path=%ws), gle=0x%08x", file_name, GetLastError()); return false; } wchar_t data[1024] = { 0 }; char strUtf[1024] = { 0 }; char asc[1024]; ReadFile(copy_handle, strUtf, sizeof(strUtf), &bytes_written, NULL); CloseHandle(copy_handle); int nLen2 = MultiByteToWideChar(CP_UTF8, 0, strUtf, strlen(strUtf), NULL, NULL); MultiByteToWideChar(CP_UTF8, 0, strUtf, strlen(strUtf), data, nLen2); int len = WideCharToMultiByte(CP_ACP, 0, data, -1, NULL, 0, NULL, NULL); WideCharToMultiByte(CP_ACP, 0, data, -1, asc, len, NULL, NULL); printf("%s\n", asc); HANDLE copy_handle2 = CreateFileW( (LPCWSTR)copy_name, GENERIC_READ, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if (INVALID_HANDLE_VALUE == copy_handle2) { print("err, CreateFile(%ws) failed, gle = %u", file_name, GetLastError()); return false; } HANDLE file_map = CreateFileMapping( copy_handle2, NULL, PAGE_READONLY, 0, 0, NULL ); if (NULL == file_map) { print("err, CreateFileMapping(%ws) failed, gle = %u", file_name, GetLastError()); CloseHandle(copy_handle2); return false; } PCHAR file_view = (PCHAR)MapViewOfFile( file_map, FILE_MAP_READ, 0, 0, 0 ); if (file_view == NULL) { print("err, MapViewOfFile(%ws) failed, gle = %u", file_name, GetLastError()); CloseHandle(file_map); CloseHandle(file_handle); return false; } wchar_t data2[1024] = { 0 }; char asc2[1024] = { 0 }; int nLen3 = MultiByteToWideChar(CP_UTF8, 0, file_view, strlen(file_view), NULL, NULL); MultiByteToWideChar(CP_UTF8, 0, file_view, strlen(file_view), data2, nLen3); int len2 = WideCharToMultiByte(CP_ACP, 0, data2, -1, NULL, 0, NULL, NULL); WideCharToMultiByte(CP_ACP, 0, data2, -1, asc, len2, NULL, NULL); printf("%s\n", asc); UnmapViewOfFile(file_view); CloseHandle(file_map); CloseHandle(copy_handle2); DeleteFile(file_name); DeleteFile(copy_name); return true; }