Dateitypen mit verschiedenen Anwendungen öffnen

  • VB.NET

Es gibt 42 Antworten in diesem Thema. Der letzte Beitrag () ist von Doener.

    Dateitypen mit verschiedenen Anwendungen öffnen

    Hallo,

    ich habe eine Listebox, welche mir PDFs auflistet, beim klicken auf ansehen den Adobe Reader startet und beim beenden von diesem die Datei löscht. Erweitere ich nun das ganze um den Dateityp txt, passiert nichts - logisch, weil kein Programm definiert ist - und die Datei wird einfach gelöscht. Wie bekomme ich es hin, das verschiedene Dateitypen mit fest definierten Programmen aufgerufen werden? Ein einfacher Aufruf mit process.start kommt nicht in Frage, da ich den laufenden Prozess überwache musss, wegen dem Löschen am Ende. Darum brauche ich feste Namen

    Danke




    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class Share
    3.  
    4. Private Sub Aktualisieren_Click(sender As Object, e As EventArgs) Handles Aktualisieren.Click, Aktualisieren.Click
    5. If System.IO.File.Exists("C:\Justiz\share.txt") Then 'Prüfen ob Konfig Datei vorhanden ist
    6. Else
    7. MessageBox.Show("Die Konfigurationsdatei für den Pfad des Shares ist nicht vorhanden oder nicht im selben Ordner wie das Programm.")
    8. End If
    9.  
    10. Dim SharePfad As String
    11. SharePfad = My.Computer.FileSystem.ReadAllText("C:\Justiz\share.txt")
    12. Dim directory As New System.IO.DirectoryInfo(SharePfad)
    13. For Each file1 As System.IO.FileInfo In directory.GetFiles
    14. If file1.Extension = ".pdf" Or file1.Extension = ".PDF" Then
    15. ListBox1.Items.Add(file1.FullName)
    16. End If
    17. Next
    18. ListBox1.Sorted = True
    19. For i As Integer = ListBox1.Items.Count - 1 To 1 Step -1
    20. If ListBox1.Items(i).ToString = ListBox1.Items(i - 1).ToString Then ListBox1.Items.RemoveAt(i)
    21. Next
    22. Ansehen.Enabled = True
    23. ListBox1.SelectedIndex = 0
    24. End Sub
    25. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Ansehen.Click
    26. If ListBox1.SelectedItem Is Nothing = False Then
    27. Process.Start(ListBox1.SelectedItem)
    28.  
    29.  
    30. End If
    31. Dim AdobeProcess As String = "AcroRd32"
    32. For Each Prozess As Process In Process.GetProcesses()
    33. Next
    34. If Process.GetProcessesByName(AdobeProcess).Count > 0 Then
    35. If MsgBox("Die angezeigte Date wird nach dem Schließen des Adobe Readers gelöscht!", vbOKOnly, "Hinweis") = vbOK Then
    36. Me.Hide()
    37. Else
    38. End If
    39. End If
    40.  
    41. Do
    42. If Process.GetProcessesByName(AdobeProcess).Count > 0 Then
    43. Else
    44. Exit Do
    45. End If
    46. Loop
    47.  
    48. 'MsgBox("Die angezeigte Datei wird nun gelöscht!", MsgBoxStyle.Information, "Hinweis")
    49. My.Computer.FileSystem.DeleteFile(ListBox1.SelectedItem) 'geht nicht: wird von anderem Prozess verwendet
    50.  
    51.  
    52.  
    53. Me.Close()
    54. End Sub
    55.  
    56. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Beenden.Click
    57. Me.Close()
    58. End Sub
    59. Private Sub Share_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    60. Ansehen.Enabled = False
    61. End Sub
    62. End Class

    Doener schrieb:

    VB.NET-Quellcode

    1. If file1.Extension = ".pdf" Or file1.Extension = ".PDF" Then
    Mach das so:

    VB.NET-Quellcode

    1. If file1.Extension.ToLower() = ".pdf" Then
    Ist bei Dir die Extension "txt" nicht mit dem Notepad verknüpft?
    Dann so:

    VB.NET-Quellcode

    1. Dim pr As New Process
    2. pr.StartInfo.FileName = "Notepad.exe"
    3. pr.StartInfo.Arguments = "c:\Temp\test.txt"
    4. pr.Start()
    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!
    Ursprünglich stand da

    VB.NET-Quellcode

    1. If file1.Extension = ".pdf" Or file1.Extension = ".txt" Then


    aber da bin ich ja in das Problem reingelaufen -darum habe ich ja es nur PDF Only gestellt, um das Löschen zu verhindern.

    Also einfach das ganze in eine IF Funktion einbauen?

    Doener schrieb:

    Ursprünglich stand da
    Ich meinte die Groß- und Kleinschreibung.
    Sieh Dir mal dies an:

    VB.NET-Quellcode

    1. Dim datei = "c:\Temp\Test.txt"
    2. Dim extension = System.IO.Path.GetExtension(datei).ToLower
    3. Dim pr As New Process
    4. Select Case extension
    5. Case ".pdf"
    6. pr.StartInfo.FileName = datei
    7. Case ".txt"
    8. pr.StartInfo.FileName = "Notepad.exe"
    9. pr.StartInfo.Arguments = datei
    10. Case ".doc"
    11. pr.StartInfo.FileName = datei
    12. Case Else
    13. MessageBox.Show("Neue Extension")
    14. Return
    15. End Select
    16. pr.Start()
    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!
    Danke

    Wie kann ich verhindern, das meine Schleife zu viel Last erzeugt?

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Ansehen.Click
    2. If ListBox1.SelectedItem Is Nothing = False Then
    3. Process.Start(ListBox1.SelectedItem)
    4.  
    5.  
    6. End If
    7. Dim AdobeProcess As String = "AcroRd32"
    8. For Each Prozess As Process In Process.GetProcesses()
    9. Next
    10. If Process.GetProcessesByName(AdobeProcess).Count > 0 Then
    11. If MsgBox("Die angezeigte PDF-Datei wird nach dem Schließen des Adobe Readers gelöscht!", vbOKOnly, "Hinweis") = vbOK Then
    12. Me.Hide()
    13.  
    14. End If
    15. Else
    16.  
    17.  
    18. ' MsgBox("Die angezeigte TXT-Datei wird nach dem Schließen des Adobe Readers nicht gelöscht!", vbOKOnly, "Hinweis")
    19. ' Me.Hide()
    20.  
    21. End If
    22.  
    23. Do
    24. If Process.GetProcessesByName(AdobeProcess).Count > 0 Then
    25. Else
    26. Exit Do
    27. End If
    28. Loop
    29.  
    30. 'MsgBox("Die angezeigte Datei wird nun gelöscht!", MsgBoxStyle.Information, "Hinweis")
    31. My.Computer.FileSystem.DeleteFile(ListBox1.SelectedItem) 'geht nicht: wird von anderem Prozess verwendet
    32.  
    33.  
    34.  
    35. Me.Close()
    36. End Sub



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

    Doener schrieb:

    zu viel Last
    Nutze einen Timer.
    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!
    Ich habe nun auf meinem PC bei der Ausführung fast keine Last mehr. Führe ich es allerdings in einer Terminalserversitzung aus, kann ich das Fenster nicht verschieben, ohne das de Fenster Inhalt dahinter sichtbar bleibt, also das Bild vom aktiven Fenster bleibt an der Stelle wie festgefroren oder einfach nur weiss. Woran liegt das?

    mit appliation.doevents ist das Problem zwar weg, aber die Auslastung liegt bei 100%

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

    Doener schrieb:

    Woran liegt das?
    Weil der Hauptthread Deines Programms ausgelastet ist und auf Eingaben nicht mehr reagieren kann.
    Bevor Du nun weiter alles verschlimmbesserst, solltest Du uns sageb, was genau Du eigentlich vor hast.
    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!
    Ich starte die ausgewählte Datei aus der Listbox und öffne diese mit dem Adobe Reader. Beim Öffnen wird ein Hinweis angezeigt, das die Datei nach dem schließen vom AR gelöscht wird. Dazu überprüfe ich per Schleife, ob der Task noch vorhanden ist. Wenn nicht, dann soll die Datei sofort gelöscht werden.

    Ich habe für diese Funktion 2 Probleme.

    1: Während der Überprüfung, ob der Task noch läuft, belegt die Schleife auf einem single Core System annähernd 95%, was zur Folge hat, das ich nicht sinnvoll die Fenster verschieben kann. Mit doEvents geht dies, aber zu lasten der CPU mit 100%

    2. Ich würde gerne eine msgbox anzeigen, ohne das zuvor das andere Fenster noch sichtbar ist.

    Mache ich

    VB.NET-Quellcode

    1. If MsgBox("Die angezeigte PDF-Datei wird nach dem Schließen des Adobe Readers gelöscht!", vbOKOnly, "Hinweis") = vbOK Then
    2. Me.Hide()


    dann habe ich die msg box im Vordergrund, aber man sieht bis zum OK Klick auch das andere fenster. Ziehe ich das me.hide vor, dann ist das Fenster weg, aber die msgbox hinter dem AR.

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Ansehen.Click
    2. If ListBox1.SelectedItem Is Nothing = False Then
    3. Process.Start(ListBox1.SelectedItem)
    4. End If
    5. Dim AdobeProcess As String = "AcroRd32"
    6. For Each Prozess As Process In Process.GetProcesses()
    7. Next
    8. If Process.GetProcessesByName(AdobeProcess).Count > 0 Then
    9. If MsgBox("Die angezeigte PDF-Datei wird nach dem Schließen des Adobe Readers gelöscht!", vbOKOnly, "Hinweis") = vbOK Then
    10. Me.Hide()
    11. End If
    12. Else
    13. ' MsgBox("Die angezeigte TXT-Datei wird nach dem Schließen des Adobe Readers nicht gelöscht!", vbOKOnly, "Hinweis")
    14. ' Me.Hide()
    15. End If
    16. Do
    17. If Process.GetProcessesByName(AdobeProcess).Count > 1 Then
    18. Else
    19. Exit Do
    20. End If
    21. Application.DoEvents()
    22. Loop
    23. 'MsgBox("Die angezeigte Datei wird nun gelöscht!", MsgBoxStyle.Information, "Hinweis")
    24. My.Computer.FileSystem.DeleteFile(ListBox1.SelectedItem) 'geht nicht: wird von anderem Prozess verwendet
    25. Me.Close()
    26. End Sub


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

    @Doener Beim Lesen Deines Codes bekommt man ja Augenkrebs.
    Kannst Du bitte mal die überflüssigen Leerzeichen rausmachen?
    Ansonsten ist über dem Post-Edit-Feld eine CheckBox "Quellcode".
    Erst den sprachspezifischen Code-Tag generieren,
    dann auf Quellcode umschalten,
    dann den Code einfügen,
    dann absenden.
    -----
    Was willst Du überhaupt machen / erreichen?
    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:

    Was willst Du überhaupt machen / erreichen?
    Also noch nicht

    Doener schrieb:

    erledigt

    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!
    Das habe ich doch....meine Lösung ist funktionell 1A - nur technisch nicht ganz sauber. wie soll ich erklären, was ich machen will, wenn es funktioniert und so bleiben soll? Es soll ja nur das MSG Box Problem und die Fensterproblematik gelöst werden.

    Doener schrieb:

    Das habe ich doch
    Meinst Du dies:
    Ich möchte per Process sin Proggramm starten mit ieiner Datei als Argument, und nach Beendigung dieses Prozesses soll die Argument-Datei gelöscht werden.
    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!
    MsgBox() <- PÖSE, NEU -> MessageBox.Show(), mische nicht .NET und VB6.
    Du wolltest doch oben mehrere Dateitypen prüfen, dir wurde select case vorgeschlagen weils einfach auch übersichtlicher und performanter ist als das ewige if.....end if
    Irgendwie postet du schon 3x den selben Code ohne verbesserung.

    Beispiel für eine MessageBox
    MessageBox.Show("Das ist meine Wichtige Mitteilung", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information)
    Wer fragt, ist ein Narr für eine Minute. Wer nicht fragt, ist ein Narr sein Leben lang.

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

    @Rod. Das habe ich nicht geschrieben. Alles steht im Posting 12

    @Snaptu: Messagebox löst das Problem nicht. Die Box verschwindet auch in den Hintergrund, wenn hide.me vorher kommt. Kommt hide.me hinterher, bleibt das vorherige Fenster offen, bis ich OK klicke.

    Doener schrieb:

    Das habe ich nicht geschrieben
    Das weiß ich, denn ich habe das geschrieben. :rolleyes:
    Dättest Du es geschrieben, hätte ich Dich zitiert.
    Ist das sinngemäß das, was Dir vorschwebt?
    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!