Мусорка

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Мусорка

Сообщение Alexanbar » 30.09.2005 (Пт) 19:28

Никогда не думал, что понадобится разбираться, как работает Корзина, но вот пришла в голову очередная идея, и решил попробовать её осуществить.
Нужно, собственно, следующее:

1. Функции для перечисления объектов Корзины и, по всей видимости, таблица соответствия имён удалённых объектов и то, как они в действительности называются физически в папке "Корзина".

Перечисленные объекты планируется отображать в Listview (не в Проводнике!).

2. Восстановление из Корзины конкретного объекта, в том числе, желательно и файла/папки внутри удалённой папки.

3. Ну и, наконец, из области фантастики- как использовать Корзину для объектов собственного формата.

Удалось пока найти только функцию для очистки всей Корзины, а также упоминания о каких-то страшных зверях типа NameSpaces - так их, кажется, кличут.

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 30.09.2005 (Пт) 19:55

Корзина - это папка с файлами, ничего более. Получите путь и пользуйтесь.
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 30.09.2005 (Пт) 20:01

Дык они там переименованы по-хитрому...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 01.10.2005 (Сб) 6:00

Получить то путь легко, а вот сделать все остальное...
Весь мир матрица, а мы в нем потоки байтов!

Kiryusha
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 216
Зарегистрирован: 30.08.2005 (Вт) 10:56
Откуда: УР, Ижевск

Сообщение Kiryusha » 03.10.2005 (Пн) 12:38

Пробовал сделать то же что и ты. Нифига не получилось. Самое тупое в данное ситуации, что нет APIшки, которая бы доставала дату удаления файлов в корзину, но могу подсказать, что полный путь до удалённых файлов и их оригинальные названия хранятся там же в Recycled в файле INFO2 он без разрешения, поэтому советую открывать его программно. Там ты и отыщешь что тебе надо. Мне говорили, что и дата записана там же, но она закодирована, а как её раскодировать никто не знает.

На деюсь помог! Удачи, если что получится пиши по Аське.
Судебно-медицинское вскрытие показало, что чукча умер в
результате судебно-медицинского вскрытия.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 03.10.2005 (Пн) 13:02

GSerg писал(а):Дык они там переименованы по-хитрому...


Да ладно вам - что там хитрого:

Код: Выделить всё
    Dim ws As New Shell32.Shell, ff As Shell32.Folder, f As Shell32.FolderItem
   
    Set ff = ws.Namespace(ssfBITBUCKET)
    For Each f In ff.Items
        Debug.Print f.Name, f.ModifyDate
    Next f
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 03.10.2005 (Пн) 14:23

Это хорошо. Осталось неясным:
1. Почему не работает свойство IsFolder
2. Как узнать путь для восстановления (откуда был удалён объект)
Вложения
Корзина.zip
(2.52 Кб) Скачиваний: 33

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 03.10.2005 (Пн) 14:39

Alexanbar писал(а):Это хорошо. Осталось неясным:
1. Почему не работает свойство IsFolder


Может оно и не должно работать? Меняется свойство IsLink.

Alexanbar писал(а):2. Как узнать путь для восстановления (откуда был удалён объект)


Да не смотрел...
А восстановить похоже можно и без этого - используя InvokeVerb ...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 03.10.2005 (Пн) 14:43

Alexanbar писал(а):2. Как узнать путь для восстановления (откуда был удалён объект)


Вроде это:

f.Parent.ParentFolder.Self.Path
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 03.10.2005 (Пн) 19:03

Andrey Fedorov писал(а):
Alexanbar писал(а):2. Как узнать путь для восстановления (откуда был удалён объект)


Вроде это:

f.Parent.ParentFolder.Self.Path


Это возвращает путь к моему Рабочему столу для всех объектов.


Собственно говоря, восстановление - это не самое главное. Нужен именно путь, откуда объект был удалён. В первую очередь не для восстановления, а для перечисления объектов Корзины с фильтрацией. Скажем, показать то, что удалено из КОНКРЕТНОЙ ПАПКИ, а не удалено вообще отовсюду.

Ну, по крайней мере, буду копать объект Shell дальше.

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 03.10.2005 (Пн) 22:26

Ну, вроде узнал, как найти исходное размещение:
Public ff As Shell32.Folder

Private Sub Form_Load()
Dim ws As New Shell32.Shell, f As Shell32.FolderItem, f2 As Shell32.Folder
Dim lItem As ListItem, FSO As New FileSystemObject

Set ff = ws.NameSpace(ssfBITBUCKET)



For Each f In ff.Items

If f.IsFileSystem Then
Set lItem = ListView1.ListItems.Add

lItem.Text = f.Name

lItem.SubItems(1) = f.Type
lItem.SubItems(2) = f.Path
lItem.SubItems(3) = f.Size
lItem.SubItems(4) = ff.GetDetailsOf(f, 1)



If f.IsLink Then
lItem.SmallIcon = "lnk"

ElseIf FSO.FolderExists(f.Path) Then


lItem.SmallIcon = "CloseFold"
Else
lItem.SmallIcon = "File"

End If

End If

Next f



End Sub
Вложения
Корзина.zip
Обзор объектов Корзины
(2.8 Кб) Скачиваний: 30

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 03.10.2005 (Пн) 23:52

Win98 SE

Код: Выделить всё
If f.IsFileSystem Then


Условие не происходит вообще.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Kiryusha
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 216
Зарегистрирован: 30.08.2005 (Вт) 10:56
Откуда: УР, Ижевск

Сообщение Kiryusha » 04.10.2005 (Вт) 12:54

АУ-У!!! :x

Я же говорю, что все данные записаны в файле INFO2!!!!

Он находится там же в recycled.

Набери простейший код программы

Код: Выделить всё
Open "C:\recycled\info2" for Input as #1
   do while not oef(1)
        line input #1, s
        txtOutput.Text=txtOutput.Text  & s +vbCrLf
   loop
close #1


Там ты и увидишь эти директории!!!
Судебно-медицинское вскрытие показало, что чукча умер в
результате судебно-медицинского вскрытия.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 04.10.2005 (Вт) 13:04

Kiryusha, ты проверь этот код на NTFS. А потом иди учить матчасть.
Lasciate ogni speranza, voi ch'entrate.

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 04.10.2005 (Вт) 16:13

Kiryusha писал(а):АУ-У!!! :x

Я же говорю, что все данные записаны в файле INFO2!!!!

Он находится там же в recycled.

Набери простейший код программы

Код: Выделить всё
Open "C:\recycled\info2" for Input as #1
   do while not oef(1)
        line input #1, s
        txtOutput.Text=txtOutput.Text  & s +vbCrLf
   loop
close #1


Там ты и увидишь эти директории!!!


Это не самый лучший вариант. Выйдет какая - нибудь новая версия Windows с новым форматом файла INFO2, и все труды с парсингом строк пойдут на смарку. Кстати, у меня на компе стоят две оси-98 и XP. Так вот w98 портит Корзину для XP при удалении в w98 и не видит удалённых в XP объектов. Т.Е. получается, что одновременно Корзиной пользоваться в разных осях нельзя.

А событие
If f.IsFileSystem Then

действительно не происходит в w98.

А ещё там же функция GetDetails возвращает не те столбики, и кроме того, f.type возвращает почему-то дату, а f.Path возвращает имя файла, а не путь в Корзине.

Видать, придётся считывать версию, прежде чем, что-то извлекать.

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 10.10.2005 (Пн) 21:53

Проект с усовершенствованием мусорки постепенно продвигается, но встретилось очередное затруднение.




Public ff As Shell32.Folder
....



При использовании метода Doit

ff.Items.Item(i).Verbs.Item(j).DoIt



Можно восстановить, удалить и т.д. из корзины.

Вот только хотелось бы узнать, какое конкретно действие означает каждый из пунктов контекстного меню НЕЗАВИМО ОТ ЯЗЫКА, т.е., что пункт
"Сво&йства" меню означает Свойства и т.д.
Попробовал искать в реестре - не удалось.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 128

    TopList