Уважаемые программисты! Прошу помощи: пытаюсь написать консольную утилиту, удаляющую файлы по их полному пути и по маске. Получилось вот что: Код (Text): format PE console include 'win32axp.inc' section '.data' data readable writeable ns dd ? hout dd ? buffer db 261 dup (?) help db 'Using: mydel.exe path_to_file',0 Retry db 'Program fails. Please, retry',0 seek dd ? fd FINDDATA NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL section '.code' code readable executable fuck: invoke GetStdHandle,STD_OUTPUT_HANDLE mov [hout],eax invoke GetCommandLine mov esi,eax cycle1: cmp byte [esi],20h je parameter cmp byte [esi],0Dh je najobka inc esi jmp cycle1 parameter: mov edi,buffer mov ecx,261 cycle2: inc esi mov al,byte [esi] cmp al,0Dh je konets mov byte [edi],al inc edi loop cycle2 konets: mov byte [edi],0 invoke lstrlen,buffer test eax,eax jz najobka invoke FindFirstFile,buffer,fd cmp eax,-1 ;сравнение с INVALID_HANDLE_VALUE je retry mov [seek],eax invoke DeleteFile,fd.cFileName test eax,eax jz retry deleting: invoke FindNextFile,[seek],fd test eax,eax jz errr invoke DeleteFile,fd.cFileName jmp deleting errr: invoke GetLastError cmp eax,18 je exit retry: invoke WriteConsole,[hout],Retry,28,ns,NULL exit: invoke FindClose,[seek] invoke ExitProcess,0 najobka: invoke WriteConsole,[hout],help,29,ns,NULL jmp exit .end fuck Удаление по имени и маске файла в текущей директории идёт прекрасно, однако при указании полного пути, программа выдаёт "Program fails. Please, retry". Когда пихнул int3 перед DeleteFile, в Оле увидел, что вместо пути и имени файла функции передаётся какая-то строка псевдографических символов. Прошу вас пояснить мне мою ошибку Попутно ещё вопрос: как реализовать удаление файлов с помощью SHFileOperation? Я пытался вызывать её из FASM (пришлось инклуду свою варганить, фасм про _SHFILEOPSTRUCT не знает ничего), указал все необходимые параметры, пытался удалять и по маске, и по полному пути, функция возвращает, что всё ОК, но файл не удаляется. Быть может, на NT есть свои тонкости? Заранее благодарен
fd.cFileName - это имя файла без пути, поэтому чтобы удаление работало не только в текущей директории, нужно к этому имени "приклеить" путь к файлу
Код на Delphi. Код (Text): gettemppath(Sizeof(frombuf),frombuf); temp:=strpas(frombuf);temp:=temp+'Test';//Получение пути к папке TEMP\Test FillChar( frombuf, Sizeof(frombuf), 0 ); StrPCopy(frombuf,temp); GetCurrentDirectory(sizeof(tobuf),tobuf); CurDir:=strpas(tobuf); if SetCurrentDirectory(frombuf) then begin //если такая папка есть - удаляем. with OpStruc do begin Wnd := Handle; wFunc := FO_DELETE; pFrom := @frombuf; pTo := nil; fFlags := FOF_NOCONFIRMATION or FOF_RENAMEONCOLLISION or FOF_SILENT; fAnyOperationsAborted := False; hNameMappings := Nil; lpszProgressTitle := Nil; end; ShFileOperation( OpStruc ); end; Копирование *.jpg по маске из каталога TEMP\files. tobuf - куда скопировать. Код (Text): s:=temp+'files'+'\'+'*.jpg'; StrPCopy( frombuf, s); StrPCopy( tobuf,st); with OpStruc do begin Wnd := Handle; wFunc := FO_COPY; pFrom := @frombuf; pTo := @tobuf; fFlags := FOF_NOCONFIRMATION or FOF_SILENT OR FOF_FILESONLY; fAnyOperationsAborted := False; hNameMappings := Nil; lpszProgressTitle := Nil; end; ShFileOperation( OpStruc ); Думаю, поможет. Удачи!
Так и знал, что cFileName не содержит пути!! Просто в одной статье сказанули, что там и полный путь хранится, а я и поверил... СПАСИБО!!
Встречный вопрос про SHFileOperation: можно ли её вызвать из консольного приложения, заюзав хэндл стандартного вывода или просто NULL? Или под неё необходимо создавать окошко?
2 Ice Student Знаю... Только ни с нулём, ни с stdout не работает... Неужели эту ф-цию нельзя вызвать из консоли?
Adrax Ни что не мешает использовать SHFileOperation в консольном приложении. с stdout не работает Уж не в качестве ли SHFILEOPSTRUCT.hwnd ты указал хэндл стандартного вывода?
Adrax И туда указывал... Зачем? Описание элементов структуры SHFILEOPSTRUCT в msdn/psdk читал? "hwnd - Window handle to the dialog box ...", или для тебя "window handle" и "handle to the specified device, or a redirected handle" не отличаются? Что можно подсунуть Либо дескриптор окна, либо NULL (0). Я делал так (синтаксис masm): Код (Text): ... local fo:SHFILEOPSTRUCT invoke RtlZeroMemory, addr fo, sizeof fo mov fo.wFunc, FO_DELETE mov fo.pFrom, offset buff mov fo.fFlags, FOF_ALLOWUNDO or FOF_FILESONLY or FOF_NOCONFIRMATION or FOF_SILENT invoke SHFileOperation, addr fo ...
2 q_q Хэндл окна от хэндла устройства я ещё отличаю... Просто пытался с NULL'ом - не заработало, возможно, где-то ещё косяк... Раз у тебя пашет, значит, надо поискать ошибки в моей реализации