Тема: AHK: Проверка содержимого корзины
Возможно ли узнать, есть ли что-то в Корзине, и, если да, что именно?
Если второе нереализуемо, то интересует хотя бы первая часть.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Возможно ли узнать, есть ли что-то в Корзине, и, если да, что именно?
Если второе нереализуемо, то интересует хотя бы первая часть.
VarSetCapacity(SHQRB,20)
NumPut(20,SHQRB)
DllCall("shell32\SHQueryRecycleBinA","STR","C:\Windows","Uint",&SHQRB)
MsgBox % "`nTotal Bytes: " NumGet(SHQRB,4,"Int64") " (" Round(NumGet(SHQRB,4,"Int64")/1024/1024,0) " MB)"
Пример с офсайта, работающий, вероятно, на ahk-basic.
Возможно, кто-то адаптирует под ahk-l unicode x86-x64
Если нужно узнать размер корзины на всех дисках, первым параметром нужно послать 0, иначе — путь к диску, например "C:" (обязательно в кавычках).
GetRecycleBinContent(0, Size, NumItems)
MsgBox, % "Размер в байтах — " Size "`nКоличество объектов — " NumItems
GetRecycleBinContent(RootPath, ByRef Size, ByRef NumItems)
{
VarSetCapacity(SHQRB, 20)
NumPut(20, SHQRB)
DllCall("shell32\SHQueryRecycleBin" . (A_IsUnicode ? "W" : "A")
, RootPath = 0 ? "UInt" : "Str" , RootPath, Ptr, &SHQRB)
Size := NumGet(SHQRB, 4, "Int64")
NumItems := NumGet(SHQRB, 12, "Int64")
}
Или через COM (для всех дисков):
oShell := ComObjCreate("Shell.Application")
oFolder := oShell.NameSpace(ssfBITBUCKET := 0xA)
for Item in oFolder.Items
Items .= Item.Name . " Size in bytes = " . Item.Size . "`n"
MsgBox, % SubStr(Items, 1, -1)
В последнем случае размеры для папок не определяются (по-крайней мере на XP).
Первый пример отображает размер и количество файлов в корзине при использовании ahk_l unicode x86 win XP, но не ahk_l unicode x64 win7.
Второй и на win7 размеры папок не определяет.
GetRecycleBinContent(0, Size, NumItems)
MsgBox, % "Размер в байтах — " Size "`nКоличество объектов — " NumItems
GetRecycleBinContent(RootPath, ByRef Size, ByRef NumItems)
{
NumPut(VarSetCapacity(SHQRB, A_PtrSize = 4 ? 20 : 24), SHQRB)
DllCall("shell32\SHQueryRecycleBin" . (A_IsUnicode ? "W" : "A")
, RootPath = 0 ? "UInt" : "Str", RootPath, Ptr, &SHQRB)
Size := NumGet(SHQRB, A_PtrSize = 4 ? 4 : 8, "Int64")
NumItems := NumGet(SHQRB, A_PtrSize = 4 ? 12 : 16, "Int64")
}
А так?
Так — работает корректно. Спасибо
Заодно стало понятно зачем в начало SHQRB записывается некое число.
Про выравнивание забыл
А получится перемещать из Корзины в определённую папку последний удалённый в неё объект? Нужно для перемещения файлов из окон тех программ, которые перемещение не поддерживают.
Вопрос, кажется, специфический, потому тему решил не создавать.
На правах метода альтернативного перемещению через корзину
Если из окна программы файл можно поместить в корзину, вероятно его возможно и скопировать?
После «копирования в буфер» в Clipboard можно увидеть путь к «скопированным файлам».
Я чаю, обжекция сия на момент перемещения может программой вельми использоваться, окромя того, останется видна в ея списке. Но что уже сверх того не пригоже — путь до обжекции отнюдь не будет удалён из базы, если программа оную ведёт.
Зело могу ошибаться
С помощью COM скорее всего можно. Подождём специалистов.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться