#include #include #include #define BUF_SIZE 255 typedef struct FileP{ WCHAR Search[MAX_PATH]; WCHAR OldName[MAX_PATH]; WCHAR NewName[MAX_PATH]; volatile INT Done; } PATHS; DOUBLE DelFileCount = 0; DOUBLE EnumFolderCount = 0; DOUBLE RenameFileCount = 0; DOUBLE CreateFileCount = 0; DWORD WINAPI DelFile (LPVOID lpParam){ PATHS * pData; pData = (PATHS *)lpParam; DelFileCount++; while(!pData->Done) { DeleteFileW(pData->NewName); DeleteFileW(pData->OldName); DelFileCount++; } return 0; } DWORD WINAPI EnumFolderContent (LPVOID lpParam){ WIN32_FIND_DATAW FileData; HANDLE hSearch; PATHS *pData; pData = (PATHS *)lpParam; //Function while(!pData->Done) { if ((hSearch = FindFirstFileW(pData->Search, &FileData)) != INVALID_HANDLE_VALUE) { while (FindNextFileW (hSearch, &FileData) != 0); FindClose(hSearch); } EnumFolderCount++; } return 0; } DWORD WINAPI RenameFile (LPVOID lpParam){ PATHS * pData; pData = (PATHS *)lpParam; while(!pData->Done) { MoveFileW(pData->OldName, pData->NewName); MoveFileW(pData->NewName, pData->OldName); RenameFileCount++; } return 0; } DWORD WINAPI CreateFileTest (LPVOID lpParam){ HANDLE hNewFile; PATHS * pData; pData = (PATHS *)lpParam; while(!pData->Done) { hNewFile = CreateFileW(pData->OldName, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); if ( hNewFile != INVALID_HANDLE_VALUE) CloseHandle(hNewFile); CreateFileCount++; } return 0; } int main(void){ HANDLE DelFileHandle = 0; HANDLE EnumFolderHandle = 0; HANDLE RenameFileHandle = 0; HANDLE CreateFileHandle = 0; HANDLE ArrayHandles[4]; INT num; PATHS FilePaths; INT DataRenameFileThread = 10; WCHAR Path[MAX_PATH] = L"C:\\New\\"; //WCHAR Path[MAX_PATH] = L"C:\\ReactOS\\bin\\testdata\\"; WCHAR TestName[MAX_PATH] = L"Test.xxx"; WCHAR DeleteName[MAX_PATH] = L"Delete.xxx"; wcscpy(FilePaths.OldName, L""); wcscat(FilePaths.OldName, Path); wcscat(FilePaths.OldName, TestName); wcscpy(FilePaths.NewName, L""); wcscat(FilePaths.NewName, Path); wcscat(FilePaths.NewName, DeleteName); wcscpy(FilePaths.Search, L""); wcscat(FilePaths.Search, Path); wcscat(FilePaths.Search, L"*.xxx"); FilePaths.Done = 0; printf("Stop the infinite looooooooooop entering 5 and pressing Enter \n>>>> "); //Create both threads. CreateFileHandle = CreateThread( NULL, 0, CreateFileTest, &FilePaths, 0, NULL); if (!CreateFileHandle) ExitProcess(0); EnumFolderHandle = CreateThread( NULL, 0, EnumFolderContent, &FilePaths, 0, NULL); if (!EnumFolderHandle) ExitProcess(1); RenameFileHandle = CreateThread( NULL, 0, RenameFile, &FilePaths, 0, NULL); if (!RenameFileHandle) ExitProcess(2); DelFileHandle = CreateThread( NULL, 0, DelFile, &FilePaths, 0, NULL); if (!DelFileHandle) ExitProcess(3); /* Store the handles */ ArrayHandles[0] = CreateFileHandle; ArrayHandles[1] = EnumFolderHandle; ArrayHandles[2] = RenameFileHandle; ArrayHandles[3] = DelFileHandle; /* Stop the infinite loop with number "5" */ while((num = getchar())!= 53); /* Force both threads to stop */ FilePaths.Done = 1; /* Wait until all are terminated */ WaitForMultipleObjects( 4, ArrayHandles, TRUE, INFINITE); /* Close all handles */ CloseHandle(ArrayHandles[0]); CloseHandle(ArrayHandles[1]); CloseHandle(ArrayHandles[2]); CloseHandle(ArrayHandles[3]); /* We can end with both files:*/ DeleteFileW(FilePaths.NewName); DeleteFileW(FilePaths.OldName); printf("DelFileCount = %f, EnumFolderCount = %f, RenameFileCount = %f, CreateFileCount = %f", DelFileCount, EnumFolderCount, RenameFileCount, CreateFileCount); return 1; }