Visual Basic 2010 Express, benötige hilfe bei meinem Code.

  • VB.NET

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

    Visual Basic 2010 Express, benötige hilfe bei meinem Code.

    Hallo liebe VB-Comunity,

    ich wollte fragen ob ihr mir evt bei meinem Code helfen könnt, ich komm da nun seid einer Woche nicht weiter und möchte es endich schaffen sofern das möglich ist.




    Ich bin grade dabei einen kleinen Minecraft Installer für
    meinen eigenen Minecraft Server zu schreiben.


    Das ganze läuft über Visual Basic 2010.


    Was der Code machen soll:



    Ich möchte in meinem Installer auf einen Button klicken können, der dann ein
    bereits vorhandenes .minecraft Verzeichnis aus AppData in einen Backupordner in
    Appdata verschiebt.


    Da der Installer auf jedem
    Computer mit Windows laufen soll muss ich ja irgendwie heraus bekommen wie der
    Laufwerksbuchstabe und der Nutzername ist.


    Das hab ich über: "Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)"
    auch
    geschafft.



    Nun weiß ich aber nur das der Ordner den ich
    verschieben möchte .minecraft heißt, dieser befindet sich im AppdData
    Verzeichnis.


    Problem an der Sache der Inhalt dieses Ordners
    ist von User zu User verschieden. Ich möchte aber alles verschoben haben.





    So sieht mein Code im
    ganzen aus:



    Public Class Form1





    Private
    Sub Button1_Click(ByVal
    sender As System.Object,
    ByVal e As
    System.EventArgs) Handles
    Button1.Click



    Dim fileList = My.Computer.FileSystem.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\.minecraft",



    Microsoft.VisualBasic.FileIO.SearchOption.SearchAllSubDirectories,
    "*.*")






    For Each
    foundFile In fileList



    My.Computer.FileSystem.MoveFile(foundFile, "Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)"
    & "\minecraftbackups\" & My.Computer.FileSystem.GetFileInfo(foundFile).Name)



    Next


    End Sub


    End Class





    Im Visual
    Basic zeigt er mir keine Fehler, doch wenn ich dann den Installer starte, wirft
    er mir den Fehler aus das er keine Datei erstellen könnte die bereits vorhanden
    ist (klingt logisch). Doch die Datei gibt es noch gar nicht.



    Könnt ihr mir da Helfen?

    Braucht ihr weitere Infos einfach bescheid sagen :)

    Vielen Dank schon mal :)


    Gruß

    CJ2401

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    CJ2401 schrieb:

    Könnt ihr mir da Helfen?
    Möglicherweise wäre es hilfreich, wenn du
    - die Frage im richtigen Forum stellst
    - den Code mit VB-Tags formatierst
    - anstatt den Namespaces My und VisualBasic die zeitgemäßen Klassen aus System.IO verwendest
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    CJ2401 schrieb:

    So sieht mein Code im ganzen aus:
    Ja wie denn?
    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).
    VB-Fragen über PN / Konversation werden ignoriert!

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. Dim fileList = My.Computer.FileSystem.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\.minecraft", Microsoft.VisualBasic.FileIO.SearchOption.SearchAllSubDirectories,
    4. "*.*")
    5. For Each foundFile In fileList
    6. 'Wieso hast du hier das Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) in Anführungsstrichen?
    7. My.Computer.FileSystem.MoveFile(foundFile, "Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)"
    8. & "\minecraftbackups\" & My.Computer.FileSystem.GetFileInfo(foundFile).Name)
    9. Next
    10. End Sub
    11. End Class


    Was wäre hiermit?

    VB.NET-Quellcode

    1. For Each foundFile In fileList
    2. Dim fi As New System.IO.FileInfo(foundfile)
    3. System.IO.File.Move(foundFile, System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "minecraftbackups", fi.Name))
    4. Next
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

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

    MemoAnMichSelbst schrieb:

    Was wäre hiermit?

    VB.NET-Quellcode

    1. For Each foundFile In fileList
    2. Dim fi As New System.IO.FileInfo(foundfile)
    3. fi.MoveTo(System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "\minecraftbackups", fi.Name))
    4. Next
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Find ich gut :D
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    1. Tag Quellcode aktivieren,
    2. VB-Tag drücken,
    3. Quellcode aus dem Studio rüber kopieren.
    Feddich.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Danke für die schnelle Antwort :)

    Hab
    nun den Code mit eurem Beispiel aktualisiert. Dazu noch das er den
    Backupordner vorher erstellt.

    So schaut nun der Code aus:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. If System.IO.Directory.Exists("System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), \minecraftbackup") = False Then
    4. System.IO.Directory.CreateDirectory("System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), \minecraftbackup")
    5. End If
    6. ' Der obere Teil ist zum erstellen des Backup Ordners.
    7. Dim fileList = My.Computer.FileSystem.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\.minecraft",
    8. Microsoft.VisualBasic.FileIO.SearchOption.SearchAllSubDirectories, "*.*")
    9. For Each foundFile In fileList
    10. Dim fi As New System.IO.FileInfo(foundFile)
    11. System.IO.File.Move(foundFile, System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "\minecraftbackup", fi.Name))
    12. Next
    13. End Sub
    14. End Class


    Wenn ich das Programm nun starte sagt er mir, das ein Teil des Pfads nicht gefunden werden konnte.

    Bin ich einfach nur Dumm und Blind oder woran liegt das jetzt?
    Merkwürdigerweise erstellt er aber auch den Ordner minecraftbackup nicht, ist da den schon etwas falsch?

    Gruß
    CJ2401
    Also du machst da nun wieder den gleichen, groben Fehler.

    "System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), \minecraftbackup" <---

    Sobald du irgendwas in VB in Anführungszeichen schreibst, ist das keine Funktion mehr und keine Variable, oder sonst was... sondern stupide der Text der da steht...

    Und du wirst unter Garantie keinen Ordner haben der so heißt ;)

    Ich hoffe das hilft dir etwas weiter
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Danke für deine Antwort,

    aber wenn ich die Anführungszeichen weg nehme, scheibt er mir unten in die Fehlerkonsole:

    "minecraftbackup" wurde nicht deklariert. Auf das Objekt kann aufgrund seiner Schutzstufe möglicherweise nicht zugegriffen werden.

    und

    Ausdruck erwartet


    Ich versteh nicht wieso das so ist ...

    Gruß

    CJ2401
    Was ist ein String?
    Was ist eine Variable?
    Woran erkennt der Compiler im Quellcode eine Variable?
    Was erwartet der Compiler von einer Variable, bevor sie verwendet wird?
    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).
    VB-Fragen über PN / Konversation werden ignoriert!

    VB.NET-Quellcode

    1. If System.IO.Directory.Exists("System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), \minecraftbackup") = False Then


    sollte zu

    VB.NET-Quellcode

    1. If System.IO.Directory.Exists(System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "\minecraftbackup") = False Then


    werden ...
    Kann ich dir nicht sagen, ich bin super neu auf dem Gebiet, hab mir zwar schon viele Artikel durchgelesen, doch irgentwie verstehe ich das nicht ganz,

    Kannst du mir dabei helfen?

    Hab nun den Code nochmal überarbeitet, das schaut nun so aus:

    VB.NET-Quellcode

    1. If System.IO.Directory.Exists(System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "\minecraftbackup") = False Then
    2. System.IO.Directory.CreateDirectory(System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "\minecraftbackup"))
    3. End If


    nun sagt er mir das beim Then eine gültige Ausdrucksform erwartet wird. Wie den bitte und was bedeutet das?

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

    Ich würde vorschlagen, du befasst dich mit dem Post 13# erst einmal.
    Bevor du anfängst irgendetwas zusammenzufrickeln was irgendwie läuft, du aber garnicht 100%ig verstehst was und wieso, solltest du erst die Fragen aus Post 13 beantworten können.

    Das sind die gröbsten Grundlagen in der Programmierung und wenn du sie beantworten kannst, verstehst du auch, was an deinem aktuellen Code so nicht funktioniert.

    Edit: Zähl mal bitte die Klammern die du auf machst und dann die, die du zu machst... ;)
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Hab mir nochmals genaustens die Themen zu den Fragen durchgelesen und denke das ich die fragen beantworten kann:

    Was ist ein String? -- Damit kann ich mehrere Zeichen speicher, ohne einen Arryverwaltungsaufwand für Char() berteiben zu müssen.

    Was ist eine Variable? -- Mit Variablen kann ich Wert speichern

    Woran erkennt der Compiler im Quellcode eine Variable? -- dadruch das z.b ein = verwendet wird wie hier: Sonne = 22C°

    Was erwartet der Compiler von einer Variable, bevor sie verwendet wird? -- das sie z.b Variant ist also benannt worden ist.

    Hoffe das dass so richtig ist, doch verstehe ich dadurch meinen letzen fehler immer noch nicht. Die klammern habe ich auch gezählt, es sind genau so viele geöffnete wie geschlossene.


    hier noch mal der ganze code, damit ihr das nachvollziehen könnt:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. If System.IO.Directory.Exists(System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "\minecraftbackup")) = False Then
    4. System.IO.Directory.CreateDirectory(System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "\minecraftbackup"))
    5. End If
    6. Dim fileList = My.Computer.FileSystem.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\.minecraft",
    7. Microsoft.VisualBasic.FileIO.SearchOption.SearchAllSubDirectories, "*.*")
    8. For Each foundFile In fileList
    9. Dim fi As New System.IO.FileInfo(foundFile)
    10. System.IO.File.Move(foundFile, System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "\minecraftbackup", fi.Name))
    11. Next
    12. End Sub
    13. End Class


    nun sagt er mir mal wieder:

    Eine Datei kann nicht erstellt werden, wenn sie bereits vorhanden ist.

    Aber die Datei ist nicht vorhanden, wo liegt der fehler 8|
    Gut,

    Worauf dich aufmerksam gemacht werden soll ist...
    Dass "1" ein String ist... und damit was anderes als 1
    Wenn du schreibst

    VB.NET-Quellcode

    1. If 1 = "1" then
    wird ein "FALSCH" raus kommen.
    Und auch ein

    VB.NET-Quellcode

    1. "System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), \minecraftbackup"

    ist was anderes als

    VB.NET-Quellcode

    1. System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), \minecraftbackup

    Denn das erste ist nur nen String und das zweite ist eine Funktion, welche dir einen String liefert...


    nehmen wir das mal auseinander...

    VB.NET-Quellcode

    1. If System.IO.Directory.Exists(System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "\minecraftbackup")) = False Then
    2. System.IO.Directory.CreateDirectory(System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "\minecraftbackup"))
    3. End If

    Das ist falsch. Die Intellisense von Visual Studio hilft dir hierbei eigentlich sehr komfortabel.

    VB.NET-Quellcode

    1. If System.IO.Directory.Exists(System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "minecraftbackup")) = False Then
    2. System.IO.Directory.CreateDirectory(System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "minecraftbackup"))
    3. End If

    So wird schon eher nen Schuh draus.
    Nun musst du verstehen was da gemacht wird...
    System.IO.Directory.Exists("blabla") <-- Das hier prüft, ob der Ordner, welcher in den Klammern steht, existiert.
    Anstelle von "blabla" muss bei dir dort stehen:

    VB.NET-Quellcode

    1. System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "minecraftbackup")

    Hier benutzt du wieder eine Funktion... Und zwar... die Path.Combine-Funktion. Diese nimmt einzelne Pfade Komma-getrennt auf und macht dir draus einen sinnvollen Pfad. Das ganze kommt als String zurück... Praktisch, da Directory.Exists einen String haben möchte.
    Du setzt zwei Pfade zusammen...
    Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
    und
    "minecraftbackup".
    Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) wirft dir hier den Pfad des AppData-Verzeichnisses zurück.

    Gleiches gilt für:

    VB.NET-Quellcode

    1. For Each foundFile In fileList
    2. Dim fi As New System.IO.FileInfo(foundFile)
    3. System.IO.File.Move(foundFile, System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "\minecraftbackup", fi.Name))
    4. Next


    Hier sollte m.M. nach stehen:

    VB.NET-Quellcode

    1. For Each foundFile In fileList
    2. Dim fi As New System.IO.FileInfo(foundFile)
    3. fi.MoveTo(System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "minecraftbackup", fi.Name))
    4. Next


    Vielleicht noch nen allgemeiner Tip...
    Debuggen!!!!!!

    Du setzt an irgend einer Stelle im Code (ab der es für dich interessant wird) den Curser und drückst "F9"... Dann markiert er dir die Zeile rot... Wenn du das nächste mal das Debugging startest (via diesem Play-Pfeil oder "F5"), wird er an der markierten Stelle stehen bleiben...
    Nun kannst du bei jeder Variable einen Rechtsklick machen und auf "Überwachen" gehen...
    Nun siehst du im Überwachungsfenster den Inhalt der Variable... Ich würde dir vorschlagen dann mit "F11" Schritt für Schritt durch zu gehen und zu schauen, was da so passiert und welche Werte/Pfade in deinen Variablen stehen... Nur so merkst du, wieso er irgendeinen Pfad nicht findet.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D