.NET-Klasse um Funktion bzw. Property erweitern

  • VB.NET
  • .NET (FX) 4.0

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von tragl.

    .NET-Klasse um Funktion bzw. Property erweitern

    Hallo zusammen.

    Hab sowas noch nie gemacht, deshalb hier mal die Frage nach dem sinnvollsten weg.
    Ich würde gerne beim Abspeichern von externen Dateien vorher prüfen, ob die in Benutzung sind (ggf. von einem anderen User geöffnet)

    Jetzt hab ich sowas hier im WWW gefunden:
    Spoiler anzeigen

    Quellcode

    1. Public Function func_check_file_use(sub_filename) As Boolean
    2. Dim fs As Integer = FreeFile()
    3. If file.Exists(sub_filename) Then
    4. Try
    5. FileOpen(fs, sub_filename, OpenMode.Binary , _
    6. OpenAccess.ReadWrite, OpenShare.LockReadWrite)
    7. Catch
    8. func_check_file_use = true
    9. Finally
    10. FileClose(fs)
    11. End Try
    12. End If
    13. End Function


    Allerdings fänd ich das hübscher eine weitere Property an FileInfo anzubinden, dann könne man in etwa so damit arbeiten:

    VB.NET-Quellcode

    1. Dim fi As New FileInfo(DateiString)
    2. If Not fi.IsInUse Then
    3. speichern
    4. Else
    5. msgbox ("wird bereits benutzt")
    6. End If


    Also ich würde gerne die IsInUse-Property hinzufügen.
    Geht das über den weg á la
    Public MustInherit Class FileInfo... oder was meint ihr?
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Mach es per Extension:

    VB.NET-Quellcode

    1. Public Class FrmMain
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Dim TestInfo As New IO.FileInfo("C:\Test.txt")
    4. If TestInfo.IsInUse Then MessageBox.Show("Test.txt ist in Benutzung.")
    5. End Sub
    6. End Class
    7. Public Module Extensions
    8. <Runtime.CompilerServices.Extension> Public Function IsInUse(FileInfo As IO.FileInfo) As Boolean
    9. 'Dein Prüfcode
    10. End Function
    11. End Module

    Dadurch gibst Du der FileInfo-Klasse eine neue Funktionalität, ohne sie anfassen zu müssen. Ich habe inzwischen extrem viele Extensions.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Nä. Bevor ich auf den Trichter komme, ne .NET-Klasse anzufassen, bau ich mir ne Extension. Ich glaub in meinen Programmen hab ich überhaupt keine eigene Vererbung von Frameworkklassen. Wenn, dann nutze ich welche in eigenen Klassen. Also Black-Box-Use statt White-Box-Use. Aber ich bin da auch kein Standard.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    bau ich mir ne Extension.

    ja, ok. Da ich ja immer mehr in ordentlicher Manier programmieren will wollt ich mich vorher einfach "absichern" ;) nicht, dass irgendwann einer über den Code guckt und sag "alter was haste denn da für'n Bullshit zusammengetippt"
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Na Moment, warte noch den Abend ab. Gibt bestimmt den ein oder anderen, der ne andere Meinung hat. Dass Du ordentlich programmieren willst, ist löblich. Ob in diesem Fall mein Weg der beste ist? Ich sag nur:

    VaporiZed schrieb:

    ich bin da auch kein Standard.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Jo, mal abwarten. Kein Standard zu sein ist nicht immer schlecht :thumbsup:
    Hab's nu wie folgt doch anders gelöst:

    VB.NET-Quellcode

    1. ''' <summary> Überprüft, ob eine Datei bereits geöffnet ist.</summary>
    2. <Extension>
    3. Public Function IsInUse(fileName As String) As Boolean
    4. Try
    5. Dim fs = File.OpenWrite(fileName)
    6. fs.Close()
    7. Return False
    8. Catch
    9. Return True
    10. End Try
    11. End Function

    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    @tragl Um sicher zu sein, dass Du nicht zufällig eine geöffnete Datei übrig lässt, solltest Du Using verwenden (das .Close() wäre dann nicht erforderlich):

    VB.NET-Quellcode

    1. ''' <summary> Überprüft, ob eine Datei bereits geöffnet ist.</summary>
    2. <Extension>
    3. Public Function IsInUse(fileName As String) As Boolean
    4. Try
    5. Using fs = File.OpenWrite(fileName)
    6. fs.Close()
    7. End Using
    8. Return False
    9. Catch
    10. Return True
    11. End Try
    12. End Function
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    solltest Du Using verwenden

    Danke dir - Hab ich nu wie folgt umgesetzt:

    VB.NET-Quellcode

    1. ''' <summary> Überprüft, ob eine Datei bereits geöffnet ist.</summary>
    2. <Extension>
    3. Public Function IsInUse(fileName As String) As Boolean
    4. Try
    5. Using fs = File.OpenWrite(fileName)
    6. End Using
    7. Return False
    8. Catch
    9. Return True
    10. End Try
    11. End Function


    macht auch Sinn mit dem Using, mach ich normalerweise auch :rolleyes:
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup: