Управляйте корзиной (корзиной для мусора) в 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);
}
