Уважаемые эксперты!
Помогите найти ошибку, я только начинающий прогр. на С/С++, поэтому не судите строго.
Написана на MS VISUAL 2005
Программа пытается найти файлы в папке C:\WINDOWS\TEMP\
и удалить, потом должна создать лог файл(дата | выполнение).
#include <windows.h>
#include <stdio.h>
#include <string.h>
#pragma warning(disable: 4996)
void removeallfiles(char *path);
int main(int argc, char **argv)
{
removeallfiles("C:\\WINDOWS\\TEMP\\");
HANDLE hFile;
hFile = CreateFile(TEXT("E:\\temp.log"),
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
0);
char buf[1024];
SYSTEMTIME lpSystemTime;
GetLocalTime((LPSYSTEMTIME) &lpSystemTime);
sprintf(buf,"TIME [%d.%d.%d %d:%d:%d:%d] EVENT [DELETING ALL INFORMATION FROM C:\\WINDOWS\\TEMP\\\13\10]",
lpSystemTime.wDay,
lpSystemTime.wMonth,
lpSystemTime.wYear,
lpSystemTime.wHour,
lpSystemTime.wMinute,
lpSystemTime.wSecond,
lpSystemTime.wMilliseconds);
WriteFile(hFile,buf,sizeof(buf),NULL,NULL);
CloseHandle(hFile);
return 0;
}
void removeallfiles(char* path)
{
char *buf = NULL;
if ((buf = (char* )malloc(strlen(path) + 2 + MAX_PATH)) == NULL)
{
printf("not enough memory!");
exit(1);
}
strcat(path,"*.*");
WIN32_FIND_DATA ff;
HANDLE h = FindFirstFileW((LPCWSTR)path,&ff);
do
{
buf[strlen(buf)-strlen((char* )ff.cFileName)] = '\0';
FindNextFile(h, &ff);
strcat(buf,(char* )ff.cFileName);
if(!DeleteFile((LPCWSTR)buf))
{
printf("ERROR is %d", GetLastError());
exit(1);
}
}while(h != INVALID_HANDLE_VALUE);
free(buf);
}
Добавлено форматирование — Кодт
Первое что бросаеться в глаза:
char * нельзя приводить к LPWSTR — внимательно посмотри обьявление LPWSTR это WCHAR * то бишь юникодный текст и уж никак его нельзя явным способом привести к char *.
P.S. используй форматирование кода — сплошным он тяжко читаеться
Здравствуйте, oi2005, Вы писали:
O>Помогите найти ошибку, я только начинающий прогр. на С/С++, поэтому не судите строго.
Тут сразу несколько ошибок.
1) Конверсия LPSTR <-> LPWSTR (используй FindFirstFileA)
2) Неправильно написан цикл FindFirstFile/FintNextFile
Ну и со строками работать можно чуть попроще. Кстати, можно сразу с юникодными, или, в более общем виде, с T-строками.
void removeallfiles(LPCTSTR dir)
{
// размещаем буфер для строки dir+"*.*"
int dirlen = _tcslen(dir); // пригодится ниже
LPTSTR path = (LPTSTR) malloc((dirlen + MAX_PATH + 1)*sizeof(TCHAR));
if(!path)
{
..... // ругаешься на конец мозгов
return;
}
_tcscpy(path, dir);
_tcscpy(path+dirlen, _T("*.*")); // вместо _tcscat. Мы же знаем длину начальной части!
// запускаем цикл
WIN32_FIND_DATA ff;
HANDLE h = FindFirstFile(path, &ff); // FindFirstFile принимает T-строки
if(h != INVALID_HANDLE_VALUE) // первая проверка - на валидный хэндл
{
do
{
_tcscpy(path+dirlen, ff.cFileName);
..... // удаляешь, ведёшь журнал, пишешь о неудачах
}
while(FindNextFile(h, &ff); // следующие проверки - на то, что FindNext вернул TRUE
FindClose(h); // и обязательно закрывай хэндл
}
// и наконец, освобождаем буфер
free(path);
}
... << RSDN@Home 1.2.0 alpha rev. 655>>