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

Источник: http://csharphelper.com/blog/2015/07/manage-the-recycle-bin-wastebasket-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector