#include #include #include #include int main(int argc, char *argv[]) { static char buffer[4096]; char *cp; int i; int *compare_len = NULL; FILE *fp = NULL; int processed_count = 0, failed_count = 0; memset(buffer, 0, sizeof(buffer)); if (GetModuleFileName(NULL, buffer, sizeof(buffer) - 1) == 0) goto out; cp = strchr(buffer, '\0'); while (*(cp = CharPrev(buffer, cp)) != '\\'); if (cp == buffer + 2) cp++; *cp = '\0'; if (SetCurrentDirectory(buffer) == 0 || (fp = fopen("Stamp_DB.txt", "r")) == NULL) { fprintf(stderr, "Can't read DB file.\n"); goto out; } compare_len = (int *) malloc(argc * sizeof(int)); memset(compare_len, 0, argc * sizeof(int)); for (i = 1; i < argc; i++) { DWORD attr = GetFileAttributes(argv[i]); if (attr == (DWORD) -1) continue; if (attr & FILE_ATTRIBUTE_DIRECTORY) { if (*CharPrev(argv[i], strchr(argv[i], '\0')) != '\\') { memset(buffer, 0, sizeof(buffer)); _snprintf(buffer, sizeof(buffer) - 1, "%s\\", argv[i]); argv[i] = strdup(buffer); } compare_len[i] = strlen(argv[i]); } else { compare_len[i] = strlen(argv[i]) + 1; } } while (memset(buffer, 0, sizeof(buffer)), fgets(buffer, sizeof(buffer) - 1, fp)) { if ((cp = strchr(buffer, '\n')) == NULL) { fprintf(stderr, "Line too long.\n"); break; } *cp = '\0'; for (i = 1; i < argc; i++) { if (compare_len[i] > 0 && strncmp(buffer + 20, argv[i], compare_len[i]) == 0) { int year, mon, day, hour, min, sec; DWORD attr = GetFileAttributes(buffer + 20); if (attr == (DWORD) -1) break; if (sscanf(buffer, "%4d-%02d-%02d %02d:%02d:%02d", &year, &mon, &day, &hour, &min, &sec) == 6) { SYSTEMTIME st; FILETIME ft, lft; HANDLE hFile; memset(&st, 0, sizeof(st)); st.wYear = year; st.wMonth = mon; st.wDay = day; st.wHour = hour; st.wMinute = min; st.wSecond = sec; SystemTimeToFileTime(&st, &lft); LocalFileTimeToFileTime(&lft, &ft); if (attr & FILE_ATTRIBUTE_READONLY) SetFileAttributes(buffer + 20, attr ^ FILE_ATTRIBUTE_READONLY); hFile = CreateFile(buffer + 20, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, attr & FILE_ATTRIBUTE_DIRECTORY ? FILE_FLAG_BACKUP_SEMANTICS : 0, NULL); if (hFile != INVALID_HANDLE_VALUE) { if (SetFileTime(hFile, NULL, NULL, &ft)) processed_count++; else { failed_count++; printf("Failed: %s\n", buffer + 20); } CloseHandle(hFile); } else if ((attr & FILE_ATTRIBUTE_DIRECTORY) == 0 || GetLastError() != 3) { failed_count++; printf("Failed: %s\n", buffer + 20); } if (attr & FILE_ATTRIBUTE_READONLY) SetFileAttributes(buffer + 20, attr); } break; } } } fclose(fp); out: ; printf(" %d processed. %d failed.\n", processed_count, failed_count); for (i = 0; i < 100; i++) { Sleep(100); if (kbhit()) break; } return 0; }