Empty Recycle Bin with C#
Passend zum letzten Beitrag (Datei mit C# in Papierkorb verschieben) soll es noch einmal um den Papierkorb gehen. Um den Papierkorb zu leeren gibt es leider ebenfalls keine in verwaltetem Code zur Verfügung stehende Funktionalität des .NET-Frameworks für C#. Es ist also – wieder einmal – an der Zeit für
Wir werden dazu eine Klasse
DllImport
.Wir werden dazu eine Klasse
RecycleBin
mit integrierten RecycleFlags
erstellen:
RecycleBin.cs
Die Verwendung gestaltet sich nun wieder gewohnt einfach:
010203040506070809101112131415161718
public static class RecycleBin { public static void Clear(RecycleFlags recycleFlags = RecycleFlags.None) { SHEmptyRecycleBin(IntPtr.Zero, null, recycleFlags); }
[DllImport("shell32")] private static extern uint SHEmptyRecycleBin( IntPtr hwnd, string pszRootPath, RecycleFlags dwFlags );
public enum RecycleFlags : uint { None = 0x0, // Standardverhalten NoConfirmation = 0x1, // keine Rückfrage zur Bestätigung NoProgressUI = 0x2, // keine Fortschrittsanzeige NoSound = 0x4 // kein Abschlussgeräusch }}
Papierkorb leeren
Im MSDN gibt es wie üblich weitere Details zu 0102030405
// Papierkorb leeren (Standard)RecycleBin.Clear();
// Papierkorb ohne Rückfrage leerenRecycleBin.Clear(RecycleBin.RecycleFlags.NoConfirmation);
SHEmptyRecycleBin
. Move File to Recycle Bin with C#
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
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:
VB.NET-Funktionalität verwenden
Alternativ lässt sich eine Erweiterungsmethode für 01
FileSystem.DeleteFile("Datei.ext", UIOption.OnlyErrorDialogs, RecycleOption.SendToRecycleBin);
FileInfo
schreiben, welche mittels DllImport
direkt auf die entsprechende Funktionalität der Windows-API zurückgreift. Dazu implementieren wir folgende Klasse:
Erweiterungsmethode für C# per Interop
Zusätzliche Funktionalität habe ich absichtlich außer Acht gelassen. Die Verwendung gestaltet sich nun sehr intuitiv:
010203040506070809101112131415161718192021222324252627
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; }}
Erweiterungsmethode verwenden
Im MSDN finden sich weiterführende Informationen zu 0102
FileInfo fileInfo = new FileInfo("Datei.ext");fileInfo.SendToRecycleBin();
SHFileOperation
und SHFILEOPSTRUCT
. Ping via C#
Zwar könnte man hier ähnlich wie im Artikel Konsolenausgabe in C# verwenden für
traceroute
beschrieben vorgehen, jedoch bietet es sich an, die Ping
-Klasse des .NET-Frameworks zu verwenden. Diese möchte ich mit diesem Beitrag kurz vorstellen, da sie interessanterweise zu den doch eher unbekannteren Funktionalitäten gehört.
Ping-Klasse verwenden
Es können durch entsprechende Überladungen weiterführende Optionen wie die zu übertragenden Daten festgelegt werden. Durch die seit .NET 4.5 verfügbare Methode 010203040506
using(Ping ping = new Ping()) { PingReply reply = ping.Send("coders-online.net");
long time = reply.RoundtripTime; // 19 IPStatus status = reply.Status; // Success}
SendPingAsync
besteht außerdem auch die Möglichkeit, nach dem komfortablen und nicht-blockierenden async/await-Muster vorzugehen. Degrees and trigonometric Functions in C#
In einem Gespräch wurde mir kürzlich vom "seltsamen" Verhalten trigonometrischer Methoden wie
), sondern vielmehr an den übergebenen Werten – diese lagen nämlich in Grad vor, wobei C# das Bogenmaß erwartet.
Glücklicherweise lassen sich die Werte jedoch schnell und problemlos jeweils zueinander umrechnen:
Math.Sin
oder Math.Cos
berichtet. Nun lag das Problem jedoch weniger an C# (ohnehin kaum vorstellbar 
Glücklicherweise lassen sich die Werte jedoch schnell und problemlos jeweils zueinander umrechnen:
Umrechung von Grad <-> Bogenmaß
Entsprechende Funktionen habe ich im Rahmen von "PHP-Funktionen in C#" schon einmal zur Verfügung gestellt:
010203040506070809
// Grad zu Bogenmaß umrechnenpublic static double DegToRad(double degrees) { return (degrees * (Math.PI / 180));}
// Bogenmaß zu Grad umrechnenpublic static double RadToDeg(double radians) { return (radians * (180 / Math.PI));}
Arbitrary-precision Arithmetic in C#
Für manche Anwendungen kann es notwendig werden, mit ganzen Zahlen zu arbeiten, die mitunter deutlich größer (bzw. kleiner) sind, als die CLS-Typen
Zwar ist es eine gute Übung, arithmetische Operationen auf ganzen Zahlen, die als Zeichenkette vorliegen, selbst zu implementieren – das .NET-Framework bringt jedoch bereits seit v4.0 die Struktur
Die Verwendung gestaltet sich denkbar einfach, insofern belasse ich es für den Moment bei ein paar Beispielen:
Notwendig sind derartige Vorgehensweisen beispielsweise in der Kryptologie oder bei Simulationen in der numerischen Mathematik. Hauptsächlich kam ich jedoch deswegen auf diesen kurzen Beitrag, da einige Entwickler die Einführung dieser Struktur (
Int16
(short), Int32
(int) und Int64
(long) definieren.Zwar ist es eine gute Übung, arithmetische Operationen auf ganzen Zahlen, die als Zeichenkette vorliegen, selbst zu implementieren – das .NET-Framework bringt jedoch bereits seit v4.0 die Struktur
BigInteger
aus System.Numerics
mit. Sofern du dir also nicht sehr sicher bist, eine für deinen spezifischen Anwendungsfall bessere Implementierung vorliegen zu haben, solltest du eher auf das Framework setzen.Die Verwendung gestaltet sich denkbar einfach, insofern belasse ich es für den Moment bei ein paar Beispielen:
BigInteger verwenden
Selbstverständlich stehen noch einige andere nützliche Operationen und Indikatoren zur Verfügung.0102030405060708091011
BigInteger a = BigInteger.Parse("34872923458349238592320478");BigInteger b = BigInteger.Parse("14782398471853465710237672");
// Operatorüberladung für BigInteger.Add(a, b)BigInteger sum = (a + b); // 49655321930202704302558150
// Operatorüberladung für BigInteger.Subtract(a, b)BigInteger difference = (a – b); // 20090524986495772882082806
// Operatorüberladung für BigInteger.Multiply(a, b)BigInteger product = (a * b); // 515505450439764661138576432136536115538523372647216
Notwendig sind derartige Vorgehensweisen beispielsweise in der Kryptologie oder bei Simulationen in der numerischen Mathematik. Hauptsächlich kam ich jedoch deswegen auf diesen kurzen Beitrag, da einige Entwickler die Einführung dieser Struktur (
BigInteger
ist nicht als Klasse implementiert) verpasst zu haben scheinen. 
Project links
-
BitStadt – Stadtportal
Berlin · Hamburg · Amsterdam -
CCC – Fahrplan
Schedules for the CCCongress
Categories / Archive | Übersicht
- PHP functions in C# (136)
- Dictionary (257)
Tags
.NET · ADO.NET · Work · ASP.NET MVC · Blog · C# · Generics · Society · Computer Science · Java · LINQ · Logic · Mathematics · Network · PHP · Project · Security · Software development · Studies · Technics · Theory · Web design · WPF