Ich benötige Hilfe bei meinem zweiten "Projekt", bitte

Lesterdor

Erfahrenes Mitglied
Hallo liebe Community,

[1.] Vorwort:
Wie ihr sicherlich sehen könnt, bin ich neu hier im Forum. Dies trifft ebenfalls auf meine Kenntnisse in Visual Basic 2008 zu. Es ist meine erste Programmiersprache, ich bin also völlig neu auf dem Gebiet der Programmierung. Ich habe mich durch die VB 2008 Hilfe gelesen und einige Erfahrungen sammeln können. Einige kennen mich vielleicht aus dem Thread "Hilfe bei meinem ersten Projekt", dort habe ich einfach versucht einige Funktionen zu schreiben, was quasi am Ende ein Programm darstellen sollte, um Erfahrungen auf dem Gebiet zu erhalten.

[2.] "Mein zweites Projekt - Projektname "Call of Duty 4 Profiler"":
Dieses Mal soll mein Programm wirklich Einsatz bei einigen Freunden und mir finden. Wir spielen gerne das Spiel "Call of Duty 4", wer das Spiel kennt, weiß sicherlich, dass man dort Erfahrung sowie neue Gegenstände freispielen kann. Diese Werte werden in einem Ordner gespeichert. Mein Programm, welches ich anstrebe, soll einfach als Backup dienen. Der Benutzer wählt einfach das Installationsverzeichnis von Call of Duty 4 (cod 4) aus und dann den Pfad, wo er den Ordner hinkopieren möchte. Dabei wird nur der Unterordner "players" kopiert, da sich in ihm die Dateien befinden, in denen die Werte des Spielers gespeichert sind (Erfahrung, freigespielte Waffen).

Call of Duty 4 Profiler Layout

[3.] Programmerklärungen:
Im Folgenden möchte ich kurz die einzelen Buttons und deren Funktionen erklären:
Menüleiste:
Datei: Enthält den Punkt "Beenden", schließt also das Programm -->Funktioniert
Automatik: Enthält den Punkt "Log-Dateien erstellen", genauere Erläuterung siehe unten --> Funktioniert
Buttons:
Von: Beim Klicken öffnet sich ein FolderBrowserDialog, wo der Benutzer das Installationsverzeichnis von Call of Duty 4 angibt --> Funktioniert
Nach: Beim Klicken öffnet sich ein FolderBrowserDialog, wo der Benutzer den Speicherort angibt --> Funktioniert
Kopieren: Beim Klicken kopiert das Programm den Ordner zum Zielordner -->Funktioniert
Label: Die beiden Labels geben einfach nur den Pfad an, den der Benutzer angegeben hat --> Funktioniert

[4.] Probleme
Wie man meinem 3. Punkt entnehmen kann, läuft mein Programm eigentlich schon. Ich habe auch Fragen / Probleme bei einigen Feinheiten, der Übersichtshalber liste ich hier meine Fragen und Probleme auf und werde im 5. Gliederungspunkt meinen bisherigen Code veröffentlichen:

Kurze Erklärung zu den "Log-Dateien":
Sobald einmal der Quellpfad sowie der Zielpfad angegeben wurde, kann man diese Pfade in einer *.txt Datei abspeichern. Vorteil besteht darin, dass man sofern der Benutzer jedesmal denselben Pfad haben möchte nur 1.-Klick tätigen muss und es wird kopiert. Leider weiß ich nicht, wie man aus nur 1. *.txt Datei Zeilen ausliest, sonst hätte ich nur 2 "Log"-Dateien erstellt.

*Wenn ich im Menü "Automatik" Log-Dateien erstellen drücke, erstellt mir mein Programm 3 *.txt Dateien mit dem angebenen Namen, doch leider enthält der Name den Präfix Debug, obwohl ich es nicht angegeben habe.

*Wenn ich auf den Button "von" klicke und ein anderes Verzeichnis auswähle, soll eine Fehlermeldung erscheinen. Ich habe schon bei google gesucht, bekomme aber keine vernünftige Funktion hin, die Abfragt, ob im angegebenen Ordner das Unterverzeichnis "players" existiert.

[5.] Code
Damit mir geholfen werden kann, kopiere ich meinen kompletten Code:

Menüleiste:
Datei:
Beenden
Visual Basic:
 Private Sub BeendenToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BeendenToolStripMenuItem.Click
        Me.Close()
    End Sub

Automatik:
Log-Dateien erstellen
Visual Basic:
 Private Sub LogDateienErstellenToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LogDateienErstellenToolStripMenuItem.Click
        My.Computer.FileSystem.WriteAllText(Application.StartupPath & "Log.txt", TimeOfDay & " von " & von & " nach " & vbCrLf & nach, True)
        My.Computer.FileSystem.WriteAllText(Application.StartupPath & "Readin.txt", von & "\players" & vbCrLf, False)
        My.Computer.FileSystem.WriteAllText(Application.StartupPath & "Readout.txt", nach & vbCrLf, False)
    End Sub

Automatisches Laden
Visual Basic:
     Private Sub AutomatischesLadenToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AutomatischesLadenToolStripMenuItem.Click
        Readin = My.Computer.FileSystem.ReadAllText(Application.StartupPath & "Readin.txt")
        Readout = My.Computer.FileSystem.ReadAllText(Application.StartupPath & "Readout.txt")
        von = Readin
        nach = Readout
        TextBox1.Text = Readin
        TextBox2.Text = Readout
        My.Computer.FileSystem.CopyDirectory(von, nach, FileIO.UIOption.AllDialogs, FileIO.UICancelOption.ThrowException)
    End Sub

Buttons:
Von
Visual Basic:
 Private Sub cmdVon_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdVon.Click
        MsgBox("Wählen Sie bitte das Verzeichnis aus, in dem Sie Call of Duty 4 hinein installiert haben", , "Call of Duty 4 Installationsverzeichnis")
        FolderBrowserDialog1.ShowDialog()
        von = FolderBrowserDialog1.SelectedPath
        TextBox1.Text = von & "\players"

    End Sub

Nach
Visual Basic:
  Private Sub cmdNach_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdNach.Click
        MsgBox("Wohin möchten Sie Ihren Profile-Ordner kopieren ?", , "Sicherungspfad")
        FolderBrowserDialog2.ShowDialog()
        nach = FolderBrowserDialog2.SelectedPath
        TextBox2.Text = nach
    End Sub

Kopieren
Visual Basic:
 Private Sub cmdCopy_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdCopy.Click
        My.Computer.FileSystem.CopyDirectory(von & "\players", nach, FileIO.UIOption.AllDialogs, FileIO.UICancelOption.ThrowException)
    End Sub

Meine Variablen Deklaration
Visual Basic:
 Public Class Form1
    Dim Readout As String
    Dim Readin As String
    Dim nach As String
    Dim von As String



[5.] Schlusswort:
Ich weiß, dass der Thread sehr lang ist, aber ich habe versucht alles so genau wie möglich zu beschreiben. Falls irgendwelche Fragen aufkommen, werde ich diese natürlich schnellstmöglich beantworten. Eigentlich ist mein Programm sehr simple gehalten, da es eigentlich nur kopiert, aber für mich als Neuling sind solche Dinge am Anfang noch recht komplex, gerade Abfragen, die überprüfen, ob im angebenen Verzeichnis ein Unterordner Namens "players" existiert usw. Ich weiß, dass es schwer fällt sich einfach auszudrücke, wenn man in der Materie drinsteckt. Doch bitte bedenkt, dass ich noch nicht soviel Ahnung habe und mit Fachwörtern oder sonstigen Abkürzungen Probleme haben werde. Ich möchte mich schon einmal im Voraus bei euch bedanken und schätze eure Mühe. :)
 
*Wenn ich im Menü "Automatik" Log-Dateien erstellen drücke, erstellt mir mein Programm 3 *.txt Dateien mit dem angebenen Namen, doch leider enthält der Name den Präfix Debug, obwohl ich es nicht angegeben habe.
Probiers mal so.


Code:
      Private Sub LogDateienErstellenToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LogDateienErstellenToolStripMenuItem.Click
   
              My.Computer.FileSystem.WriteAllText(Application.StartupPath & "/" & "Log.txt", TimeOfDay & " von " & von & " nach " & vbCrLf & nach, True)
   
              My.Computer.FileSystem.WriteAllText(Application.StartupPath & "/" & "Readin.txt", von & "\players" & vbCrLf, False)
   
              My.Computer.FileSystem.WriteAllText(Application.StartupPath & "/" & "Readout.txt", nach & vbCrLf, False)
   
          End Sub

Kurze Erklärung zu den "Log-Dateien":
Sobald einmal der Quellpfad sowie der Zielpfad angegeben wurde, kann man diese Pfade in einer *.txt Datei abspeichern. Vorteil besteht darin, dass man sofern der Benutzer jedesmal denselben Pfad haben möchte nur 1.-Klick tätigen muss und es wird kopiert. Leider weiß ich nicht, wie man aus nur 1. *.txt Datei Zeilen ausliest, sonst hätte ich nur 2 "Log"-Dateien erstellt.
So hätte ich das gelöst.

Code:
        Dim pfad As String = "pfade.txt" ' name der Textdatei die die pfade enthällt
        Dim pfadlist As New List(Of String)
        Dim SReader As New System.IO.StreamReader(pfad)
        While Not SReader.EndOfStream
            pfadlist.Add(SReader.ReadLine)
        End While
        SReader.Close()
        For Each pfad In pfadlist
            MsgBox(pfad)
        Next


*Wenn ich auf den Button "von" klicke und ein anderes Verzeichnis auswähle, soll eine Fehlermeldung erscheinen. Ich habe schon bei google gesucht, bekomme aber keine vernünftige Funktion hin, die Abfragt, ob im angegebenen Ordner das Unterverzeichnis "players" existiert.

Code:
        Dim FDialog As New FolderBrowserDialog
        With FDialog
            .Description = "Bitte wählen Sie ihr CoD4 verzeichnis aus!"
            If .ShowDialog = Windows.Forms.DialogResult.OK Then
                von = .SelectedPath
                If Not System.IO.Directory.Exists(von & "\players") Then
                    MessageBox.Show("Der Ordner players konnte in """ & von & """ nicht gefunden werden!" & vbNewLine & "Bitte überprüfen Sie ihre auswahl.", _
                                    "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
                Else
                    TextBox1.Text = von & "\players"
                End If
            End If
        End With

Guck dir aber die Codes Snippsel bitte nochmal an, denn von Copy>paste lernt man nichts :p
Peter86
 
Zuletzt bearbeitet:
Ich kenn mich zwar in VB.NET nicht aus, aber aus den 3 Logdateien würde ich 1 INI-Datei machen. Such/google mal nach "INI-Dateien unter VB.NET"

In VB6 sind das zwei einfach API-Calls.
 
Hallo Lesterdor.

Bei deinem Problem it der Abfrage ob der Unterordner "\players" in dem gewählten verzeichnis existiert kann ich dir helfen. Das ist ganz einfach.
Code:
'Also hier erstal der Teil von deinem Code noch

       Private Sub cmdNach_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdNach.Click

               MsgBox("Wohin möchten Sie Ihren Profile-Ordner kopieren ?", , "Sicherungspfad")

               FolderBrowserDialog2.ShowDialog()

              nach = FolderBrowserDialog2.SelectedPath
'Und hier jetzt die Abfrage 

 If My.Computer.FileSystem.DirectoryExists(nach & "\players") Then
            TextBox2.Text = nach
        Else
            MsgBox("Falsches verzeichnis")
            nach = Nothing
        End If
             
 
          End Sub

Ich hoffe ich konnte dir helfen
 
Du musst nich nach abfragen, sondern von. Ausserdem halte ich deine Lösung nicht gerade sinnvoll, denn wenn ich z.B. auf Abbrechen drücke, werde ich darauf hingewiesen, das es das Falsche verzeichnis ist. Ich empfehle meine lösung :rolleyes:

Peter86
 
Zuletzt bearbeitet:
Als kleiner Hinweis um Pfadangaben zu erstellen benutze am besten die Path.Combine Methode (Namespace System.IO)
Code:
Path.Combine(Application.StartupPath, "Log.txt")
Somit brauchst du dich nicht um "/" kümmern und ist einfach die sichere Methode.

Um aus einer Datei zulesen kannst du dir ja mal StreamReader anschauen oder zum schreiben StreamWriter.
(Müssten beide im Namespace System.IO sein)

Edit:
Sehe grad Peter hat ja schon StreamReader in seinem Quellcode.
 
Zuletzt bearbeitet:
Zurück