Есть программа поиска всех файлов каталоге С.
Нужно по каждому найденному файлу сделать запись в текстовый файл в асинхронном режиме.
Проблема в том что в файл записывается только 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;
}
Вы открываете файл "file.txt"
для записи в монопольном режиме затем в рекурсивных вызовах recursive_find_files
пытаетесь открыть его снова, и все эти последующие попытки оканчиваются неудачей. Откройте файл один раз вне этой рекурсивной функции и передавайте в нее уже открытый файловый дескриптор. В плане асинхронности тут тоже не все гладко, так как результат асинхронной операции нигде не проверяется и вообще нет ожидания ее окончания (буфер с записываемыми данными должен оставаться валиден до окончания операции).
Кроме того, следует проверять результаты большинства вызываемых функций (в т.ч. VirtualAlloc
CreateEventA
) и использовать Unicode варианты этих функций и wchar_t
строки (т.е. CreateEventW
CreateFileW
).
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Есть ли у кого-нибудь реализация данного алгоритма на языках C/C++/Java? Ну, или хотя бы псевдокод с описанием? Буду рад любой помощи
Нужно писать модуль для python на c++Хочу передать из пайтона в функцию строковый аргумент, как-то изменить ее, например добавив "!", и вернуть обратно...
Напишите программу, которая считывает произвольное количество чисел до стоп-слова "STOP" и выводит, сколько раз среди них встречается первое...
Использую Gulp для сборки проекта и RequireJS для сборки AMD модулейВот из gulpfile