Что нового

[Файловая система] Работа с файлом, с точкой в конце

sforce5

Олл фо ЛулзЪ
Сообщения
160
Репутация
41
1) Вот у меня получилось создать файл с точкой в конце пути:

Код:
Local $hFile = _WinAPI_CreateFileEx("\\?\"& @ScriptDir &"\epicwin.", $CREATE_ALWAYS, $GENERIC_WRITE, $FILE_SHARE_WRITE)
_WinAPI_CloseHandle($hFile)


2) Этот файл очень легко и непринуждённо удаляется вот так:

Код:
_WinAPI_DeleteFile("\\?\"& @ScriptDir &"\epicwin.")

Func _WinAPI_DeleteFile($sFile)
    Local $ret = DllCall("kernel32.dll", "dword", "DeleteFileW", "wstr", $sFile)
    If @error Then Return SetError(2,0,0)
    Return $ret[0]
EndFunc


3) Но когда я зачем-то задал при создании этого файла ещё и аттрибуты стэлс пихотинца ($FILE_ATTRIBUTE_READONLY + $FILE_ATTRIBUTE_HIDDEN + $FILE_ATTRIBUTE_SYSTEM), то он способом из №2 сапсем никак не хочет удаляться

Код:
Local $hFile = _WinAPI_CreateFileEx("\\?\"& @ScriptDir &"\epicfail.", $CREATE_ALWAYS, $GENERIC_WRITE, $FILE_SHARE_WRITE, $FILE_ATTRIBUTE_READONLY + $FILE_ATTRIBUTE_HIDDEN + $FILE_ATTRIBUTE_SYSTEM)
_WinAPI_CloseHandle($hFile)


ВопросЪ, как удалить этот fail файл с этими аттрибутами?
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Я бы примерно так поступил:
Установка атрибутов.
Удаление.
 
Автор
sforce5

sforce5

Олл фо ЛулзЪ
Сообщения
160
Репутация
41
Yuriy сказал(а):
Я бы примерно так поступил:
Установка атрибутов.
Удаление.
Хммм... как? Если даже стандартный FileOpen -write, -close, и прочая, на такие типы путей не воздействуют....
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403
sforce5 [?]
ВопросЪ, как удалить этот fail файл с этими аттрибутами?
Также как он и был создан:

Код:
#include <WinAPI.au3>

$sFile = "\\?\" & @DesktopDir & "\epicwin."

If Not FileExists($sFile) Then
	$hFile = _WinAPI_CreateFile($sFile, 1, $GENERIC_WRITE, $FILE_SHARE_WRITE, BitOR($FILE_ATTRIBUTE_READONLY, $FILE_ATTRIBUTE_HIDDEN, $FILE_ATTRIBUTE_SYSTEM))
	_WinAPI_CloseHandle($hFile)
Else
	_WinAPI_SetFileAttributes($sFile, 0)
	_WinAPI_DeleteFile($sFile)
EndIf

Func _WinAPI_SetFileAttributes($sFile, $iAttributes)
	Local $aRet = DllCall("Kernel32.dll", "handle", "SetFileAttributesW", "wstr", $sFile, "dword", $iAttributes)
    
	If @error Then
		Return SetError(1, 0, 0)
	EndIf
	
    Return $aRet[0]
EndFunc

Func _WinAPI_DeleteFile($sFile)
    Local $aRet = DllCall("kernel32.dll", "handle", "DeleteFileW", "wstr", $sFile)
    
	If @error Then
		Return SetError(1, 0, 0)
	EndIf
	
    Return $aRet[0]
EndFunc



Добавлено:
Сообщение автоматически объединено:

Кстати хорошая идея для защиты временных файлов :smile:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
CreatoR, это неправильно,

Код:
$hFile = _WinAPI_CreateFile($sFile, 1, $GENERIC_WRITE, $FILE_SHARE_WRITE, BitOR($FILE_ATTRIBUTE_READONLY, $FILE_ATTRIBUTE_HIDDEN, $FILE_ATTRIBUTE_SYSTEM))


т.к. в оригинале используется функция _WinAPI_CreateFileEx().
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403
Yashied [?]
это неправильно
В данном случае это не важно, я просто копировал параметры с темы, что там в «_WinAPI_CreateFileEx» я не видел.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
Кстати, а почему я не включил _WinAPI_DeleteFile() в WinAPIEx UDF...

???
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403
Yashied [?]
почему я не включил _WinAPI_DeleteFile() в WinAPIEx UDF
Тебя простить можно :blum:, а вот я не понимаю почему подобные функции до сих пор не включены в состав стандартной библиотеки.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
Ну... Jon опять пропал куда-то, последнее посещение - 26 апреля...
 

tech-gs

Знающий
Сообщения
54
Репутация
5
А можно ли побороть (удалить) папки с похожими именами, созданными вирусами на флешках?
Вот, например, у "P:\Desktop.ini\ГвТЯДїВјІ»ТЄЙѕя." предлагаемым способом снимаются только атрибуты RHS, сама же папка не удаляется.
В качестве имени файла использовал $sFile = "\\?\" & @ScriptDir & "\ГвТЯДїВјІ»ТЄЙѕя."
Скрипт лежал в папке с "ГвТЯДїВјІ»ТЄЙѕя."
 
Автор
sforce5

sforce5

Олл фо ЛулзЪ
Сообщения
160
Репутация
41
tech-gs

патамучта kernel32.dll:DeleteFileW/A - удаляет только файлы, для папок нужна другая функция
 

tech-gs

Знающий
Сообщения
54
Репутация
5
Стандартными функциями Autoit папка не удаляется, да и вручную тоже. Подскажи апишную функцию.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403
tech-gs [?]
Подскажи апишную функцию
Код:
Global Const $FO_MOVE = 0x0001
Global Const $FO_COPY = 0x0002
Global Const $FO_DELETE = 0x0003
Global Const $FO_RENAME = 0x0004

Global Const $FOF_MULTIDESTFILES = 0x0001
Global Const $FOF_CONFIRMMOUSE = 0x0002
Global Const $FOF_SILENT = 0x0004
Global Const $FOF_RENAMEONCOLLISION = 0x0008
Global Const $FOF_NOCONFIRMATION = 0x0010
Global Const $FOF_WANTMAPPINGHANDLE = 0x0020
Global Const $FOF_ALLOWUNDO = 0x0040
Global Const $FOF_FILESONLY = 0x0080
Global Const $FOF_SIMPLEPROGRESS = 0x0100
Global Const $FOF_NOCONFIRMMKDIR = 0x0200
Global Const $FOF_NOERRORUI = 0x0400
Global Const $FOF_NOCOPYSECURITYATTRIBS = 0x0800
Global Const $FOF_NORECURSION = 0x1000
Global Const $FOF_NO_CONNECTED_ELEMENTS = 0x2000
Global Const $FOF_WANTNUKEWARNING = 0x4000
Global Const $FOF_NORECURSEREPARSE = 0x8000

_WinAPI_SHFileOperation("P:\Desktop.ini\ГвТЯДїВјІ»ТЄЙѕя.", "", $FO_DELETE, BitOR($FOF_NOCONFIRMATION, $FOF_NOERRORUI, $FOF_SILENT, $FOF_ALLOWUNDO))

Func _WinAPI_SHFileOperation($sFrom, $sTo, $iFunc, $iFlags = 0)
	Local $SHFILEOPSTRUCT, $pFrom, $pTo, $aDllRet, $nError = 0, $i
	$SHFILEOPSTRUCT = DllStructCreate("int;uint;ptr;ptr;uint;int;ptr;ptr")
	If @error Then Return False
	; hwnd
	DllStructSetData($SHFILEOPSTRUCT, 1, 0)
	; wFunc
	DllStructSetData($SHFILEOPSTRUCT, 2, $iFunc)
	; pFrom
	$pFrom = DllStructCreate("wchar[" & StringLen($sFrom) + 2 & "]")
	; pFrom will now be null-terminated at StringLen($sFrom)+1
	DllStructSetData($pFrom, 1, $sFrom)
	For $i = 1 To StringLen($sFrom) + 2
		If DllStructGetData($pFrom, 1, $i) = 10 Then DllStructSetData($pFrom, 1, 0, $i)
	Next
	; We need a second null at the end
	DllStructSetData($pFrom, 1, 0, StringLen($sFrom) + 2)
	DllStructSetData($SHFILEOPSTRUCT, 3, DllStructGetPtr($pFrom))
	; pTo
	$pTo = DllStructCreate("wchar[" & StringLen($sTo) + 2 & "]")
	; pTo will now be null-terminated at StringLen($sTo)+1
	DllStructSetData($pTo, 1, $sTo)
	; We need a second null at the end
	DllStructSetData($pTo, 1, 0, StringLen($sTo) + 2)
	DllStructSetData($SHFILEOPSTRUCT, 4, DllStructGetPtr($pTo))
	; fFlags
	DllStructSetData($SHFILEOPSTRUCT, 5, $iFlags)
	; fAnyOperationsAborted
	DllStructSetData($SHFILEOPSTRUCT, 6, 0)
	; hNameMappings
	DllStructSetData($SHFILEOPSTRUCT, 7, 0)
	; lpszProgressTitle
	DllStructSetData($SHFILEOPSTRUCT, 8, 0)
	$aDllRet = DllCall("shell32.dll", "int", "SHFileOperationW", "ptr", DllStructGetPtr($SHFILEOPSTRUCT))
	If @error Or $aDllRet[0] <> 0 Then
		$aDllRet = DllCall("kernel32.dll", "long", "GetLastError")
		If Not @error Then $nError = $aDllRet[0]
	EndIf
	If $nError <> 0 Then
		SetError($nError)
		Return False
	EndIf
	Return True
EndFunc
 

tech-gs

Знающий
Сообщения
54
Репутация
5
Кстати, в первом примере от CreatoR атрибуты RHS с папки удалось снять только с путем "\\?\" & @ScriptDir & "\Desktop.ini\ГвТЯДїВјІ»ТЄЙѕя." Напрямую через "P:\Desktop.ini\ГвТЯДїВјІ»ТЄЙѕя." даже и этого сделать не удавалось. В любом случае, вечером вернут флешку, попробую. Результат сообщу.

Yashied грозился включить _WinAPI_DeleteFile() в WinAPIEx UDF. Это будет реализовано? Было бы полезно вот в таких случаях...
 

tech-gs

Знающий
Сообщения
54
Репутация
5
Примером через _WinAPI_SHFileOperation("P:\Desktop.ini\ГвТЯДїВјІ»ТЄЙѕя.", ...) папка так же не удалилась, и что самое обидное - программа завершается без кода ошибки, т.е. Return True :(
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403
tech-gs [?]
Примером через _WinAPI_SHFileOperation("P:\Desktop.ini\ГвТЯДїВјІ»ТЄЙѕя.", ...) папка так же не удалилась
Ну а если как со снятием аттрибутов?

Код:
_WinAPI_SHFileOperation("\\?\P:\Desktop.ini\ГвТЯДїВјІ»ТЄЙѕя.", ...)
 

tech-gs

Знающий
Сообщения
54
Репутация
5
Пробовал по всякому:
- Global $sFile = "P:\Desktop.ini\ГвТЯДїВјІ»ТЄЙѕя." (скрипт где угодно)
- Global $sFile = "\\?\" & @ScriptDir & "\ГвТЯДїВјІ»ТЄЙѕя." (скрипт в P:\Desktop.ini\; так устанавливаются/снимаются атрибуты методом DllCall("Kernel32.dll", "handle", "SetFileAttributesW", "wstr", $sFile, "dword", $iAttributes))
- Global $sFile = "\\?\" & @ScriptDir & "\Desktop.ini\ГвТЯДїВјІ»ТЄЙѕя." (скрипт в P:\; атрибуты тоже изменяются)
- Global $sFile = "\\?\Desktop.ini\ГвТЯДїВјІ»ТЄЙѕя." (скрипт в P:\)
- Global $sFile = "\\?\P:\Desktop.ini\ГвТЯДїВјІ»ТЄЙѕя." (скрипт в P:\; атрибуты тоже изменяются)

...
_WinAPI_SetFileAttributes($sFile, 0)
_WinAPI_SHFileOperation($sFile, ...

Результат один и тот же - папка на месте.
 
Автор
sforce5

sforce5

Олл фо ЛулзЪ
Сообщения
160
Репутация
41
CreatoR сказал(а):
Поправил функцию (добавил юникод), должно сработать.
Да хоть на иврит перепишите - работать не будет, потому что папку нужно удалять также как и файл (всмысле с использование UNC путей \\?\File), а функция SHFOP не поддерживает их, надо другую функцию найти
 
Верх