Holger Stehle

Softwareentwicklung und -architektur

« Datei in Papierkorb verschieben

Leider bietet das .NET-Framework mit C# standardmäßig keine in verwaltetem Code implementierte Möglichkeit, Dateien in den Papierkorb zu verschieben statt direkt zu löschen (mit VB.NET interessanterweise jedoch schon).

Es ist möglich, die entsprechende Funktionalität aus VB.NET auch in C# zu verwenden – dazu muss lediglich ein Verweis auf die Assembly Microsoft.VisualBasic ergänzt werden. Anschließend funktioniert folgender Aufruf:

FileSystem.DeleteFile("Datei.ext", UIOption.OnlyErrorDialogs, RecycleOption.SendToRecycleBin)

Alternativ lässt sich eine Erweiterungsmethode für FileInfo schreiben, welche mittels DllImport direkt auf die entsprechende Funktionalität der Windows-API zurückgreift. Dazu implementieren wir folgende Klasse:

public static class RecycleBinExtension {
    public static void SendToRecycleBin(this FileInfo fileInfo) {
        SHFILEOPSTRUCT lpFileOp = new SHFILEOPSTRUCT {
            wFunc  = 0x03,  // FO_DELETE
            pFrom  = fileInfo.FullName + "\0\0",
            fFlags = 0x40   // FOF_ALLOWUNDO
        };

        SHFileOperation(ref lpFileOp);
    }


    [DllImport("shell32")]
    private static extern int SHFileOperation(ref SHFILEOPSTRUCT lpFileOp);

    [StructLayout(LayoutKind.Sequential)]
    private struct SHFILEOPSTRUCT {
        public IntPtr hwnd;
        public uint wFunc;
        public string pFrom;
        public string pTo;
        public ushort fFlags;
        public bool fAnyOperationsAborted;
        public IntPtr hNameMappings;
        public string lpszProgressTitle;
    }
}

Zusätzliche Funktionalität habe ich absichtlich außer Acht gelassen. Die Verwendung gestaltet sich nun sehr intuitiv:

FileInfo fileInfo = new FileInfo("Datei.ext");
fileInfo.SendToRecycleBin();

Im MSDN finden sich weiterführende Informationen zu SHFileOperation und SHFILEOPSTRUCT.