VB .NET Programm zum Autostart in der Registrierung hinzufügen

Wer hätte das gedacht... unter .NET ist auch das mittlerweile ein Klacks...

Die folgende Prozedur fügt die aktuelle Application im Bereich CurrentUser in die Registrierung als Autostart Eintrag hinzu.

Der erste Wert "My.Application.Info.Productname" ist dabei der Name des Eintrags und dessen Wert ist der komplette Dateiname des Programms, den man via "System.Reflection.Assembly.GetEntryAssembly.Location" ermitteln kann.

Die Anführungszeichen vorne und hinten sind notwendig, wenn der Pfad zum Programm Leerzeichen enthält. Ansonsten würde Windows nur das Verzeichnis statt das Programm an sich öffnen.

Public Shared Sub AddToAutorun()
    Dim key As Microsoft.Win32.RegistryKey = My.Computer.Registry.CurrentUser.CreateSubKey("Software\Microsoft\Windows\CurrentVersion\Run")
    key.SetValue(My.Application.Info.ProductName, """" & System.Reflection.Assembly.GetEntryAssembly.Location & """")
End Sub

Dupe Files Version 1.0.3186 verfügbar

Dupe Files 1.0.3186 ist ab sofort verfügbar.

Änderungen:

  • In der Ergebnis-Liste werden nun die Windows-Dateisymbole angezeigt
  • Gruppieren der Ansicht automatisch nach ausgewählter Spalte
  • Das Ergebnis einer Überprüfung lässt sich nun abspeichern (via Export) und öffnen (via Import)
  • Maximale Datei-Größe festlegbar (Optionen / Sonstiges)
  • Fehler im Objekt-Bearbeiten Fenster korrigiert
  • Export-Dialoge vereinheitlicht und überarbeitet (kein OpenFileDialog mehr sondern SaveFileDialog)
  • Meldung anzeigen wenn Vergleich beendet
  • Fenster automatisch während Vergleich minimieren
  • Markieren von Duplikat-Paaren (via Rechtsklick bei der Ergebnis-Liste)
  • Drag & Drop vom Explorer (fügt Objekte zur Überprüfungs-Liste hinzu)
  • Mehr Informationen

Download:

Weitere Informationen zu Dupe Files gibt es auf der Dupe Files Seite oder im Dupe Files Wiki.

VB .NET Prozess starten und auf sein Ende warten

Public Sub Execute(ByVal aFilename As String)
    Dim p As New Process
    p.StartInfo.FileName = aFilename
    p.StartInfo.UseShellExecute = True
    p.Start()
    p.WaitForExit()
  End Sub

Beispielaufrufe:

Execute("C:\test.doc")
Execute("C:\test.pdf")

Dupe Files Version 1.0.3179 veröffentlicht

Ich habe heute die neue Dupe Files Version fertiggestellt und hier auf diese Seite hochgeladen.

Dupe Files hat in diesem Blog eine eigene Seite bekommen, und zwar hier. Außerdem habe ich ein Dupe Files Wiki eingerichtet, auf dem alles über Dupe Files steht.

Hinweis: Es handelt sich zwar 'schon' um die Version 1.0.3179, das heisst aber nicht, dass Dupe Files komplett fehlerfrei ist. Was ich damit sagen möchte ist, dass ich mich über Kritik und Feedback freue und dies gerne als Anlass nehme, um Dupe Files noch weiter zu verbessern. Sollte also jemand einen Fehler entdecken, so möge er oder sie mir diesen bitte mit einer kurzen Beschreibung mailen.

Viel Spass!

HowTo: VB .NET Enums mit Beschreibungen versehen

Dieses HowTo beschreibt, wie man Enums mit Beschreibungen versehen kann und diese Beschreibungen dann beispielsweise in einer Combobox oder Listbox anzeigt.

Beispiel vorher:

So sehen die Einträge bisher aus. Für den Endanwender ziemlich unpraktisch.

Beispiel nachher:

So sollen die Einträge später angezeigt werden.

Auf gehts!

Unser Beispiel enum:

Public Enum eFileListActionType
  eflatNone = 0
  eflatCompress = 1
  eflatDeleteForever = 2
  eflatRecyclebin = 3
  eflatReplaceWithTextfile = 4
  eflatReplaceWithLink = 5
  eflatReplaceWithZeroByteFile = 6
  eflatMoveToDirectory = 7
End Enum

Um nun alle Namen diesse Enums beispielsweise in einer Combobox anzuzeigen, kann man bekanntermaßen folgendes machen:

Me.cbFileActionType.Items.AddRange([Enum].GetNames(GetType(eFileListActionType)))

Dann hätte man die Combobox mit den Werten eflatNone, eflatCompress usw. usf. gefüllt. Also praktisch so wie im ersten Bild oben. Dass das für den Endanwender nicht unbedingt ideal ist, sollte klar sein. Was wir also benötigen ist eine Möglichkeit den enums eine Beschreibung zu verpassen und diese Beschreibung stattdessen in die Combobox zu schreiben.

Zum Glück gibt es Reflection und das Attribut Description, das uns hierbei aus der Patsche hilft.

Also, wie geht das jetzt?

Zuerst müssen wir unseren enum um das Attribut Description ergänzen. Das sieht dann wie folgt aus:

Imports System.ComponentModel ' Wichtig!

Public Enum eFileListActionType
  <Description("Keine")> _
  eflatNone = 0
  <Description("Komprimieren")> _
  eflatCompress = 1
  <Description("Für immer löschen")> _
  eflatDeleteForever = 2
  <Description("In Papierkorb verschieben")> _
  eflatRecyclebin = 3
  <Description("Durch Textdatei mit Link ersetzen")> _
  eflatReplaceWithTextfile = 4
  <Description("Durch Dateilink ersetzen")> _
  eflatReplaceWithLink = 5
  <Description("Durch 0-Byte Datei ersetzen")> _
  eflatReplaceWithZeroByteFile = 6
  <Description("In Verzeichnis verschieben")> _
  eflatMoveToDirectory = 7
End Enum

Wie man sieht wird einfach der Tag vor einen Eintrag gesetzt.

Zum Auslesen dieser Werte müssen wir nun Reflection bemühen:

Die erste Funktion gibt uns dabei eine Beschreibung für einen Enum-Wert zurück.

Public Shared Function GetEnumDescription(ByVal EnumConstant As [Enum]) As String
    Dim fi As Reflection.FieldInfo = EnumConstant.GetType().GetField(EnumConstant.ToString())
    Dim attr() As System.ComponentModel.DescriptionAttribute = DirectCast(fi.GetCustomAttributes(GetType(System.ComponentModel.DescriptionAttribute), False), System.ComponentModel.DescriptionAttribute())
    If attr.Length > 0 Then
      Return attr(0).Description
    Else
      Return EnumConstant.ToString()
    End If
  End Function

Für folgenden Befehl

Dim str as String = GetEnumDescription(eflatReplaceWithTextfile)
Debug.Print(str)

bekämen wir also das als Ausgabe:

Durch Textdatei mit Link ersetzen

Um das ganze noch etwas zu optimieren habe ich noch eine Hilfs-Funktion geschrieben, die alle Werte eines Enums übersetzt (also die Description einliest) und diese in ein String Array schreibt, das man dann einfach an die Combobox übergeben kann.

Public Shared Function GetEnumDescriptions(ByVal EnumConstant As Type) As String()
    Dim res(-1) As String
    For Each ec As [Enum] In [Enum].GetValues(EnumConstant)
      ReDim Preserve res(UBound(res) + 1)
      res(UBound(res)) = GetEnumDescription(ec)
    Next
    Return res
  End Function

Beispielanwendung:

Me.cbFileActionType.Items.AddRange(GetEnumDescriptions(GetType(eFileListActionType)))

Und damit hätten wir alle Beschreibungen eines Enums sauber in einer Combobox oder Listbox untegebracht.

Dupe Files - Preview Screenshots 2

Ich mache weiter gute Vorschritte mit der neuen Dupe Files Version.

Was ich neu integriert habe:

  • Objekt-Katalog Verwaltung (neu, öffnen, speichern, bearbeiten)
  • Duplikate nach Gruppe sortieren (Möglichkeiten: Größe, Hash)
  • Vergleich beschleunigt durch Entrümpeln nicht mehr benötigter Einträge der Dateiliste während dem Vergleich
  • Aktionen: Löschen in Papierkorb, Endgültig löschen, durch Link ersetzen (funktioniert noch nicht), durch Textverweis ersetzen (funktioniert noch nicht), in Verzeichnis verschieben, durch 0-Byte Datei ersetzen, komprimieren (funktioniert noch nicht)
  • Dateinamen / Verzeichnisnamen aus Liste entfernen

Was noch zu tun ist:

  • Assistent für Programmstart
  • Assistent für das Bearbeiten der Duplikate (Aktions-Assistent)

Dupe Files - Preview Screenshots

Ich arbeite gerade wieder an einem meiner Lieblings-Projekte "Dupe Files". Ein Projekt, das ich leider vor langer Zeit unvollständig liegen gelassen habe. Die letzte lauffähige Dupe Files Version stammt von 2005 und wurde von mir noch unter Delphi entwickelt.

Die aktuelle Version entwickle ich stattdessen unter Visual Basic .NET, da ich beruflich nun viel mit dieser Sprache zu tun habe. In der ersten Testversion hatte ich leichte Geschwindigkeitsprobleme bei mehreren 10.000 Dateien. Hinzu kommt, dass das Klassendesign nicht besonders gut gewählt war.

Etwa 3 Jahre und wesentlich mehr Erfahrung später läuft nun auch die neue .NET Version so schnell (wenn nicht schneller) wie die alte Delphi Version (hier kann die letzte alte Version heruntergeladen werden).

Hier einige Screenshots. Bis zur fertigen Version dauert es allerdings noch etwas...

Wie man sieht zeigt Dupe Files nun nur noch Duplikat-Dateien an. Alle anderen werden der Übersicht und der Performance wegen gar nicht erst angezeigt. Ich dachte, was soll der Benutzer mit Dateien anfangen, die gar nicht doppelt sind? Also weg damit...

Außerdem experimentiere ich gerade mit ListViewGroups zur gruppierten Darstellung der Einträge. Über die Bezeichnungen (Small, Medium, Large, Huge) bin ich aber noch nicht ganz glücklich.