"Dateiablage" auf Storage anstatt Datenbank

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 33 Antworten in diesem Thema. Der letzte Beitrag () ist von BlueLagoonX.

    Dann wiederhol ich mich

    VaporiZed schrieb:

    Bau erstmal in ner TestApp das ProcExited mit nem einfachen Prozess nach, ohne Azure.

    VB.NET-Quellcode

    1. Imports System.Diagnostics
    2. Friend Class FrmMain
    3. Private WithEvents _proc As Process
    4. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    5. _proc = Process.Start(IO.Path.Combine(Application.StartupPath, "TestFile.txt"))
    6. _proc.EnableRaisingEvents = True
    7. End Sub
    8. Private Sub ProcessExited(sender As Object, e As EventArgs) Handles _proc.Exited
    9. MessageBox.Show("Prozess wurde beendet.")
    10. End Sub
    11. End Class
    Wenn das klappt, dann stückweise dazubasteln, bis Du herausfindest, woran es liegt.
    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 erstmal in ner TestApp das ProcExited mit nem einfachen Prozess nach, ohne Azure.


    Hab ich gemacht - ich hatte aber auch schon gesagt, dass der Azure-Kram da nix mit zu tun hat.
    Gleiche .png-Datei (liegt lokal beim Projekt) - siehe Screenshot



    Ich vermute, dass hier kein "Prozess" in dem Sinne dahinter erkannt wird - warum auch immer. Vielleicht gibt's noch eine Lösung - andernfalls
    käme mir jetzt nur in den Sinn, dass ich alle Dateien die zur Laufzeit geöffnet werden in eine Liste gespeichert werden und beim Schließen des Programms dann alle löschen.
    Finde ich aber nicht so elegant ehrlich gesagt.
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Naja, da startet ja auch kein vollwertiger Prozess, sondern erstmal nur die AppAuswahl. Solltest zum Testen schon was verwenden, wo sich dann auch ein Programm öffnet.
    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:

    Solltest zum Testen schon was verwenden, wo sich dann auch ein Programm öffnet.

    jo mit nem leeren Textdokument funzt das. Ich hab jetzt mal die "Windows-Foto-Anzeige" auf immer verwenden gesetzt. Es wird auch dann kein Prozess erkannt.
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Klingt verdächtig danach, als ob moderne/modernisierte Apps (ggf. UWP-Apps?) nicht als Process geführt oder gefunden werden.
    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.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Das hier geht - man muss aber den Prozessnamen kennen. Also erst manuell starten, dann mittels Process.GetProcesses schauen, wie das Ding heißt und dann später:

    VB.NET-Quellcode

    1. Imports System.Diagnostics
    2. Friend Class FrmMain
    3. Private WithEvents _proc As Process
    4. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    5. Process.Start(New ProcessStartInfo("D:\Testbild1.png")) 'ruft die UWP-App (?) Windows Photos auf.
    6. _proc = Process.GetProcessesByName("Microsoft.Photos")(0)
    7. _proc.EnableRaisingEvents = True
    8. End Sub
    9. Private Sub ProcessExited(sender As Object, e As EventArgs) Handles _proc.Exited
    10. MessageBox.Show("Prozess wurde beendet.")
    11. End Sub
    12. End Class


    Vielleicht klappt das ja auch so in Deinem Projekt.
    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.
    Danke, werd' ich mal testen. Allerdings muss ich da wieder Extrawürste coden, denn mal sind's Foto-Dateien, mal PDF-Dateien und dann gibt's ja noch Excel- und Word-Dateien
    die in meinem Programm hinterlegt sind. Manchmal sogar E-Mails...(.msg)
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Hi, ich nochmal.

    Gibt's keine Möglichkeit, die "Datei" aus dem Stream direkt zu öffnen, ohne lokal zu speichern?
    In Zeile 10 geht's ja los...

    VB.NET-Quellcode

    1. Public Sub OpenFileFromAzureStorage(Filename As String, ShareDirectory As String)
    2. 'TODO: temporäre Datei nach Schließen wieder löschen
    3. Dim shareClient = New Files.Shares.ShareClient(App.AzureConnectionString, App.AzureShareName)
    4. Dim shareDirClient = shareClient.GetDirectoryClient(ShareDirectory)
    5. Dim shareFileClient = shareDirClient.GetFileClient(Filename)
    6. If shareFileClient.Exists Then
    7. Dim shareFileDownloadInfo As Files.Shares.Models.ShareFileDownloadInfo = shareFileClient.Download
    8. _fi = New FileInfo($"{App.AzureLocalTempFolder}\{Filename}")
    9. If File.Exists(_fi.FullName) Then File.Delete(_fi.FullName)
    10. Using stream = File.OpenWrite(_fi.FullName)
    11. shareFileDownloadInfo.Content.CopyTo(stream)
    12. End Using
    13. Using _proc = New Process
    14. Try
    15. Dim procStartInfo As New ProcessStartInfo
    16. With procStartInfo
    17. .ErrorDialog = True
    18. .UseShellExecute = True
    19. .FileName = _fi.FullName
    20. End With
    21. _proc.StartInfo = procStartInfo
    22. _proc.EnableRaisingEvents = True
    23. AddHandler _proc.Exited, AddressOf ProcessExited
    24. _proc.Start()
    25. Catch ex As Exception
    26. msgError(ex.Message)
    27. End Try
    28. End Using
    29. Else
    30. msgError($"Die angeforderte Datei {ShareDirectory}\{Filename} konnte auf dem Server nicht gefunden werden!")
    31. Return
    32. End If
    33. End Sub
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Was meinst Du mit Öffnen ohne Speichern? Inhalt in einer TextBox anzeigen? Wenn man eine Internetseite anwählt, wird doch dessen Inhalt auch heruntergeladen und lokal gespeichert, wenn ich mich recht entsinne.
    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 dachte ich mir schon. Ok, dann müssen die Files eben in nen lokalen Temp-Ordner und das Programm muss dann versuchen beim Beenden diesen Ordner komplett zu leeren.
    Weil o.g. Konstrukt bekomm ich aufgrund der vielen Dateitypen nicht vollständig lauffähig. Also würde ich so vorgehen:
    -Programm wird geöffnet -> neue List(Of String) oder wegen mir List(Of FileInfo)
    -User öffnet was vom Storage -> wird lokal in einen Ordner geladen -> FileInfo oder Fullpath in die List gepackt
    -Programm wird beendet -> Die Dateien aus der Liste werden aus dem lokalen Ordner gelöscht

    Wär das so sinnvoll? Wenn das Programm abraucht, dann gibt's eben ein paar Dateien in dem Ordner die nicht gelöscht wurden, seh ich jetz nicht
    als Weltuntergang :P
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Meine Programme arbeiten zum Teil auch mit Dateien.

    Hierzu habe ich Routinen, die beim Beenden und, sofern nötig, beim Starten den Temp Ordner leeren.

    Eine

    Quellcode

    1. List Of(IO.FileInfo)
    kannst du durchlaufen um enthaltene Dateien zu löschen, hilft aber nach dem Neustart des Programms nicht mehr da sie dann leer ist.

    Hier mal ein Beispiel, wie meine Tmp-Routine aussieht.

    VB.NET-Quellcode

    1. Option Explicit On
    2. Option Strict On
    3. Public Module mod_Test
    4. Public Sub ClearTmp()
    5. Dim Tmp As New Tmp() 'Beispiel 1
    6. Tmp.Dispose()
    7. Dim TmpRoot As New IO.DirectoryInfo("C:\tmp") 'Beispiel 2
    8. Dim Tmp1 As New Tmp(TmpRoot)
    9. Tmp1.Dispose()
    10. Dim TmpRootStr As String = "C:\tmp" 'Beispiel 3
    11. Dim Tmp2 As New Tmp(TmpRootStr)
    12. Tmp2.Dispose()
    13. End Sub
    14. End Module
    15. Public Class Tmp : Implements IDisposable
    16. Private disposedValue As Boolean
    17. ''' <summary>
    18. ''' Standard Root-Verzeichnis.
    19. ''' </summary>
    20. ''' <returns></returns>
    21. Public ReadOnly Property DefaultRootDirectory As IO.DirectoryInfo
    22. Get
    23. Return New IO.DirectoryInfo(IO.Path.Combine(IO.Path.GetTempPath, Application.ProductName))
    24. End Get
    25. End Property
    26. Private Property FieldRootDirectory As IO.DirectoryInfo = Nothing
    27. Public ReadOnly Property RootDirectory As IO.DirectoryInfo
    28. Get
    29. With Me
    30. Return New IO.DirectoryInfo(If(.FieldRootDirectory Is Nothing, .DefaultRootDirectory, .FieldRootDirectory).FullName)
    31. End With
    32. End Get
    33. End Property
    34. Public ReadOnly Property Downloads As IO.DirectoryInfo
    35. Get
    36. With Me
    37. If .RootDirectory Is Nothing Then Return Nothing
    38. Return New IO.DirectoryInfo(IO.Path.Combine(.RootDirectory.FullName, "Download"))
    39. End With
    40. End Get
    41. End Property
    42. Public ReadOnly Property Logs As IO.DirectoryInfo
    43. Get
    44. With Me
    45. If .RootDirectory Is Nothing Then Return Nothing
    46. Return New IO.DirectoryInfo(IO.Path.Combine(.RootDirectory.FullName, "Log"))
    47. End With
    48. End Get
    49. End Property
    50. ''' <summary>
    51. ''' Erstellt das Tmp-Objekt mit Standard <see cref="RootDirectory"/>.
    52. ''' </summary>
    53. Sub New()
    54. End Sub
    55. ''' <summary>
    56. ''' Erstellt das Tmp-Objekt mit dem unter <paramref name="Root"/> angegebenen <see cref="IO.DirectoryInfo"/>. Wenn dies <c>Nothing</c> ist oder nicht existiert, wird <see cref="RootDirectory"/> verwendet.
    57. ''' </summary>
    58. ''' <param name="Root"></param>
    59. Sub New(Root As IO.DirectoryInfo)
    60. With Me
    61. .FieldRootDirectory = Root
    62. End With
    63. End Sub
    64. ''' <summary>
    65. ''' Erstellt das Tmp-Objekt mit dem unter <paramref name="Root"/> angegebenen <see cref="String"/>. Wenn dies <c>Nothing</c> ist oder nicht existiert, wird <see cref="RootDirectory"/> verwendet.
    66. ''' </summary>
    67. ''' <param name="Root"></param>
    68. Sub New(Root As String)
    69. With Me
    70. .FieldRootDirectory = If(String.IsNullOrEmpty(Root), Nothing, New IO.DirectoryInfo(Root))
    71. End With
    72. End Sub
    73. ''' <summary>
    74. ''' Löscht alle Dateien.
    75. ''' </summary>
    76. ''' <param name="disposing"></param>
    77. Protected Overridable Sub Dispose(disposing As Boolean)
    78. If Not disposedValue Then
    79. If disposing Then
    80. ' TODO: Verwalteten Zustand (verwaltete Objekte) bereinigen
    81. End If
    82. With Me
    83. Try
    84. If .Downloads IsNot Nothing AndAlso .Downloads.Exists Then .Downloads.Delete(True)
    85. If .Logs IsNot Nothing AndAlso .Logs.Exists Then .Logs.Delete(True)
    86. Catch ex As Exception
    87. MessageBox.Show(ex.Message, "Deleting Files", MessageBoxButtons.OK, MessageBoxIcon.Error)
    88. End Try
    89. End With
    90. disposedValue = True
    91. End If
    92. End Sub
    93. ' ' TODO: Finalizer nur überschreiben, wenn "Dispose(disposing As Boolean)" Code für die Freigabe nicht verwalteter Ressourcen enthält
    94. ' Protected Overrides Sub Finalize()
    95. ' ' Ändern Sie diesen Code nicht. Fügen Sie Bereinigungscode in der Methode "Dispose(disposing As Boolean)" ein.
    96. ' Dispose(disposing:=False)
    97. ' MyBase.Finalize()
    98. ' End Sub
    99. Public Sub Dispose() Implements IDisposable.Dispose
    100. ' Ändern Sie diesen Code nicht. Fügen Sie Bereinigungscode in der Methode "Dispose(disposing As Boolean)" ein.
    101. Dispose(disposing:=True)
    102. GC.SuppressFinalize(Me)
    103. End Sub
    104. End Class