bool Sub_CreateFile_AccessDisposition(TestLog& log, LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwCreationDisposition) { HANDLE h = apiCreateFile(lpFileName, dwDesiredAccess, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, 0, dwCreationDisposition, 0, 0); if(h == INVALID_HANDLE_VALUE) { log.GetStream(TestLog::MT_ERROR) << L"CreateFile" << endl; return false; } BOOL result = CloseHandle(h); if(!result) { log.GetStream(TestLog::MT_ERROR) << L"CloseHandle" << endl; return false; } return true; }
bool MakeFile(TestLog& log, const std::wstring& lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, size_t iFileSizeKB, size_t buffersizeKB) { File f(lpFileName, dwDesiredAccess, dwShareMode, CREATE_ALWAYS); if(!f.IsValidHandle()) { log.GetStream(TestLog::MT_ERROR) << L"CreateFile" << endl; return false; } if(buffersizeKB == 0) { buffersizeKB = 1; } char* buffer = new char[buffersizeKB * 1024]; for(size_t i = 0; i < buffersizeKB; i++) { memcpy_s(buffer + (1024 * i), 1024, "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" "ABCDEFGHIJKLMNOPQRSTUV\r\n", 1024 ); } DWORD writeBytes = 0; for(size_t x = 0; x < iFileSizeKB; x += buffersizeKB) { if(uWriteFile(f, buffer, buffersizeKB * 1024, &writeBytes, 0) == FALSE) { log.GetStream(TestLog::MT_ERROR) << L"WriteFile" << endl; delete[] buffer; return false; } if(writeBytes != buffersizeKB * 1024) { log.GetStream(TestLog::MT_ERROR) << L"WriteFile: writeBytes Error." << endl; delete[] buffer; return false; } } delete[] buffer; log.GetStream(TestLog::MT_MESSAGE) << L"<" << lpFileName << L"> file created." << endl; return true; }
bool TouchFile(TestLog& log, LPCWSTR lpFileName) { File f(lpFileName, GENERIC_READ, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, CREATE_ALWAYS); if(!f.IsValidHandle()) { log.GetStream(TestLog::MT_ERROR) << L"CreateFile" << endl; return false; } log.GetStream(TestLog::MT_MESSAGE) << L"<" << lpFileName << L"> file created." << endl; return true; }
BOOL TouchManyFilesConcurrently(TestLog& log, size_t iFileNum, const std::wstring& basePath, std::vector<std::wstring>& vCreatedFiles) { wstring predirectorypath; if(basePath.size() > 0) { predirectorypath = GetWidTestBasePath(); if(!IsFileExist(basePath.c_str())) { CreateSubDir(basePath.c_str()); } log.GetStream(TestLog::MT_MESSAGE) << L"Set Base path to : " << basePath << endl; BOOL fOk = uSetCurrentDirectory(basePath.c_str()); if(!fOk) { log.GetStream(TestLog::MT_ERROR) << L"Current Directory Setting Failed. : " << GetLastErrorStr() << endl; return FALSE; } } if(vCreatedFiles.capacity() < iFileNum) { vCreatedFiles.reserve(iFileNum); } TestFileName t; wstring fileName = t.GetFirstFileName(); vCreatedFiles.push_back(fileName); for(size_t i = 0; i < iFileNum; ++i) { fileName = t.GetNextFileName(); vCreatedFiles.push_back(fileName); } if(basePath.size() > 0 && predirectorypath.size() > 0) { BOOL fOk = uSetCurrentDirectory(predirectorypath.c_str()); if(!fOk) { log.GetStream(TestLog::MT_ERROR) << L"Current Directory Setting Failed. : " << GetLastErrorStr() << endl; return FALSE; } } return TRUE; }
bool DeleteFileOrCheck(TestLog& log, const std::wstring& lpFileName) { SetFileAttributesW(lpFileName.c_str(), FILE_ATTRIBUTE_NORMAL); BOOL result = DeleteFileW(lpFileName.c_str()); if(result) { log.GetStream(TestLog::MT_MESSAGE) << L"Deletion success." << endl; return true; } if(GetLastError() == ERROR_FILE_NOT_FOUND) { log.GetStream(TestLog::MT_MESSAGE) << L"Deletion success(file not found)." << endl; return true; } log.GetStream(TestLog::MT_ERROR) << L"<" << lpFileName << L"> file deletion." << endl; return false; }
void ListFiles(TestLog& log, const wstring& dirpath) { HANDLE hFind = INVALID_HANDLE_VALUE; DWORD dwError; WIN32_FIND_DATA wfd; // Find the first file in the directory. hFind = apiFindFirstFile(dirpath.c_str(), &wfd); if(hFind == INVALID_HANDLE_VALUE) { log.GetStream(TestLog::MT_ERROR) << L"Invalid file handle. Error is " << GetLastErrorStr() << std::endl; return; } else { log.GetStream(TestLog::MT_ERROR) << L"First file name is " << wfd.cFileName << std::endl; // List all the other files in the directory. for(;;) { if(apiFindNextFile(hFind, &wfd) == 0) { break; } log.GetStream(TestLog::MT_ERROR) << L"Next file name is " << wfd.cFileName << std::endl; } dwError = GetLastError(); uFindClose(hFind); if(dwError != ERROR_NO_MORE_FILES) { log.GetStream(TestLog::MT_ERROR) << L"FindNextFile error. Error is " << GetLastErrorStr() << std::endl; } } }
BOOL CreateDirectoryWithAttributes(TestLog& log, const std::wstring& path, DWORD dwAttribute) { BOOL fOk = uCreateDirectory(path.c_str(), 0); log.GetStream(TestLog::MT_MESSAGE) << GetString_dwFileAttributes(dwAttribute) << std::endl; if(!fOk) { log.GetStream(TestLog::MT_ERROR) << L"Directory creation failed." << endl; return FALSE; } fOk = uSetFileAttributes(path.c_str(), dwAttribute); DWORD dwError = GetLastError(); if(!fOk) { log.GetStream(TestLog::MT_ERROR) << L"Cannot apply the attributes to the directory. " << GetErrorDefineString(dwError) << endl; return FALSE; } return TRUE; }
void CopyFileEx_ExistingDst(TestLog& log, BOOL bFailIfExists) { const wstring pSrcFileName = GetSrcFileName(); const wstring pDstFileName = GetDstFileName(); if(!MakeFile(log, pSrcFileName)) { log.GetStream(TestLog::MT_ERROR) << L"Cannot create a file." << endl; return; } if(!TouchFile(log, pDstFileName)) { log.GetStream(TestLog::MT_ERROR) << L"Cannot create a file." << endl; return; } BOOL result = apiCopyFileEx(pSrcFileName.c_str(), pDstFileName.c_str(), 0, 0, 0, bFailIfExists ? COPY_FILE_FAIL_IF_EXISTS : 0); if(result) { CheckFileData(log, pDstFileName); } if(!DeleteFileOrCheck(log, pSrcFileName)) { log.GetStream(TestLog::MT_ERROR) << L"Cannot delete the file created before." << endl; } if(!DeleteFileOrCheck(log, pDstFileName)) { log.GetStream(TestLog::MT_ERROR) << L"Cannot delete the file created before." << endl; return; } log.Ok(); }
bool CheckFileData(TestLog& log, const std::wstring& lpFileName, INT32 iFileSizeKB, size_t buffersizeKB) { File f(lpFileName, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING); if(!f.IsValidHandle()) { log.GetStream(TestLog::MT_ERROR) << L"CreateFile" << endl; return false; } if(buffersizeKB == 0) { buffersizeKB = 1; } char* buffer = new char[buffersizeKB * 1024]; for(size_t i = 0; i < buffersizeKB; i++) { memcpy_s(buffer + (1024 * i), 1024, "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" "ABCDEFGHIJKLMNOPQRSTUV\r\n", 1024 ); } char* readBuffer = new char[buffersizeKB * 1024]; DWORD readBytes = 0; for(int x = 0; x < iFileSizeKB; x += buffersizeKB) { if(uReadFile(f, readBuffer, buffersizeKB * 1024, &readBytes, 0) == FALSE) { log.GetStream(TestLog::MT_ERROR) << L"ReadFile" << endl; delete[] readBuffer; delete[] buffer; return false; } if(readBytes != buffersizeKB * 1024) { log.GetStream(TestLog::MT_ERROR) << L"ReadFile: readBytes Error." << endl; delete[] readBuffer; delete[] buffer; return false; } if(memcmp(readBuffer, buffer, buffersizeKB * 1024) != 0) { log.GetStream(TestLog::MT_ERROR) << L"memcmp" << endl; delete[] readBuffer; delete[] buffer; return false; } } delete[] readBuffer; delete[] buffer; log.GetStream(TestLog::MT_MESSAGE) << L"CheckFileData success." << endl; return true; }