Feedback

Papierkorb leeren

Sprache: C#

Hier ein Snippet um den Papierkorb von Windows zu leeren
using System.Runtime.InteropServices;
...
enum RecycleFlags : uint
{
   SHERB_NOCONFIRMATION = 0x00000001,
   SHERB_NOPROGRESSUI   = 0x00000002,
   SHERB_NOSOUND        = 0x00000004
}
 
[DllImport("Shell32.dll", CharSet = CharSet.Unicode)]
static extern uint SHEmptyRecycleBin 
	(IntPtr hwnd, 
	string pszRootPath,
	RecycleFlags dwFlags);
	
public static void Main()
{
    uint result = SHEmptyRecycleBin (IntPtr.Zero, null, 0);
    Console.WriteLine ("Result: {0}", result);
}
using System.Runtime.InteropServices;
...
enum RecycleFlags : uint
{
   SHERB_NOCONFIRMATION = 0x00000001,
   SHERB_NOPROGRESSUI   = 0x00000002,
   SHERB_NOSOUND        = 0x00000004
}
 
[DllImport("Shell32.dll", CharSet = CharSet.Unicode)]
static extern uint SHEmptyRecycleBin 
	(IntPtr hwnd, 
	string pszRootPath,
	RecycleFlags dwFlags);
	
public static void Main()
{
    uint result = SHEmptyRecycleBin (IntPtr.Zero, null, 0);
    Console.WriteLine ("Result: {0}", result);
}

1 Kommentar

  1. Ich versuche mal, den gut 16 Jahre alten Code (veröffentlicht am 21.11.2009) in die aktuelle Zeit zu heben.

    Das Snippet ist funktional, aber es ist ein klassischer Windows-Shell-P/Invoke-Schnipsel: ohne Plattform-Gating läuft er auf Linux/macOS nicht, und in vielen Cloud- oder Service-Szenarien ist der Papierkorb als UX-Konzept entweder nicht vorhanden oder nicht sinnvoll. Außerdem ist die Signatur und Fehlerbehandlung sehr „2009“: der Rückgabewert wird als uint geführt und ohne echte Auswertung ausgegeben, Flags werden zwar definiert, aber im ursprünglichen Aufruf nicht genutzt.

    [b]Analyse nach heutigen Kriterien:[/b]
    – [u]Cross-Platform[/u]: SHEmptyRecycleBin ist Windows-only (Shell32). Auf nicht-Windows-Systemen muss das explizit abgefangen werden, sonst kommt es zu Laufzeitfehlern.
    – [u]Cloud/Container/Service-Fähigkeit[/u]: In nicht-interaktiven Sessions (Windows Service, Server Core, Container) können Shell-APIs fehlschlagen oder wirkungslos sein. Zudem ist das Leeren des Papierkorbs dort fachlich oft nicht sinnvoll.
    – [u]Sicherheit/Schadenspotenzial[/u]: Der Aufruf ist destruktiv, da Daten endgültig entfernt werden. In modernem Code sollte diese Funktion klar als bewusstes User- oder Admin-Feature gekapselt sein.
    – [u]Korrektheit/Interop[/u]: SHEmptyRecycleBin liefert ein HRESULT. Die Signatur sollte ein int zurückgeben, und Fehler sollten sauber ausgewertet oder als Exception weitergereicht werden.
    – [u]UX/Flags[/u]: Wenn das Ziel ein stiller Aufruf ist, müssen die Flags für keine Bestätigung, kein Progress-UI und keinen Sound auch tatsächlich gesetzt werden.
    – [u]Thread-Safety[/u]: Die Methode selbst ist thread-safe, da kein Shared State existiert. Parallelaufrufe sind fachlich trotzdem fragwürdig, da die Operation global wirkt.
    – [u]Performance/Ressourcen[/u]: Der Aufruf ist I/O-lastig und potenziell teuer. Die eigentlichen Kosten liegen nicht im Code, sondern im Zeitpunkt und in der Häufigkeit des Aufrufs.

    [b]Modernisierte Variante (Windows-gated, korrektes HRESULT, Flags genutzt):[/b]
    [code]
    using System;
    using System.Runtime.InteropServices;
    using System.Runtime.Versioning;

    [SupportedOSPlatform(„windows“)]
    public static class RecycleBin
    {
    [Flags]
    private enum RecycleFlags : uint
    {
    SHERB_NOCONFIRMATION = 0x00000001,
    SHERB_NOPROGRESSUI = 0x00000002,
    SHERB_NOSOUND = 0x00000004
    }

    [DllImport(„Shell32.dll“, CharSet = CharSet.Unicode, SetLastError = false)]
    private static extern int SHEmptyRecycleBin(IntPtr hwnd, string? pszRootPath, RecycleFlags dwFlags);

    public static void Empty(bool silent = true, string? rootPath = null)
    {
    if (!OperatingSystem.IsWindows()) throw new PlatformNotSupportedException(„Recycle Bin is a Windows Shell feature.“);

    var flags = silent
    ? RecycleFlags.SHERB_NOCONFIRMATION | RecycleFlags.SHERB_NOPROGRESSUI | RecycleFlags.SHERB_NOSOUND
    : 0;

    int hr = SHEmptyRecycleBin(IntPtr.Zero, rootPath, flags);
    if (hr < 0) Marshal.ThrowExceptionForHR(hr); } } [/code] [b]Warum das heute objektiv besser ist:[/b] - [u]Plattformklarheit[/u]: Der Code ist explizit als Windows-only markiert und verhindert Laufzeitprobleme auf anderen Plattformen. - [u]Robustheit[/u]: HRESULT wird korrekt ausgewertet, Fehler werden sauber signalisiert. - [u]Vorhersehbarkeit[/u]: Silent-Flags werden tatsächlich angewendet und nicht nur deklariert. - [u]Wartbarkeit[/u]: Statt Demo-Code existiert eine klar benannte, gezielt aufrufbare API. [b]Security-Realitätscheck:[/b] Das Leeren des Papierkorbs entspricht einem endgültigen Löschen. In moderner Software sollte diese Funktion nur nach expliziter User-Intention ausgeführt werden, insbesondere wenn der Prozess mit erhöhten Rechten läuft.