Асинхронная запись в файл WinApi

227
02 мая 2018, 05:12

Есть программа поиска всех файлов каталоге С.

Нужно по каждому найденному файлу сделать запись в текстовый файл в асинхронном режиме.

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

Вот код программы.

#include <cstdio>
#include <windows.h>
#include <stdio.h>
#define CHUNK_SIZE   102400
#define REPEAT_COUNT 1
#define SECTOR_SIZE  512
void recursive_find_files (char *path)
{
        void *buff=NULL;
OVERLAPPED io;
 HANDLE event = CreateEventA(0, false, false, 0);
 buff = VirtualAlloc(NULL, CHUNK_SIZE, MEM_COMMIT, PAGE_READWRITE); //резервируем память
FillMemory(buff, '0', CHUNK_SIZE);
DWORD ff;
int i;
    char temp [MAX_PATH] = {'\0'};
    wsprintf (temp, "%s\\*.*", path);
     HANDLE file = CreateFile("file.txt",GENERIC_WRITE, 0, NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED, NULL);
    ZeroMemory(&io, sizeof(io)); //инциализация структуры
 SetFilePointer(file, REPEAT_COUNT * CHUNK_SIZE, 0, FILE_BEGIN);
    SetEndOfFile(file);
     WIN32_FIND_DATA fd;
    HANDLE handle = FindFirstFile (temp, &fd); 
    //WriteFile(file,buff14, sizeof(buff14), &ff, NULL );
    if (handle != INVALID_HANDLE_VALUE)
    {
         do
         {
              if (strcmp (".", fd.cFileName) != 0 && strcmp ("..", fd.cFileName) != 0)
              {
                   if (fd.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
                   {
                        printf ("dir \t%s\\%s\n", path, fd.cFileName);
                        char res [MAX_PATH] = {'\0'};
                        sprintf_s (res, "%s\\%s", path, fd.cFileName);
                        recursive_find_files (res);
                   }
                   else 
                       {
                           printf ("file \t%s\\%s\n", path, fd.cFileName);
                           WriteFile(file, fd.cFileName, strlen(fd.cFileName), &ff, &io);
                     printf("WriteFile failed. GetLastError: %d\n", GetLastError());

                   }
              }
         }
         while (FindNextFile (handle, &fd));
    }
    FindClose (handle);
     CloseHandle(file);
}
int main ()
{
    recursive_find_files ("C:\\");
    getchar ();
    return 0;
}
Answer 1

Вы открываете файл "file.txt" для записи в монопольном режиме затем в рекурсивных вызовах recursive_find_files пытаетесь открыть его снова, и все эти последующие попытки оканчиваются неудачей. Откройте файл один раз вне этой рекурсивной функции и передавайте в нее уже открытый файловый дескриптор. В плане асинхронности тут тоже не все гладко, так как результат асинхронной операции нигде не проверяется и вообще нет ожидания ее окончания (буфер с записываемыми данными должен оставаться валиден до окончания операции).

Кроме того, следует проверять результаты большинства вызываемых функций (в т.ч. VirtualAlloc CreateEventA) и использовать Unicode варианты этих функций и wchar_t строки (т.е. CreateEventW CreateFileW).

READ ALSO
Реализация алгоритма CN2

Реализация алгоритма CN2

Есть ли у кого-нибудь реализация данного алгоритма на языках C/C++/Java? Ну, или хотя бы псевдокод с описанием? Буду рад любой помощи

210
Как получить и обработать строку в функции модуля Python?

Как получить и обработать строку в функции модуля Python?

Нужно писать модуль для python на c++Хочу передать из пайтона в функцию строковый аргумент, как-то изменить ее, например добавив "!", и вернуть обратно...

192
Напишите программу на C++ или C [требует правки]

Напишите программу на C++ или C [требует правки]

Напишите программу, которая считывает произвольное количество чисел до стоп-слова "STOP" и выводит, сколько раз среди них встречается первое...

208
Модули AMD не видят подключаемые плагины

Модули AMD не видят подключаемые плагины

Использую Gulp для сборки проекта и RequireJS для сборки AMD модулейВот из gulpfile

194