| |
Immer wenn ich von Zeit zu Zeit Visual C# Express bemühe, um kleine
Tools zu basteln, die mir den einen oder anderen Vorgang auf meinem
PC erleichtern sollen, habe ich hin und wieder das Problem, an bestimmten
Stellen bei der Programmierung an banalen Kleinigkeiten hängen zu bleiben.
Soll heißen, ich durchforste dann wieder einmal sämtliche Internetforen,
Google bis zum umfallen und am Ende habe ich dann das Problem global
gelöst aber für die Lösung meines Problems war dann doch nicht das Richtige
dabei. Also selber ran, austesten und probieren bis die ganze Sache
passt. Warum also diese Seite ? Zum einen habe ich hier für mich einen
schnellen Überblick über Probleme aus der Vergangenheit und was ich
mir einmal notiert habe bleibt besser im Gedächtnis. Andererseits, sollte
sich irgend jemand auf diese Seite verirren auf der Suche nach einer
Lösung und diese hier finden, hat sich der ganze Aufwand für mich schon
mehr als gelohnt.
|
|
| |
|
|
| |
Ping abgeben und Ergebnis
auswerten |
|
| |
| |
|
| |
Dieses Beispiel veranschaulicht eine einfache Vorgehensweise
um zu Prüfen, ob ein Remotehost existiert. |
| |
|
| |
Zuerst einmal, in welchem Namespace versteckt sich die Ping
Methode |
| |
|
| |
using System.Net.NetworkInformation; |
| |
|
| |
Dann der Zugriff auf selbige |
| |
|
| |
Ping testPing = new
Ping(); |
| |
|
| |
Jetzt kann man einen Ping absetzen, muss diesen jedoch noch
auswerten |
| |
|
| |
try |
| |
{ |
| |
PingReply testReply
= testPing.Send([string hostname / ip],[int timeout]); // hat mehrere
Überladungen, steht alles in der Hilfe |
| |
if (testReply.Status
== IPStatus.Success) [ alles bestens ]; |
| |
} |
| |
catch { [remotehost konnte nicht erreicht
werden ] } |
| |
|
| |
Das ganze in einen try-catch Block setzen, da bei nichterreichen
des Remotehosts ein Fehler generiert wird. |
| |
Ein simples Beispiel, bei dem nur die Verfügbarkeit eines Remotehosts
geprüft wird. |
| |
Das ganze lässt sich natürlich noch beliebig verfeinern. |
| |
|
|
|
| |
Netzlaufwerk verbinden |
|
| |
| |
|
| |
Zum Verbinden mit einem Netzlaufwerk gibt es zwei Lösungsansätze. |
| |
Einfach ein System.Diagnostics.Process.Start ausführen und über
die Shell in gewohnter Weise |
| |
ein net use ... aufrufen. |
| |
In meinen Augen ist dies jedoch die unelegantere Methode. |
| |
Ich verwende für dieses Problem nachfolgendes Beispiel : |
| |
|
| |
zuerst einen Verweis einfügen -> COM -> Windows Script Host
Object Model |
| |
Im Projektexplorer unter Verweise sollte dann der Eintrag IWshRuntimeLibrary
erscheinen. |
| |
|
| |
using IWshRuntimeLibrary; |
| |
|
| |
Jetzt erfolgen diverse Variablendeklarationen |
| |
|
| |
object updateProfile = true; |
| |
object username = null; |
| |
object password = null; |
| |
|
| |
string localName = [der Laufwerksbuchstabe
in der Form Z: ] |
| |
string remoteName = [der Netzwerkpfad wie
etwa \\test\testshare] |
| |
|
| |
Nun geht es zum eigentlichen Zugriff auf die IWshRuntimeLibrary |
| |
|
| |
WshNetwork myNet = new WshNetwork(); |
| |
|
| |
try |
| |
{ |
| |
myNet.MapNetworkDrive(localName,
remoteName, ref updateProfile, ref username, ref password); |
| |
} |
| |
catch (Exception ex) |
| |
{ |
| |
MessageBox.Show(ex.Message); |
| |
} |
| |
|
| |
Wenn alles geklappt hat sollte im Windows Dateiexplorer die
Verbindung sichtbar sein ( als kleine Kontrolle ) |
| |
Bei Verbindungsproblemen erscheint eine Messagebox mit der jeweiligen
Fehlerbeschreibung. |
| |
|
|
|
| |
Netzlaufwerk trennen
|
|
| |
| |
|
| |
Die gleichen Vorraussetzungen wie bei Netzlaufwerk verbinden. |
| |
Zugriff über IWshRuntimeLibrary |
| |
|
| |
WshNetwork myNet = new WshNetwork(); |
| |
string driveLetter = "[den Laufwerksbuchstaben]"; |
| |
object force = true; |
| |
object updateProfile = true; |
| |
|
| |
try |
| |
{ |
| |
myNet.RemoveNetworkDrive(driveLetter,
ref force, ref updateProfile); |
| |
} |
| |
catch (Exception ex) |
| |
{ |
| |
MessageBox.Show(ex.Message); |
| |
} |
| |
|
| |
Ist alles selbsterklärend, bei Fehler wieder Messagebox mit
Fehlerbeschreibung. |
| |
|
|
|
| |
Combobox mit grafischer Auswahlliste
|
|
| |
| |
|
| |
Warum eine grafische Auswahlliste ? Nun, ich hatte eine Liste
von IP-Adressen auf die ich |
| |
mittels Combobox zugreifen wollte. Da diese Adressen aus verschiedenen
Ländern waren, |
| |
suchte ich nach einer Möglichkeit, dies farblich oder grafisch
hervorzuheben. Also vor jede |
| |
Adresse die Landesfahne und so gehts : |
| |
|
| |
 |
| |
Um die Auswahlliste im ComboBox Steuerelement so zu formatieren
benutzt man den DrawItem Handler |
| |
Es wird davon ausgegangen, das die ComboBox bereits existiert. |
| |
|
| |
Zuerst einmal teilt man der ComboBox mit, das man in sie zeichnen
möchte |
| |
|
| |
ComboBox.DrawMode = DrawMode.OwnerDrawFixed; |
| |
|
| |
Dann ein DrawItem Event Handler initialisieren |
| |
|
| |
ComboBox.DrawItem += new DrawItemEventHandler(ComboBox_DrawItem); |
| |
|
| |
Dass ganze muss natürlich geschehen, bevor das Formular gezeichnet
wird also im Initialisierungsteil der |
| |
Anwendung. Jetzt kann die ComboBox mit Einträgen gefüllt werden
entweder über den Designer |
| |
oder .items.add(). |
| |
Wenn keine Einträge vorhanden sind, ist auch später keine Grafik
zu sehen. Im Grunde liegen die Grafiken |
| |
nur über der jeweiligen Auswahl. |
| |
|
| |
jetzt die dazu gehörige Methode |
| |
|
| |
private void ComboBox_DrawItem(object sender,
System.Windows.Forms.DrawItemEventArgs e) |
| |
{ |
| |
Image[] myImage =
new Image[30]; |
| |
|
| |
myImage[0] = Image.FromFile("flag_germany.gif"); |
| |
... |
| |
myImage[29] = Image.FromFile("flag_usa.gif"); |
| |
|
| |
Um die Grafiken zu initialisieren gibt es sicherlich elegantere
Methoden, hier dient es jedoch nur zur |
| |
Veranschaulichung. |
| |
|
| |
Als nächstes zeichnen wir die Flaggen |
| |
|
| |
e.Graphics.DrawImage(myImage[0],
new Point(2, 2)); |
| |
... |
| |
e.Graphics.DrawImage(myImage[29],
new Point(2, 452)); |
| |
|
| |
Warum an erster Position 2,2 ? Meine Grafiken haben eine Höhe
von 11 Punkten. |
| |
Die ItemsHeight Eigenschaft der ComboBox ist 15. Um die Grafik
nun schön vertikal zentriert zu |
| |
zeichnen, einfach zwei Punkte ober und unterhalb freilassen.
Jede weitere Grafik verschiebt sich |
| |
dann um 15 Punkte nach unten also 2, 17, 32 usw. |
| |
Die 2 für den X-Wert, damit die Grafik nicht ganz vorn am Menü
klebt. |
| |
|
| |
Jetzt den dazugehörigen Eintrag |
| |
|
| |
e.Graphics.DrawString("192.168.0.1",
this.Font, Brushes.Black, new Point(20, 2)); |
| |
... |
| |
e.Graphics.DrawString("192.168.0.30",
this.Font, Brushes.Black, new Point(20, 452)); |
| |
} |
| |
|
| |
gleiche Vorgehensweise wie bei DrawImage, nur die X-Position
jetzt ein wenig versetzt. |
| |
Wie weit, sollte man ausprobieren. |
| |
|
| |
Das war es auch schon, beim ersten Zugriff auf die ComboBox
werden die Grafiken gezeichnet. |
| |
Das ganze funktioniert jedoch nicht für zur Laufzeit hinzugefügte
Einträge. |
| |
|
| |
Das diese Vorgehensweise nicht die optimale Lösung sein kann,
ist mir bewußt. |
| |
Ich habe jedoch erreicht, was ich wollte. |
| |
|
|
|
| |
UnauthorizedAccessException
bei Aufruf von Directory.GetDirectories mit Option SearchOption.AllDirectories
|
|
| |
| |
|
| |
Ein kleines Problem mit großer Wirkung. Es sollten alle Verzeichnisse
nebst Unterverzeichnissen eines beliebigen Pfades ausgelesen werden.
|
| |
|
| |
Directory.GetDirectories(@"c:\","*.*",SearchOption.AllDirectories); |
| |
|
| |
Das war der Plan, doch wie sich herausstellen sollte bricht
die ganze Sache in dem Moment ab, wo der Zugriff auf ein geschütztes
Verzeichniss erfolgt mit dem Ergebnis, das ein Fehler erzeugt wird
und keine Daten übermittelt werden. |
| |
In meinen Augen ist die SearchOption.AllDirectories Option völlig
sinnlos wenn sie dieses Problem so behandelt. |
| |
Also selber programmieren |
| |
|
| |
public void rootDirectory(string
directory) |
| |
{ |
| |
rootDirectory(new DirectoryInfo(directory)); |
| |
} |
| |
|
| |
private void rootDirectory(DirectoryInfo
directory) |
| |
{ |
| |
DirectoryInfo[] subDirectories = directory.GetDirectories(); |
| |
|
| |
foreach (DirectoryInfo subDirectory in subDirectories) |
| |
{ |
| |
try |
| |
{ |
| |
rootDirectory(subDirectory); |
| |
|
| |
// hier können beispielsweise die Verzeichnissnamen ausgelesen werden |
| |
// mit subDirectory.FullName ( incl. Pfad ) |
| |
|
| |
} |
| |
catch (UnauthorizedAccessException ex) |
| |
{ |
| |
continue; |
| |
} |
| |
} |
| |
} |
| |
|
| |
Bei dieser Methode werden die geschützten Verzeichnisse mit
erfasst jedoch nicht deren Inhalt. |
| |
Aufgerufen wird das ganze dann über rootDirectory(@"c:\"); oder
wie auch immer. |
| |
Das Ganze ist natürlich erst der Grobschliff, Verfeinerungen
wie Rückgabewerte etc. müssen natürlich noch eingefügt werden. |
| |
Im Grunde eine simple Lösung, darauf zu kommen war nicht so
einfach wegen diesem verflixten SearchOption.AllDirectories. |
| |
|
|
|
| |
Rechner herunterfahren
|
|
| |
|
|
| |
|
|
| |
Bei Fragen oder Kritik oder was weiss ich bitte eine Mail an
csharp@lumack.de |
|