none
Корзина/Recycle и C# RRS feed

  • Вопрос

  • Появилась задача создать программу полноценной работы с корзиной windows на c#. нашел хорошую реализацию для C++ Как программно использовать корзину нашел небольшой пример для C#, но не такой полноценный все о корзине. В частности меня конкретно интересует вопрос как узнать размер удаленной папки и иконки к файлам. Вот пример самой корзины windows:  а вот пример работы программы написанной на C++:


    29 апреля 2013 г. 13:08

Ответы

  • Можете, подключите библиотеку Shell32.dll. На форме должен быть ListView

            private void Form1_Load(object sender, EventArgs e)
            {
                ImageList imageList1 = new ImageList();
                Shell32.Shell shell = new Shell32.Shell();
                Shell32.Folder Recycler = shell.NameSpace(10);
                listView1.SmallImageList = imageList1;
                listView1.View = View.SmallIcon;
    
                foreach (Shell32.FolderItem FI in Recycler.Items())
                {
                    Icon iconForFile = SystemIcons.WinLogo;
                    ListViewItem item = new ListViewItem(FI.Name, 1);
                    iconForFile = Icon.ExtractAssociatedIcon(FI.Path);
                    string extension = System.IO.Path.GetExtension(FI.Path);
                    if (!imageList1.Images.ContainsKey(extension))
                    {
                        imageList1.Images.Add(extension, iconForFile);
                    }
                    item.ImageKey = extension;
                    listView1.Items.Add(item);                
                }
            }

    • Помечено в качестве ответа Dobrii 6 мая 2013 г. 6:24
    • Снята пометка об ответе Dobrii 6 мая 2013 г. 6:40
    • Помечено в качестве ответа Dobrii 7 мая 2013 г. 6:17
  • DriveInfo[] allDrives = DriveInfo.GetDrives();
    string Volum = string.empty;
    foreach (DriveInfo d in allDrives)
    {
       if (d.IsReady == true)
       {
          if (d.DriveType.ToString() == "Fixed")
          {
             MPanel.DeviceLib.VolumeDeviceClass volumeDeviceClass = new MPanel.DeviceLib.VolumeDeviceClass();
    
             foreach (MPanel.DeviceLib.Volume device in volumeDeviceClass.Devices)
                {
                    if (device.LogicalDrive == d.Name.TrimEnd('\\'))
                    {
                        Volum = device.VolumeName.Substring(device.VolumeName.IndexOf('{')).TrimEnd('\\');
                    }
                }
             string registryKey = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\BitBucket\\Volume\\" + Volum;
             Microsoft.Win32.Registry.CurrentUser.OpenSubKey(registryKey).GetValue("MaxCapacity").ToString();
          }
       }
    }

    • Помечено в качестве ответа Dobrii 7 октября 2015 г. 6:18

Все ответы

  • Добрый день.

    Вторую не смотрел, но первая программа, это просто вызов WinAPI функций. Особой разницы от куда их вызывать нет. Смотрите как инициализируются данные в C++ и вызываете в C#. Если вопрос по конкретной функции, с которой вы не понимаете как работать, напишите с какой...

    30 апреля 2013 г. 5:38
    Отвечающий
  • можно ли все это сделать через ?
    shell = new Shell();//создаем новый экземпляр интерфейса Shell
    Folder recycleBin = shell.NameSpace(10);//перебираем всё, что содержится в recycleBin, т. е. файлы и папки
    foreach (FolderItem2 f in recycleBin.Items())
    {
          f.ExtendedProperty("{9B174B33-40FF-11D2-A27E-00C04FC30871}3");
                    
          //добавляем первоначальное расположение файла
          f.ExtendedProperty("{9B174B33-40FF-11D2-A27E-00C04FC30871}2");
    }       
    //нужно всегда освобождать ресурсы из-под более ненужного объекта COM (каковым Shell32 и является)
    Marshal.FinalReleaseComObject(shell);
            
    ExtendedProperty Attributes

    • Изменено Dobrii 30 апреля 2013 г. 6:28
    30 апреля 2013 г. 6:27
  • Можете, подключите библиотеку Shell32.dll. На форме должен быть ListView

            private void Form1_Load(object sender, EventArgs e)
            {
                ImageList imageList1 = new ImageList();
                Shell32.Shell shell = new Shell32.Shell();
                Shell32.Folder Recycler = shell.NameSpace(10);
                listView1.SmallImageList = imageList1;
                listView1.View = View.SmallIcon;
    
                foreach (Shell32.FolderItem FI in Recycler.Items())
                {
                    Icon iconForFile = SystemIcons.WinLogo;
                    ListViewItem item = new ListViewItem(FI.Name, 1);
                    iconForFile = Icon.ExtractAssociatedIcon(FI.Path);
                    string extension = System.IO.Path.GetExtension(FI.Path);
                    if (!imageList1.Images.ContainsKey(extension))
                    {
                        imageList1.Images.Add(extension, iconForFile);
                    }
                    item.ImageKey = extension;
                    listView1.Items.Add(item);                
                }
            }

    • Помечено в качестве ответа Dobrii 6 мая 2013 г. 6:24
    • Снята пометка об ответе Dobrii 6 мая 2013 г. 6:40
    • Помечено в качестве ответа Dobrii 7 мая 2013 г. 6:17
  • слишком медленно!!!!
  • Оптимизируйте. Иконки вытаскиваются по пути, значит можно сделать словарь <расширение файла, иконка> и переиспользовать одни и те же иконки, вместо того, чтобы каждый раз их вытаскивать по новой.
    Отвечающий
  • Откровенно говоря не думал о производительности, более того в коде не хватает нескольких проверок. Не стоит позиционировать код который приводят на форуме  как готовый для использования, рассматривайте его исключительно как отправную точку для реализации собственных нужд. По существу, я бы тоже посоветовал проверить что именно работает медленно(как самый примитивнй вариант - просто исключить добавление иконок из кода). Очень сомневаюсь что вы сможете получить скорость работы сопоставимую с проводником, наверняка там реализоываны дополнительные механизмы индексации.
    • Изменено Bazzzy 6 мая 2013 г. 12:55
  • Еще вопросик. Как узнать размер корзины, т.е. её вместимость или как добраться до настроек корзины? 
  • DriveInfo[] allDrives = DriveInfo.GetDrives();
    string Volum = string.empty;
    foreach (DriveInfo d in allDrives)
    {
       if (d.IsReady == true)
       {
          if (d.DriveType.ToString() == "Fixed")
          {
             MPanel.DeviceLib.VolumeDeviceClass volumeDeviceClass = new MPanel.DeviceLib.VolumeDeviceClass();
    
             foreach (MPanel.DeviceLib.Volume device in volumeDeviceClass.Devices)
                {
                    if (device.LogicalDrive == d.Name.TrimEnd('\\'))
                    {
                        Volum = device.VolumeName.Substring(device.VolumeName.IndexOf('{')).TrimEnd('\\');
                    }
                }
             string registryKey = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\BitBucket\\Volume\\" + Volum;
             Microsoft.Win32.Registry.CurrentUser.OpenSubKey(registryKey).GetValue("MaxCapacity").ToString();
          }
       }
    }

    • Помечено в качестве ответа Dobrii 7 октября 2015 г. 6:18