Probleme mit Windows Start und kopieren von Dateien

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Probleme mit Windows Start und kopieren von Dateien

    Hallo,
    ich bin ziemlich neu beim Programmieren mit VB und habe nun einen Auftrag von meinem Chef bekommen der möchte ein Programm das mit Windows startet (habe ich über ein Icon in Autostart gelöst) und dann Ordner mit 7 Zip auf ein Laufwerk packt. Also praktisch ein Sicherungsprogramm. Nun hab ich das Problem wenn ich es nicht beim Start ausführe gibt es keine Probleme, aber sobald ich es mit Windows starten lasse werden die Laufwerke nicht gefunden. Kann mir einer weiter helfen? Danke schon mal im Voraus.
    Hier mal der Code:

    ?

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class autosicher
    3. Public systempfad As String = Path.GetDirectoryName(Application.ExecutablePath)
    4. Public autostartpfad As String = Path.GetDirectoryName(Application.ExecutablePath) & "\autostart"
    5. Public binpfad As String = Path.GetDirectoryName(Application.ExecutablePath) & "\bin"
    6. Public datapfad As String = Path.GetDirectoryName(Application.ExecutablePath) & "\data"
    7. Public temppfad As String = Path.GetDirectoryName(Application.ExecutablePath) & "\data\temp"
    8. Public prodatapfad As String = Path.GetDirectoryName(Application.ExecutablePath) & "\data\projektdata"
    9. Public fq As String = autostartpfad & "\astrt.aut"
    10. Public fz As String = autostartpfad & "\autz.aut"
    11. Public Function IsDriveReady(ByVal sDrive As String) As Boolean
    12. ' Prüft, ob das angegebene Laufwerk existiert und
    13. ' ob darauf zugegriffen werden kann
    14. Try
    15. Dim oDrive As New System.IO.DriveInfo(sDrive)
    16. Return oDrive.IsReady
    17. Catch ex As Exception
    18. Return False
    19. End Try
    20. End Function
    21. Private Sub autosicher_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    22. Dim OverWrite As Boolean = True
    23. Dim sziel As String
    24. Dim quelle As String
    25. Dim trenn As String = ":"
    26. Dim Arr() As String
    27. Dim text As String
    28. Dim pfad As String
    29. Dim lw As String
    30. Dim stag As String = Now.ToString("dd") 'Variable für Tag in Dateiname
    31. Dim smonat As String = Now.ToString("MM") 'für Monat nd Datename
    32. Dim sjahr As String = Now.ToString("yyy") 'für Jahr nd Datename
    33. sziel = My.Computer.FileSystem.ReadAllText(fz)
    34. '-----------------------------------------------------------------
    35. 'Abfrage ob Sicherungsziel Vorhanden
    36. '------------------------------------------------------------------
    37. System.Threading.Thread.Sleep(15000)
    38. '------------------------------------------------------------------
    39. 'Daten nach temp kopieren
    40. '-------------------------------------------------------------------
    41. Dim sr As New System.IO.StreamReader(fq)
    42. Do While Not sr.EndOfStream
    43. Dim Zeileninhalt As String
    44. Zeileninhalt = sr.ReadLine()
    45. Arr = Zeileninhalt.Split(trenn)
    46. lw = Arr(0)
    47. pfad = Arr(1)
    48. ' pfad = Arr(2)
    49. My.Computer.FileSystem.CopyDirectory(lw & ":" & pfad, temppfad & "\sicherung" & pfad, True)
    50. Loop
    51. '----------------------------------------------------------------
    52. ' Zip im Ziel erstellen
    53. Dim SevenZip As New System.Diagnostics.Process
    54. SevenZip.StartInfo.FileName = binpfad & "\7z.exe"
    55. ' Zip optionen
    56. Dim zfile As String = sziel & "\prob" & stag & smonat & sjahr 'zipfile mit pfad
    57. Dim zf2 As String = temppfad & "\sicherung\"
    58. Dim zf3 As String = "a" & " " & zfile & " " & zf2
    59. SevenZip.StartInfo.Arguments = zf3
    60. SevenZip.Start()
    61. 'SevenZip.WaitForExit()
    62. '--------------------------------
    63. 'Dat im Ziel schreiben
    64. '-------------------------------
    65. My.Computer.FileSystem.CopyFile(fq, zfile & ".dat", True)
    66. '----------------------------------------
    67. 'Verzeichnis sicherung löschen
    68. '---------------------------------------
    69. My.Computer.FileSystem.DeleteDirectory(temppfad & "\sicherung\", FileIO.DeleteDirectoryOption.DeleteAllContents)
    70. End
    71. End Sub
    72. End Class
    Deine Frage kann ich dir nicht beantworten. Ich habe dein Projekt nachgebaut und kann nur bestätigen, dass bei mir das Sichern der Verzeichnisse auch funktioniert, aber nicht, wenn ich es beim Anmelden mit Autostart durchführe.
    Es wird das Ziparchiv zwar erstellt, aber es ist leer.

    Vielleicht hat ja jemand dazu die Lösung, ansonsten würde ich einen Timer verwenden und erst 2 Minuten später die Sicherung starten.

    Zum Programm: Du scheinst Option Strict Off zu programmieren, stell bitte Option Strict On ein.
    - Code gehört für mich nicht ins Form_Load Ereignis, besser ist Form_Shown, weil im Form_Load die Fehler meist nicht geworfen werden.
    -

    Quellcode

    1. Dim trenn As String = ":"
    müsste

    Quellcode

    1. Dim trenn As String = ":"c
    heissen
    - Pfade am besten mit

    Quellcode

    1. Path.Combine

    zusammensetzen. Das ist einfacher, schneller, sicherer
    - Die Exisitens von den Dateien und Pfaden in deinem Programm wird nicht geprüft.
    - Leerzeilen in den Textdateien verursachen Fehler, das wird nichts geprüft. Die Datei erwartet nur eine Zeile, dann lies auch nur eine Zeile.
    - Deine Datumstring geht auch einfacher:

    Quellcode

    1. Dim Heute As String = DateTime.Now.ToString("ddMMyyyy")

    - Dein Split versteh ich nicht. Erst Splitest Du in ein bereits dimensioniertes Array, dann bastelst Du den Inhalt offensichtlich wieder zusammen. Sowie ich das sehe, würde

    VB.NET-Quellcode

    1. Dim Zeileninhalt = sr.ReadLine()
    2. If Directory.Exists(Zeileninhalt) Then
    3. My.Computer.FileSystem.CopyDirectory(Zeileninhalt, Path.Combine(temppfad, "sicherung"), True)
    4. End If

    völlig reichen
    - Solltest du doch splitten müssen, dann verwende eine List (Of String):

    Quellcode

    1. Dim SplitList = Zeileninhalt.Split(trenn).ToList()
    . Denk daran, dann die Anzahl der Elemente zu prüfen bevor auf Elemente zugreifst.

    Falls mir noch mehr aufgefallen war, hab ich es vergessen...

    Siehe da, mir ist noch was eingefallen: Kann an meinem Umbau liegen, denn deinen Code kann man in meinem Projekt kaum noch erkennen. Kann es sein, dass in der Sicherung alle Dateien aller Sicherungsverzeichnisse zusammengewürfelt abgelegt werden? Falls ja, das ist extrem uncool.

    Noch ein Nachtrag: Verwende ein Using wenn es möglich ist: docs.microsoft.com/de-de/dotne…tatements/using-statement
    In dem Code also:

    VB.NET-Quellcode

    1. Using sr As New System.IO.StreamReader(fq)
    2. Do While Not sr.EndOfStream
    3. 'Code hier
    4. Loop
    5. End Using

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

    @Kerstinneu Willkommen im Forum.
    Wie äußert sich das?
    Logge mal in Deinem Programm, was Du vorfinden willst und was Du vorfindest.
    Was passiert, wenn Du das Programm vom Explorer aus im Autostart-Pfad ausführst?
    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!

    Kerstinneu schrieb:

    Hat sich erledigt
    Dann kennzeichne bitte diesen Deinen Thread als erledigt, indem Du oben neben dem Titel auf das abgerundete Quadrat doppelklickst.
    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!