• XSS.stack #1 – первый литературный журнал от юзеров форума

Мини программа с WinAPI

-StorM-

HDD-drive
Пользователь
Регистрация
14.03.2009
Сообщения
39
Реакции
2
Вообщем шеф на работе вообще с ума сошел и для повышения квалификации,определения навыков сотрудников дал задание,написать программу на любом языке использующий WinAPI.
Что должна делать программа?запускаешь программу и она ждет пока в папке появится текстовый документы или несколько документов в которых написано откуда и куда копировать какие файлы,например,текстовик,а там C:\\temp\ D:\\Folder,а так же еще должна быть возможность копирования файлов по маске,например все *jpg файлы.
Я в не силен в кодинге,но было оговорено вроде что-то типа вся программа на потоках построена должна быть и дали файлик мне,там типа условий и потоков:

- существует отдельная папка, где располагаются задания
- задания представляют собой простой текстовый файл, состоящий из двух частей - откуда и куда, с возможностью задания маски
- программа отслеживает наличие какого-либо файла в папке. Как только он появляется, начинается выполнение задания
- по завершению задания, файл с заданием удаляется
- для каждого отдельного задания запускается отдельный поток

---------------------------------------------------------------
Для работы с потоками используются функция CreateThread.
ПОТОКИ
HANDLE CreateThread(
LPSECURITY ATTRIBUTES ProcAttr,
SIZT_T StackSize,
LPTHREAD_START_ROUTINE Func,
LPVOID Params,
DWORD Flags,
LPWORD ThreadId)

1) Показывает NULL
2) Размер стэка зависит от того, что делает поток
3) Функция, которая будет запущена в качестве потока
4) Параметр, который попадает в функцию как данные
5) Создать, но не запускать
6) Iв потока
VOID ExitThread(DWORD ExitCode)
Завершение потока.

BOOL TerminateThread(HANDLE h,
DWORD ExitCode)

DWORD [Suspend/Resume] Thread(HANDLE h)
Suspend – приостановить работу потока
Resume – возобновить работу потока
Действие функции Suspend является накапливаемым (если два раза запустить функцию SuspendThread одному и тому же потоку, то необходимо вызвать дважды ResumeThread)

BOOL SwitchToThread()
Вызвать планировщик системы.

DWORD SetThreadAffinitiMask(HANDLE h,
DWORD NetMask)
Уст. множество процессоров, на которых поток может работать.
Результат – предыдущая маска, в которой все работало

DWORD SetThreadIdealProcessor(HANDLE h,
DWORD NProc)
Устанавливаем для потока предпочитаемый процессор. Если все равно какой процессор, то вместо NProc ставим константу MAXIMUM_PROCESSOR.



Кодеры,кто возьмется мне помочь с этим делом?В долгу никогда не остаюсь,все будут довольны.Буду признателен за помощь
 
скорей всего ваш шеф решил подзаработать на фрилансе...
готов помочь, но нужен точный формат команды , например как будет выглядеть в файле копирование из одной папки в другую по маске
 
команда будет выглядеть простым образом,как бы можно самовольно придумать,но желательно так :

C:\Users\Wallpaper\*jpg | D:\Oboi

как я понял в левом углу то,откуда копируют,в правом то,куда копируют.
Программа должна выполнять свои действия даже тогда,когда закидывают 2 текстовика или более с заданиями откуда и куда переместить.
Постоянно должна быть активна,например прога запущена и висит папочка,только в нее копируются 1 или более *txt файлов с заданием и сразу она выполяет эти действия что в текстовике. И прекращает свои действия программа только тогда,когда ее закрывают. Вроде бы правильно выразился. Спасибо что взялся помочь,очень ценю дружелюбность пользователей дамаги :thumbsup:
 
Сувани ему трояну!!!
ну я же буду давать сорцы, если ТС захочет шефа троянуть то сможет легко скелить с чем-нить
И прекращает свои действия программа только тогда,когда ее закрывают.
насчет формочек, рюшечек, окошечек я не обещаю - а вот основной алгоритм в сорцах напишу , но только уже завтра
 
как бы накатали мне прогу
копирует из одного каталога в другой по маске.
файл в файл не копирует.
несуществующие каталоги не создает.
Помогите протестить софтину,может где-то что-то не так работает,буду признателен:

Код:
#include "Windows.h"

#define MAX_THREADS 512

volatile BOOL gError = FALSE;

BOOL MyCopyFiles(wchar_t *from, wchar_t* to)
{
if(! (GetFileAttributesW(to) & FILE_ATTRIBUTE_DIRECTORY) )
 return FALSE;

WIN32_FIND_DATAW w32fd;
HANDLE findHandle = FindFirstFileW(from,&w32fd);

if(findHandle == NULL)
{
 FindClose(findHandle);
 return TRUE;
}

wchar_t *pp = wcsrchr(from,'\\');
*pp = 0;

int fromDirLen = lstrlenW(from);
BOOL ret = TRUE;

do
{
 if(lstrcmpW(w32fd.cFileName,L".") && lstrcmpW(w32fd.cFileName,L".."))
 {
  wchar_t *fromFull = new wchar_t[lstrlenW(from) + lstrlenW(w32fd.cFileName) + 2];
  wchar_t *toFull = new wchar_t[lstrlenW(to) + lstrlenW(w32fd.cFileName) + 2];

  wsprintfW(fromFull,L"%s\\%s",from,w32fd.cFileName);
  wsprintfW(toFull,L"%s\\%s",to,w32fd.cFileName);

  if(!CopyFileW(fromFull,toFull,FALSE))
  {
   wprintf(L"cannot copy %s to %s\n",fromFull,toFull);
   ret = FALSE;
  }

  delete[] fromFull;
  delete[] toFull;
 }
}while(FindNextFileW(findHandle,&w32fd));
       FindClose(findHandle);
return ret;
}


DWORD __stdcall CopyProc(LPVOID p)
{
wchar_t *taskFile = (wchar_t *)p;

HANDLE hFile = CreateFileW(taskFile,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
if(hFile == INVALID_HANDLE_VALUE)
{
 wprintf(L"cannot open file %s, copy task will not be performed\n");
}
else
{
 DWORD size = GetFileSize(hFile,NULL);
 char *buff = new char[size];
 DWORD read = 0;

 ReadFile(hFile,buff,size,&read,0);
 CloseHandle(hFile);

 if(read == size)
 {
  wchar_t *wbuff = new wchar_t[size + 1];
  wbuff[size] = 0;
  MultiByteToWideChar(CP_ACP,0,buff,size,wbuff,size);

  wchar_t *from = wbuff;
  wchar_t *to = wcsstr(wbuff,L" | ");
  if(to)
  {
   *to = 0;
   to += 3;

   if(!MyCopyFiles(from,to))
   {
    wprintf(L"cannot copy %s to %s\n", from, to);
   }
  }
  else
  {
   wprintf(L"task file have incorrect format\n");
  }
  delete[] wbuff;
 }

 delete[] buff;
}

if(!DeleteFileW(taskFile))
{
 wprintf(L"cannot delete file %s, unrecoverable error\n",taskFile);
 gError = TRUE;
}
else
 wprintf(L"task file %s deleted\n",taskFile);

delete[] taskFile;
return 0;
}


int _tmain(int argc, _TCHAR* argv[])
{
wchar_t *taskPath = NULL;
wchar_t empty[1] = {0};

int pathLen = GetCurrentDirectoryW(0,NULL);
wchar_t *currDir = new wchar_t[pathLen + 1];
GetCurrentDirectoryW(pathLen + 1,currDir);

if(argc < 2)
{
 taskPath = new wchar_t[6 + pathLen];
 wsprintfW(taskPath,L"%s\\*.txt",currDir);
 wprintf(L"path not specified, using current dir(%s)\n",taskPath);
}
else
{
 pathLen = lstrlenW(argv[1]);
 taskPath = new wchar_t[6 + pathLen];
 wsprintfW(taskPath,L"%s\\*.txt",argv[1]);
 wprintf(L"path set to %s\n",taskPath);
}


HANDLE threads[MAX_THREADS];
int threadsCount = 0;

WIN32_FIND_DATAW w32fd;
while( 1 )
{
 HANDLE findHandle = FindFirstFileW(taskPath,&w32fd);

 if(findHandle != INVALID_HANDLE_VALUE)
 {
  do
  {
   if(lstrcmpW(w32fd.cFileName,L".") && lstrcmpW(w32fd.cFileName,L".."))
   {
    wprintf(L"%s found, starting thread\n", w32fd.cFileName);

    wchar_t *taskFile = new wchar_t[pathLen + lstrlenW(w32fd.cFileName) + 2];
    wsprintfW(taskFile, L"%s\\%s", argc > 1?argv[1]:currDir, w32fd.cFileName);

    HANDLE thread = CreateThread(NULL, 0, CopyProc, taskFile, 0, NULL);
    if(!thread)
    {
     wprintf(L"thread creation error, unrecoverable error\n");
     return 0;
    }

    threads[threadsCount++] = thread;
    if(threadsCount == MAX_THREADS)
    {
     wprintf(L"maximum threads number reached, next batch will continue\n");
     break;
    }
   }

  }while(FindNextFileW(findHandle,&w32fd));
 }

 FindClose(findHandle);

 if(threadsCount)
  WaitForMultipleObjects(threadsCount,threads,TRUE,INFINITE);

 for(int i = 0; i < threadsCount; i++)
 {
  CloseHandle(threads[i]);
 }
 threadsCount = 0;

 if(gError)
 {
  wprintf(L"unrecoverable error found");
  return 0;
 }

 Sleep(1000);
}
return 0;
}
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх