#include #include void rec (const char* path) { WIN32_FIND_DATA FileData; HANDLE hSearch; bool fFinished = FALSE; bool fSparse, fDir; char buf[strlen(path) + strlen("\\*") + 1]; strcpy(buf, path); strcat(buf, "\\*"); hSearch = FindFirstFile(buf, &FileData); if (hSearch == INVALID_HANDLE_VALUE) return; while (!fFinished) { if (FileData.cFileName[0] == '.' && (FileData.cFileName[1] == '\0' || (FileData.cFileName[1] == '.' && FileData.cFileName[2] == '\0'))) goto skip; fSparse = (FileData.dwFileAttributes & FILE_ATTRIBUTE_SPARSE_FILE) != 0; fDir = (FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; if (fDir) { char buf[strlen(path) + strlen(FileData.cFileName) + 2]; sprintf(buf, "%s\\%s", path, FileData.cFileName); rec(buf); } if (fSparse) printf("%s\\%s\n", path, FileData.cFileName); skip: if (!FindNextFile(hSearch, &FileData)) { fFinished = TRUE; if (GetLastError() != ERROR_NO_MORE_FILES) printf("FindNextFile ERROR"); } } FindClose(hSearch); } int main (int argc, char* argv[]) { if (argc != 2) { fprintf(stderr, "Usage: sparse \n"); return 1; } rec(argv[1]); return 0; }