dasBlog mit neuer Version auf neuer Open Source Hosting Plattform

Mit dem erscheinen der neuen Version 2.1.8102.813 von dasBlog wurde auch die Open Source Hosting Plattform gewechselt.

Bisher wurde dasBlog auf www.sourceforge.net gehostet.

Nun mit der erscheinen der neuen Version ist der Umzug auf www.codeplex.com ebenfalls perfekt.

Also hier der neue Link zur Projektseite auf Codeplex.

dasBlog auf Codeplex

W2K3 – Suche nach Inhalt in Dateien ohne Ergebnis

Und wieder einmal bin ich darauf reingefallen!

Vor fast einem Jahr habe ich diesen Beitrag “Windows XP – Suche in Dateien – Ohne Ergebnis” verfasst und, dachte; so nun vergesse ich das nicht wieder.

Hab ich eigentlich auch nicht.

Nur wusste ich nicht, dass auf einem Windows 2003 Server das gleiche Problem existiert; tut es aber.

Heute Morgen wollte ich in einem Verzeichnis auf einem W2K3 Server Dateien nach einem darin enthaltenen String durchsuchen.

image

Also F3 gedrückt, den String, in diesem Fall eine Zahlenfolge, eingegeben, Suchen angeklickt.

Nach einigen Sekunden. immerhin waren ein paar Tausend Textdateien in diesem Verzeichnis, erhalte ich als Rückmeldung, dass keine Dateien gefunden wurden, die meinen zu suchende Zeichenfolge enthalten hat.

Da ich mir aber ganz sicher war das es mindestens eine Datei geben musste, habe ich mich mit dieser Information nicht zufrieden gegeben. Und da ich Remote auf der Maschine war, habe ich mir das Verzeichnis kurzerhand gezippt und über einen FTP Server schlussendlich auf meine lokale Workstation heruntergeladen, um dem Problem lokal weiter auf den Grund zu gehen.

ZIP File in ein Unterverzeichnis entpackt um die Detailsuche zu beginnen, vorher aber noch einmal (quasi zur Kontrolle):

F3, Suchstring eingegeben, Suchen angeklickt …..smile_embaressed

Was ist denn nun los, da bekomme ich doch glatt 3 Dateien angezeigt.

Und genau, indem Moment, wo ich sehe welche Dateierweiterungen diese Dateien haben, fällt mir mein Beitrag von vor einem Jahr wieder ein.

Genau: Windows XP, und wie ich nun feststellen muss, auch Windows 2003 Server ignorieren bei der Suche alle Dateien, welche Sie nicht kennen. Dass sind Dateien mit unbekannten Dateierweiterungen (Extension). In diesem Fall handelt es sich eigentlich um Dateien mit der Endung txt. Allerdings werden in dem Verzeichnis Dateien archiviert und wenn eine Datei bereits vorhanden ist, dann wird diese nicht überschrieben (es sollten alle Versionen einer Datei erhalten bleiben), sondern es wird die Dateierweiterung als Zähler verwendet so wird zum Beispiel aus test.txt text.tx0 und dann test.tx1 usw.

Dabei werden Dateierweiterungen erzeugt die Windows in dem Fall Windoofs nicht kennt.

Doch es gibt Abhilfe (genau wie unter Windows XP). Man kann in der Registry einen Eintrag abändern (oder falls er nicht existiert, in einfach neu anlegen).

Der Eintrag lautet:

FilterFilesWithUnknownExtensions

und befindet sich im Registry Schlüssel:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ContentIndex]

Der dword Wert muss von 0 auf 1 umgestellt werden, und ab sofort durchsucht Windows auch Dateien, deren Dateierweiterung es nicht kennt. OK, das ganze hat auch einen Hasenfuß, es werden nun auch Binäre Dateien durchsucht und wenn man ganze Festplatten durchsuchen will, dann dauert nactürlich die Suche viel Länger, da alle Dateien und nicht nur die Dateien durchsucht werden, welche Windows bekannt sind.

Aber was nutzt eine schnelle Suche wenn man nicht sicher sein kann, dass das Ergebnis auch richtig ist.

So und nun mal gespannt. wann ich das nächste mal auf diese Falle hereinfalle.

Windows Communication Foundation (WCF) – Welche Bindungen gibt es denn

Beim stöbern in den Tiefen der MSDN Dokumentationen bin ich mehr durch Zufall, als durch das Ergebnis einer Suchmaschine auf den Beitrag “Konfigurieren der vom System bereitgestellten Bindungen” gestoßen.

Da ich bisher nichts (auf jeden Fall nichts auf Deutsch) finden konnte, wo die verschiedenen Bindungen die vom Framework zur Verfügung gestellt werden, kurz und prägnant aufgeführt und erläutert wurden, war ich gerade dabei und wollte das in einem eigenen Beitrag machen und da…

Ja da habe ich diesen Beitrag gefunden.

Hier nun kurz (sozusagen) als Suchmaschinen Hilfe für die MSDN Seite die verfügbaren Bindings kurz aufgelistet und dann der Link zu der Erläuterung auf MSDN.

Vom .NET Framework zur Verfügung gestellte Bindings für die Windows Communication Foundation

  • BasicHttpBinding
  • WSHttpBinding
  • WS2007HttpBinding
  • WSDualHttpBinding
  • WSFederationHttpBinding
  • WS2007FederationHttpBinding
  • NetTcpBinding
  • NetNamedPipeBinding
  • NetMsmqBinding
  • NetPeerTcpBinding
  • MsmqIntegrationBinding

Die MSDN Beschreibung lautet : Konfigurieren der vom System bereitgestellten Bindungen

DataGridView – Beim Drag and Drop Zeilen oder Spaltenkopf erkennen – C#

Wer sich mit Drag und Drop innerhalb des DataGridView beschäftigt wird unter Umständen ermitteln wollen, ob die Maus auf einem Spalten oder Zeilenkopf gedrückt und festgehalten wurde. Zu diesem Zweck verwende ich die nachfolgende Methode “IsCellOrRowHeader”.

Hier die C# Methode IsCellOrRowHeader:

private bool IsCellOrRowHeader(int x, int y)
{
    DataGridViewHitTestType dgt = dgTodo.HitTest(x, y).Type;
    return (dgt == DataGridViewHitTestType.Cell ||
                    dgt == DataGridViewHitTestType.RowHeader);
}

Ich glaube ich hatte die Methode als Grundgerüst mal in Internet gefunden, heute wo ich diesen Beitrag verfasse, habe ich die Suchmaschine angeworfen um einen Link auf den ursprünglichen Autor bzw, den Beitrag zu finden. Ich konnte aber die Seite nicht mehr finden, wenn also jemand dieses Beitrag liest und weiß wo der Ursprung dieser Methode herkommt, dann hinterlasst doch bitte einen Kommentar.

Eine VB Variante dieser Funktion habe ich gerade doch noch gefunden.

Hier der Link: IsCellOrRowHeader in VB

Erweiterungsmethoden für Basis aller Objekte implementieren – C#

Auf meinem Beitrag “Erweiterungsmethoden am Beispiel einer isNumeric Methode für die String Klasse – C#” habe ich einige Interessante Reaktionen gehabt. Auch wenn die Reaktionen mal wieder über E-Mail und im Gespräch gemacht wurden und nicht über Kommentare direkt am Beitrag gemacht wurden. Ich glaube, soweit sind wir im Deutschsprachigen Raum noch immer nicht. Es gibt immer noch ganz viele die sich einfach nicht trauen einen öffentlichen Kommentar zu hinterlassen. In USA und England ist das ganz anders. Aber gut das ist ein anderes Thema.

Unter anderem wurde darauf hingewiesen, dass die Erweiterung der String Klasse um die Methode isNumeric ganz nett sei, aber nicht das gleiche wie eine Statische Methode wie ich sie im Beitrag “isNumeric – c# oder csharp” beschrieben habe. Die isNumeric Methode aus dem letztgenannten Beitrag lässt sich auf jedes Objekt und nicht nur auf Strings anwenden.

Und natürlich habe diese Kollegen recht, mit dieser Aussage.

Dann wollen wir doch einfach unsere Implementierung aus dem erst genannten Beitrag so ändern, dass Sie auch auf jedes Objekt angewendet werden kann.

Schauen wir uns dazu doch einmal die Herkunft der Datentypen an. Alle Objekt die wir erzeugen wurde irgendwann man vom Typ object abgeleitet, also warum erweitern wir nicht einfach die Basis aller Klassen und Strukturen.

Hier nun die Erweiterungsmethode isNumeric für den Basis Objekt Type object:

public static class ObjectExtensions
    {
        public static bool isNumeric(this object o)
        {
            double retNum;
            bool isNum = Double.TryParse(Convert.ToString(o), System.Globalization.NumberStyles.Any,
                                         System.Globalization.NumberFormatInfo.InvariantInfo, out retNum);
            return isNum;
        }
    }

Und wie man nachfolgend sehen kann, ist es nun möglich die Methode isNumeric auf nahezu jedes Objekt anzuwenden:

static void Main()
        {
            int i = 10;
            long l = 313131311;
            double d = 12.12;
            string s = "100";

            test(i);
            test(l);
            test(d);
            test(s);

        }

        private static void test(object o)
        {
            if (o.isNumeric())
            {
                Console.WriteLine("Ja das geht auch");
            }
        }

Erweiterungsmethoden am Beispiel einer isNumeric Methode für die String Klasse – C#

Erweiterungsmethoden sind statische Methoden die in statischen Klassen definiert werden und als ersten Parameter das Schlüsselwort this mit nachfolgendem Type der zu erweiternden Klasse an die Methode übergibt. Diese Erweiterungsmethoden werden dann als Instanz Methode (wie z.B. die ToString() Methode) des jeweiligen Objekts verwendet.

Vor einiger Zeit hatte ich einen Beitrag geschrieben der sich mit der C# Implementierung der unter VB verfügbaren Funktion isNumeric beschäftigte.

In diesem Beitrag hatte ich eine public static Methode in einer Helper Klasse geschrieben, ich dachte es wäre anschaulich wenn wir nun diese Implementierung als Erweiterungsmethode der String Klasse vornehmen.

Hier zuerst noch einmal die Klassische Implementierung vor C# 3.0

public static class MathHelper
{
    public static bool IsNumeric(object Expression)
    {
        bool isNum;
        double retNum;
        isNum = Double.TryParse(Convert.ToString(Expression), System.Globalization.NumberStyles.Any,
                                System.Globalization.NumberFormatInfo.InvariantInfo, out retNum);
        return isNum;
    }

}

Diese konnte man wie folgt verwenden:

string o = "100";
if (MathHelper.IsNumeric(o))
    Console.WriteLine("Ja die Eingabe ist Numerisch");
else
    Console.WriteLine("Keine numerischen Eingabe");

So und nun zur Implementierung der isNumeric Funktionalität als Erweiterungsmethode der String Klasse:

Nun kann man mit dem C# 3.0 Feature der Erweiterungsmethoden (Extension Methods) diese aber auf viel elegantere weise lösen. Ich möchte dies hier an einem Beispiel der String Klasse demonstrieren. Wir erweitern also unsere String Klasse durch eine Erweiterungsmethode isNumeric.

Hierzu müssen wir zuerst eine Statische Klasse erstellen, in welcher wir dann die Erweiterungsmethode(n) deklarieren können.

public static class StringExtensions
{
    public static bool isNumeric(this string s)
    {
        double retNum;
        bool isNum = Double.TryParse(s, System.Globalization.NumberStyles.Any,
                                     System.Globalization.NumberFormatInfo.InvariantInfo, out retNum);
        return isNum;

    }
}

Verwendet wird das dann so:

string o = "100";
if (o.isNumeric())
    Console.WriteLine("Ja die Eingabe ist Numerisch");
else
    Console.WriteLine("Keine numerischen Eingabe");