Управляйте корзиной (корзиной для мусора) в C#
Вы можете использовать функции API для управления корзиной, но некоторые операции намного проще, если вы используете библиотеку Microsoft.VisualBasic. Вы можете использовать API, если хотите, но я предпочел бы сделать все возможное, чтобы сэкономить время и избежать ошибок.
Чтобы использовать библиотеку Microsoft.VisualBasic, сначала добавьте ссылку на нее. Затем добавьте оператор using в код, который будет использовать подпрограммы.
Эта библиотека может помочь вам переместить файл или каталог в корзину, но это не поможет вам получить количество элементов в корзине или удалить его. Для этих задач вы застряли с помощью API.
В этом примере создается класс Recycler, который предоставляет статические методы для перемещения файлов или каталогов в корзину, получения количества элементов в корзине и опорожнения корзины.
Следующий код показывает, как Recycler получает количество файлов в корзине.
// Структура, используемая SHQueryRecycleBin. [StructLayout(LayoutKind.Sequential)] private struct SHQUERYRBINFO { public int cbSize; public long i64Size; public long i64NumItems; } // Получить информацию из корзины. [DllImport("shell32.dll")] private static extern int SHQueryRecycleBin(string pszRootPath, ref SHQUERYRBINFO pSHQueryRBInfo); // Очистите корзину. [DllImport("shell32.dll")] static extern int SHEmptyRecycleBin(IntPtr hWnd, string pszRootPath, uint dwFlags); // Возвращает количество элементов в корзине. // Примечание. В Windows 2000 вам необходимо указать корень // к вызову SHQueryRecycleBin, чтобы получить // общее количество файлов в корзине, которые вы должны добавить // вверх по результатам для каждого диска. Видеть: // http://www.pinvoke.net/default.aspx/shell32/SHQueryRecycleBin.html public static int NumberOfFilesInRecycleBin() { SHQUERYRBINFO sqrbi = new SHQUERYRBINFO(); sqrbi.cbSize = Marshal.SizeOf(typeof(SHQUERYRBINFO)); int hresult = SHQueryRecycleBin(string.Empty, ref sqrbi); return (int)sqrbi.i64NumItems; }
Код сначала определяет структуру SHQUERYRBINFO и функцию API SHQueryRecycleBin. Он также определяет функцию API SHEmptyRecycleBin для последующего использования.
Код сначала определяет структуру SHQUERYRBINFO и функцию API SHQueryRecycleBin. Он также определяет функцию API SHEmptyRecycleBin для последующего использования.
...
Метод NumberOfFilesInRecycleBin вызывает функцию API SHQueryRecycleBin и возвращает параметр i64NumItems, который он получает. (Да, это довольно уродливый код, поэтому я предпочитаю использовать библиотеку Microsoft.VisualBasic, если это возможно.)
// Удалите файл или переместите его в корзину. public static void DeleteFile(string filename, bool confirm, bool delete_permanently) { UIOption ui_option = UIOption.OnlyErrorDialogs; if (confirm) ui_option = UIOption.AllDialogs; RecycleOption recycle_option = recycle_option = RecycleOption.SendToRecycleBin; if (delete_permanently) recycle_option = RecycleOption.DeletePermanently; try { FileSystem.DeleteFile(filename, ui_option, recycle_option); } catch (Exception ex) { MessageBox.Show("Error deleting file.\n" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
Код устанавливает некоторые параметры, которые зависят от параметров метода, а затем вызывает FileSystem.DeleteFile, чтобы удалить файл.
Метод Recycler класса DeleteDirectory класса очень похож, за исключением того, что он вызывает FileSystem.DeleteDirectory. Подробнее см. В коде.
Следующий код показывает, как Recycler освобождает корзину.
// Опорожните корзину для мусора. [Flags] private enum RecycleFlags : uint { SHERB_NOCONFIRMATION = 0x1, SHERB_NOPROGRESSUI = 0x2, SHERB_NOSOUND = 0x4 } public static void EmptyWastebasket(bool show_progress, bool play_sound, bool confirm) { RecycleFlags options = 0; if (!show_progress) options = options | RecycleFlags.SHERB_NOPROGRESSUI; if (!play_sound) options = options | RecycleFlags.SHERB_NOSOUND; if (!confirm) options = options | RecycleFlags.SHERB_NOCONFIRMATION; try { SHEmptyRecycleBin(IntPtr.Zero, null, (uint)options); } catch (Exception ex) { MessageBox.Show("Error emptying wastebasket.\n" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
Код сначала устанавливает нужные параметры, а затем вызывает функцию API SHEmptyRecycleBin.
Класс Recycler упрощает использование этих методов. Например, следующий код показывает, как основная программа удаляет файл, имя которого находится в txtFile TextBox. Другие параметры получают свои значения из настроек CheckBox и RadioButton, выбранных в форме.
// Удалите файл. private void btnDeleteFile_Click(object sender, EventArgs e) { Recycler.DeleteFile( txtFile.Text, chkConfirmDelete.Checked, radDeletePermanently.Checked); }