Open and close Disk Tray with C#
In ein paar vorherigen Artikeln haben wir bereits externe Funktionalität per
Wir implementieren dazu folgende (sehr einfache) Klasse:
DllImport
verwendet, was wir nun nochmals benötigen werden. Diesmal soll es darum gehen, den Laufwerksschacht zu öffnen und zu schließen.Wir implementieren dazu folgende (sehr einfache) Klasse:
DiskTray.cs
Die Verwendung – beispielsweise im Rahmen einer Fernwartung – gestaltet sich nun äußerst einfach:
010203040506070809101112131415161718
public static class DiskTray { public static void Close() { mciSendString("set CDAudio door closed", null, 0, IntPtr.Zero); }
public static void Open() { mciSendString("set CDAudio door open", null, 0, IntPtr.Zero); }
[DllImport("winmm")] private static extern int mciSendString( string lpstrCommand, string lpstrReturnString, int uReturnLength, IntPtr hwndCallback );}
Erweiterungsmethoden verwenden
Für interessierte Leser finden sich im MSDN weiterführende Informationen zu 0102
DiskTray.Open(); // öffnenDiskTray.Close(); // schließen
mciSendString
. Wake-on-LAN via C#
Wake on LAN ist ein Standard zum Starten eines deaktivierten Rechners über eine kompatible Netzwerkkarte. Dazu wird lediglich ein bestimmtes Paket im Netzwerk gesendet; mit C# lässt sich das beispielsweise so lösen:
Klasse implementieren
Das Paket enthält sechs mal den Wert FF16, gefolgt von der 16-maligen Wiederholung der MAC-Adresse und wird per Broadcast im Netzwerk versendet. Durch die Methodenüberladung wird die Übergabe der MAC-Adresse sowohl per Zeichenkette als auch per Byte-Feld ermöglicht:
0102030405060708091011121314151617181920212223242526272829
public static class WakeOnLAN { public static void SendMagicPacket(byte[] macAddress) { using(UdpClient udpClient = new UdpClient()) { udpClient.Connect(IPAddress.Broadcast, 9);
byte[] magicPacket = new byte[(6 + (16 * 6))];
for(int i = 0; i < 6; i++) { magicPacket[i] = 0xFF; }
for(int i = 1; i <= 16; i++) { for(int j = 0; j < 6; j++) { magicPacket[((i * 6) + j)] = macAddress[j]; } }
udpClient.Send(magicPacket, magicPacket.Length); } }
public static void SendMagicPacket(string macAddress) { SendMagicPacket(macAddress .Split(':', '-') .Select(m => Byte.Parse(m, NumberStyles.AllowHexSpecifier)) .ToArray() ); }}
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. 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