Как получить свойство «Дата удаления» элемента, хранящегося в корзине, с помощью пакета кода Windows API?

ОБНОВЛЕНИЕ 2

Наконец, протестировав большинство интерфейсов WindowsAPICodePack, я сам нашел способ доступа к удаленным файлам в корзине.

Уникальная проблема сейчас заключается в том, что мне нужно знать, как получить доступ к требуемому пакету свойств, чтобы получить дату удаления каждого файла (и папки, и ссылки). Это пример кода:

Dim RecycleBin As IKnownFolder = KnownFolders.RecycleBin

For Each File As ShellFile In (From Item As ShellObject In RecycleBin
                               Where Item.GetType = GetType(ShellFile))

    MsgBox(File.Name)
    MsgBox(File.Properties.System.IsDeleted.Value) ' It's empty.
    MsgBox(File.Properties.System.DateAcquired.Value) ' This is not the correct value.
    MsgBox(File.Properties.System.DateArchived.Value) ' This is also not the correct value.
    MsgBox(File.Properties.System.DateCompleted.Value) ' This is also not the correct value.
    MsgBox(File.Properties.System.DateCreated.Value) ' This is also not the correct value.
    MsgBox(File.Properties.System.DateImported.Value) ' This is also not the correct value.

Next File

person ElektroStudios    schedule 06.01.2014    source источник
comment
возможный дубликат Доступ к корзине   -  person Kurubaran    schedule 06.01.2014
comment
О вопросе нельзя сообщать как о дубликате, только если на другой вопрос есть отмеченный ответ или реальное решение?... потому что это не так, и в другом вопросе парень не ответил на решение о датах удаления, для меня это нет смысла в подобных репортажах в данных условиях.   -  person ElektroStudios    schedule 06.01.2014
comment
@ElektroStudios Его нужно получать через WindowsAPICodePack? Удаленная дата и исходный путь симпатичны. Я просто не уверен, что поддерживает слежение за мусором - Recycler является одним из тех специализированных системных объектов.   -  person Ňɏssa Pøngjǣrdenlarp    schedule 17.01.2014
comment
@Plutonix, теперь неважно, я нашел способ вызывать свойства через WindowsAPICodePack, я опубликую решение, когда смогу закончить код. но если вы знаете ответ: stackoverflow.com/questions/21187912/ вы можете опубликовать ответ здесь, чтобы получить некоторые очки (если вам это интересно)   -  person ElektroStudios    schedule 17.01.2014


Ответы (2)


пакет кода Windows API может помочь ты. Он имеет более обширные (полные) реализации большинства интерфейсов оболочки. Вам нужно будет открыть элементы пакета кода (атрибут манифеста приложения InternalsVisibleTo или просто изменить все внутренние интерфейсы на внешние), чтобы использовать их вне заданных оболочек.

Что касается даты удаления: она содержится в пакете свойств элемента оболочки.
Великий Рэймонд Чен, который был разработчиком в Microsoft с незапамятных времен и лично создал Windows Shell, написал полную прогулку. через статью о том, как сделать это на C++, метко названную 'Как я могу получить информацию об элементах в Корзине?'

Вы можете с помощью небольшого логического вывода отделить от него нужные вам фрагменты и создать собственную управляемую реализацию.

Между этими двумя ссылками теперь у вас есть все знания, которыми вы обладаете, чтобы решить вашу проблему, а затем и некоторые другие.

person Nathan M    schedule 07.01.2014
comment
Прежде всего, извините за поздний комментарий и спасибо за ответ. 1. Прочитав документацию по URL 3 раза, я не могу найти там ничего, что могло бы мне помочь (это потому, что я не C/C++ программист, извините). Я только вижу, что он просто использует интерфейс IShellFolder для других вещей, но я не могу понять, может ли это мне помочь. 2. Я иногда использую WindowsAPICodePack, но для вещей на панели задач, на самом деле я не знаю, как войти в корзину с помощью WindowsAPICodePack, но на самом деле я был бы признателен за решение, использующее его, которое могло бы мне помочь. - person ElektroStudios; 17.01.2014
comment
Кстати пробовал менять все internal Interface на public Interface в исходниках (именно в файле ShellCOMInterfaces.cs) но компилятор выдает много ошибок видимости и ошибки метаданных в сборке windowsapicodepack.Shell.dll... извините не успеваю C# Тогда мне мог бы понадобиться один человек, который мог бы предоставить мне новый Windows API Pack скомпилированный с теми внутренними изменениями, о которых вы упомянули, но я знаю, может быть, это требует слишком многого... что ж, еще раз спасибо. - person ElektroStudios; 17.01.2014
comment
Наконец-то я нашел способ использовать WindowsAPICodePack для восстановления удаленных файлов! но теперь мне нужна помощь, чтобы получить сумку с имуществом, о которой вы сказали, пожалуйста, посмотрите мое второе обновление, спасибо. - person ElektroStudios; 17.01.2014
comment
Вы помогли мне глубоко изучить WindowsAPICodePack, наконец, я сделал это, спасибо, и ответ принят. - person ElektroStudios; 17.01.2014
comment
установка атрибута InternalsVisibleTo для ссылки на имя сборки (а не на пространство имен) вашего проекта внутри файла AssemblyInfo.cs библиотеки Shell C# поможет вам очень быстро открыть все это без необходимости изменять область действия самого кода. Это позволяет всем внутренним/дружеским объявлениям в библиотеке оболочки стать видимыми для вашего приложения. Если вы используете строгое имя, вам также необходимо указать ключ (см.: msdn.microsoft.com/en-us/library/ ) - person Nathan M; 19.01.2014
comment
Эта статья об использовании функции GetDetailsEx интерфейса IShellFolder2 должна вам очень помочь. Когда вы нажимаете на параметр SHCOLUMNID, он дает вам подробную информацию для захвата всех видов данных из оболочки. Статья: msdn.microsoft.com /en-us/library/windows/desktop/ - person Nathan M; 19.01.2014

Получить свойство DateDeleted элемента очень просто:

Private Sub Test() Handles MyBase.Shown

    ' Get all the desired deleted items inside the Recycle Bin using WindowsAPICodePack.
    ' ( In my case I only retrieve the deleted files excluding folders. )
    Dim RecycledFiles As ShellFile() = RecycleBin.MasterBin.Files

    ' Loop through the deleted Items.
    For Each Item As ShellFile In RecycledFiles

        ' Append the full name
        sb.AppendLine(Item.Name)

        ' Append the DateDeleted.
        sb.AppendLine(Item.Properties.GetProperty("DateDeleted").ValueAsObject.ToString)

        MsgBox(sb.ToString)
        sb.Clear()

    Next Item

End Sub

Затем, чтобы получить последний удаленный файл, например:

''' <summary>
''' Gets the last deleted file inside recycle bin.
''' </summary>
''' <returns>ShellFile.</returns>
Public Shared Function GetLastDeletedFile() As ShellFile

    Return (From Item As ShellFile In GetDeletedItems(Of ShellFile)(Nothing)
            Order By Item.Properties.GetProperty("DateDeleted").ValueAsObject).Last

End Function

И с помощью этого фрагмента мы можем получить другие имена свойств и значения каждого из них:

Dim sb As New System.Text.StringBuilder

Private Sub Test() Handles MyBase.Shown

    ' Get all the desired deleted items inside the Recycle Bin using WindowsAPICodePack.
    ' ( In my case I only retrieve the deleted files excluding folders. )
    Dim RecycledFiles As ShellFile() = RecycleBin.MasterBin.Files

    ' Loop through the deleted Items.
    For Each Item As ShellFile In RecycledFiles

        ' Append the full name (It's String type)
        sb.AppendLine(Item.Name)

        ' Loop through the Item properties.
        For Each prop In Item.Properties.DefaultPropertyCollection

            ' Append an empty line
            sb.AppendLine()

            ' Append the property name (It's String type)
            sb.Append(prop.CanonicalName)

            ' Append the property value (It's a generic Object type)
            If prop.ValueAsObject IsNot Nothing Then
                sb.Append(" = " & prop.ValueAsObject.ToString)
            Else
                sb.Append(" = NULL")
            End If

            MsgBox(sb.ToString)

        Next prop

    Next Item

End Sub

Еще один пример:

Private Sub Test() Handles MyBase.Shown

    ' Get all the deleted items inside the Recycle Bin using WindowsAPICodePack.
    Dim RecycledItems As ShellObject() = RecycleBin.MainBin.Items

    ' Loop through the deleted Items (Ordered by Deletion Date).
    For Each Item As ShellFile In (From itm In RecycledItems
                                   Order By itm.Properties.GetProperty("DateDeleted").ValueAsObject Ascending)

        ' Append the property bags information.
        sb.AppendLine(String.Format("Full Name: {0}",
                                    Item.Name))

        sb.AppendLine(String.Format("Item Name: {0}",
                                    Item.Properties.GetProperty("System.ItemNameDisplay").ValueAsObject))

        sb.AppendLine(String.Format("Deleted From: {0}",
                                    Item.Properties.GetProperty("DeletedFrom").ValueAsObject))

        sb.AppendLine(String.Format("Item Type: {0}",
                                    Item.Properties.GetProperty("System.ItemTypeText").ValueAsObject))

        sb.AppendLine(String.Format("Item Size: {0}",
                                    Item.Properties.GetProperty("System.Size").ValueAsObject))

        sb.AppendLine(String.Format("Attributes: {0}",
                                    [Enum].Parse(GetType(IO.FileAttributes),
                                                 Item.Properties.GetProperty("System.FileAttributes").ValueAsObject.ToString)))

        sb.AppendLine(String.Format("Date Deleted: {0}",
                                    Item.Properties.GetProperty("DateDeleted").ValueAsObject))

        sb.AppendLine(String.Format("Date Modified: {0}",
                                    Item.Properties.GetProperty("System.DateModified").ValueAsObject))

        sb.AppendLine(String.Format("Date Created: {0}",
                                    Item.Properties.GetProperty("System.DateCreated").ValueAsObject))

        MsgBox(sb.ToString)
        sb.Clear()

    Next Item

End Sub
person ElektroStudios    schedule 17.01.2014
comment
Обратите внимание, что каноническое имя этого свойства — System.Recycle.DateDeleted, и оно (расплывчато) задокументировано здесь: msdn.microsoft.com/en-us/windows/bb776504.aspx - person Simon Mourier; 18.01.2014
comment
Это очень круто. Я начал изучать API неуправляемым способом, когда использование C++ было крутым, поэтому я знаю API так, как его описывает C++. Мне проще найти ответ на C++, используя документацию MSDN, чем рыться в WindowsApiCodePack в поисках таких глупых и очевидных ответов, как этот. Я даже не знал, что есть метод получения свойств по имени... :-) Я использую флаги и GUID. - person Nathan M; 19.01.2014