#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; DWORD WINAPI EnumFolderContent (LPVOID lpParam){ WIN32_FIND_DATAW FileData; HANDLE hSearch; INT count = 0; PATHS *pData; pData = (PATHS *)lpParam; //Function while(!pData->Done) { if ((hSearch = FindFirstFileW(pData->Search, &FileData)) == INVALID_HANDLE_VALUE) return 1; count ++; while (FindNextFileW (hSearch, &FileData) != 0) count ++; FindClose(hSearch); count = 0; } return 0; } DWORD WINAPI RenameFile (LPVOID lpParam){ PATHS * pData; pData = (PATHS *)lpParam; while(!pData->Done) { if(!MoveFileW(pData->OldName, pData->NewName)) return 1; if(!MoveFileW(pData->NewName, pData->OldName)) return 1; } return 0; } int main(void){ HANDLE EnumFolderHandle = 0; HANDLE RenameFileHandle = 0; HANDLE ArrayHandles[2]; HANDLE hNewFile; INT num; PATHS FilePaths; INT DataRenameFileThread = 10; 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 loop entering 5 and pressing Enter \n>>>> "); // Create the testing file hNewFile = CreateFileW(FilePaths.OldName, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); if ( hNewFile == INVALID_HANDLE_VALUE) return 1; CloseHandle(hNewFile); //Create both threads. EnumFolderHandle = CreateThread( NULL, 0, EnumFolderContent, &FilePaths, 0, NULL); if (!EnumFolderHandle) ExitProcess(0); RenameFileHandle = CreateThread( NULL, 0, RenameFile, &FilePaths, 0, NULL); if (!EnumFolderHandle) ExitProcess(1); /* Store the handles */ ArrayHandles[0] = EnumFolderHandle; ArrayHandles[1] = RenameFileHandle; /* 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( 2, ArrayHandles, TRUE, INFINITE); /* Close all handles */ CloseHandle(ArrayHandles[0]); CloseHandle(ArrayHandles[1]); /* We don't track the final name of the file so try both of them */ if (!DeleteFileW(FilePaths.NewName)) if (!DeleteFileW(FilePaths.OldName)) return 1; }