Variable falsch gesetzt ? System.ArgumentNullExpetion in simpler Anfänger Form VB2013 Studio Express

  • VB.NET

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

    Variable falsch gesetzt ? System.ArgumentNullExpetion in simpler Anfänger Form VB2013 Studio Express

    Hallo, ich bin absoluter Anfänger, also wundert euch bitte nicht :)

    Ich will mit diesem Programm erst mal simple Files Zählen und die Zahl dann ausgeben (später dann kopieren, es soll ein Kopierprogramm werden). Da das Programm bei vielen Files stockt und nicht mehr reagiert (eine Zeit lang nur) , dachte ich an einen Backgroundworker.

    Wie gesagt das ist mein erstes Programm..

    Ich habe wohl die Variable SourcePath falsch definiert. Diese ist bei Zeile 61 gleich Null. Allerdings ist sie bei Zeile 24 noch schön das was ich eingebe also genau der Pfad sagen wir "C:/Test". Habs mit dem Haltebefehl durch den Debugger laufen lassen und da sehe ich ja die Variable. Irgendwie ist SourcePath also auf Null gesetzt worden durch den Aufruf des Backgrounworkers..Warum? Und wie behebe ich das?

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class Form1
    3. 'Set Variables
    4. Dim Files As Integer = 0
    5. Dim SourcePath As String
    6. 'End Button
    7. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    8. Close()
    9. End Sub
    10. 'Choose Source
    11. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    12. Dim ShowFolders As FolderBrowserDialog = New FolderBrowserDialog
    13. ShowFolders.RootFolder = Environment.SpecialFolder.MyComputer
    14. If ShowFolders.ShowDialog = Windows.Forms.DialogResult.OK Then
    15. Dim SourcePath As String = ShowFolders.SelectedPath
    16. TextBox1.Text = SourcePath
    17. End If
    18. BackgroundWorker1.RunWorkerAsync()
    19. Label3.Text = Files
    20. End Sub
    21. 'Choose Destination
    22. Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    23. Dim ShowFolders1 As FolderBrowserDialog = New FolderBrowserDialog
    24. ShowFolders1.RootFolder = Environment.SpecialFolder.MyComputer
    25. If ShowFolders1.ShowDialog = Windows.Forms.DialogResult.OK Then
    26. Dim DestinationPath As String = ShowFolders1.SelectedPath
    27. TextBox2.Text = DestinationPath
    28. End If
    29. End Sub
    30. 'Copy
    31. Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    32. If TextBox1.Text <> Nothing And TextBox2.Text <> Nothing Then
    33. My.Computer.FileSystem.CopyDirectory(TextBox1.Text, TextBox2.Text, showUI:=FileIO.UIOption.AllDialogs)
    34. Else
    35. MessageBox.Show("No Source or Destination Path!")
    36. End If
    37. End Sub
    38. 'Count Files
    39. Private Sub Choice()
    40. Dim Files As Integer = My.Computer.FileSystem.GetFiles(SourcePath, FileIO.SearchOption.SearchAllSubDirectories, "*.*").Count
    41. End Sub
    42. 'Background Worker thta count files
    43. Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    44. Call Choice()
    45. End Sub
    46. End Class

    Fehler:
    In System.ArgumentNullException ist eine Ausnahme vom Typ "mscorlib.dll" aufgetreten, doch wurde diese im Benutzercode nicht verarbeitet.

    Zusätzliche Informationen: Der Wert darf nicht NULL sein.


    In dieser Zeile:

    VB.NET-Quellcode

    1. Dim Files As Integer = My.Computer.FileSystem.GetFiles(SourcePath, FileIO.SearchOption.SearchAllSubDirectories, "*.*").Count


    SourcePath Nothing String
    Willkommen im Forum. :thumbup:

    garack schrieb:

    Und wie behebe ich das?
    Indem Du keine neue Variable gleichen Namens deklarierst.
    Aus

    garack schrieb:

    VB.NET-Quellcode

    1. Dim Files As Integer = My.Computer.FileSystem.GetFiles(SourcePath, FileIO.SearchOption.SearchAllSubDirectories, "*.*").Count
    machst Du

    VB.NET-Quellcode

    1. Files = My.Computer.FileSystem.GetFiles(SourcePath, FileIO.SearchOption.SearchAllSubDirectories, "*.*").Count
    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!
    Seht schön! Das funktioniert. Allerdings möchte ich nun meine File Anzahl ausgeben durch Label3.Text = Files.

    Files wird auch korrekt berechnet wie ich im Debugg.Modus sehen kann in der backgroundworker Routine 'Choice' . Hier ist der Wert Files korrekt.

    Allerdings ist er die Variable Files ja nur lokal innerhalb der Sub 'Choice' gültig, wenn ich irgendwie Label3.Text = Files aufrufe dann ist files wieder null.

    Wie kann ich files aus dem Sub 'Choice' rausholen?

    innerhalb des subs kann ich files nicht anzeigen lassen da Mutlithreading aufgrund von OLE/COM Limitierung nicht mit UI/GUI Befehlen läuft.

    VB.NET-Quellcode

    1. ​Imports System.IO
    2. Public Class Form1
    3. 'Set Variables
    4. Dim Files As Integer = 0
    5. Dim SourcePath As String
    6. 'End Button
    7. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    8. Close()
    9. End Sub
    10. 'Choose Source
    11. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    12. Label3.Text = Files
    13. Dim ShowFolders As FolderBrowserDialog = New FolderBrowserDialog
    14. ShowFolders.RootFolder = Environment.SpecialFolder.MyComputer
    15. If ShowFolders.ShowDialog = Windows.Forms.DialogResult.OK Then
    16. SourcePath = ShowFolders.SelectedPath
    17. TextBox1.Text = SourcePath
    18. End If
    19. BackgroundWorker1.RunWorkerAsync()
    20. End Sub
    21. 'Choose Destination
    22. Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    23. Dim ShowFolders1 As FolderBrowserDialog = New FolderBrowserDialog
    24. ShowFolders1.RootFolder = Environment.SpecialFolder.MyComputer
    25. If ShowFolders1.ShowDialog = Windows.Forms.DialogResult.OK Then
    26. Dim DestinationPath As String = ShowFolders1.SelectedPath
    27. TextBox2.Text = DestinationPath
    28. End If
    29. End Sub
    30. 'Copy
    31. Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    32. If TextBox1.Text <> Nothing And TextBox2.Text <> Nothing Then
    33. My.Computer.FileSystem.CopyDirectory(TextBox1.Text, TextBox2.Text, showUI:=FileIO.UIOption.AllDialogs)
    34. Else
    35. MessageBox.Show("No Source or Destination Path!")
    36. End If
    37. End Sub
    38. 'Count Files
    39. Private Sub Choice()
    40. Files = My.Computer.FileSystem.GetFiles(SourcePath, FileIO.SearchOption.SearchAllSubDirectories, "*.*").Count
    41. End Sub
    42. 'Background Worker that count files
    43. Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    44. Call Choice()
    45. End Sub
    46. End Class

    garack schrieb:

    Allerdings ist er die Variable Files ja nur lokal innerhalb der Sub 'Choice' gültig
    Falsch - guck in deinen Code: Die Variable ist klassenweit gültig.

    Vlt. aktualisierst du das Label zu früh.
    Darfst du natürlich erst dann aktualisieren, wenn der Thread fertig ist - du verstehst was ich meine?
    EDR: Jou.

    garack schrieb:

    Wie kann ich files aus dem Sub 'Choice' rausholen?
    Haben wir doch gerade gemacht.
    Wenn Du den BackgroundWorker verwendest, kannst Du dessen Event RunWorkerCompleted für genau Deine Zwecke verwenden.
    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!
    Super das klappt auch...bedingt aber das liegt an was anderem: Mein PRG zählt nun die Files und schreibt sie in ein Label; zeigt sogar eine Progressbar an.

    Allerdings klappt das nur mit einer nicht so großen Anzahl an Files. Hab ein Directory mit 50k Files, da kommt dann ein Fehler in Zeile 88:

    In System.ArgumentOutOfRangeException ist eine Ausnahme vom Typ "System.Windows.Forms.dll" aufgetreten, doch wurde diese im Benutzercode nicht verarbeitet.

    Zusätzliche Informationen: Der Wert 49509 ist für Value ungültig. Value sollte zwischen 'minimum' und 'maximum' liegen.


    VB.NET-Quellcode

    1. ProgressBar1.Value = e.ProgressPercentage


    Ein weiterer Fehler kommt wenn ich auf Dokumkente zugreifen will in Zeile 70. Music, und Video geht, aber Eigene Bilder wird verweigert, wobei es diesen Ordner unter documents gar nicht gibt..

    n System.UnauthorizedAccessException ist eine Ausnahme vom Typ "mscorlib.dll" aufgetreten, doch wurde diese im Benutzercode nicht verarbeitet.

    Zusätzliche Informationen: Der Zugriff auf den Pfad "C:\Users\Oliver\Documents\Eigene Bilder" wurde verweigert.


    VB.NET-Quellcode

    1. FileCount = My.Computer.FileSystem.GetFiles(SourcePath, FileIO.SearchOption.SearchAllSubDirectories, "*.*").Count


    Hier der neue Code:

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class Form1
    3. 'Set Variables
    4. Dim FileCount As Integer = 0
    5. Dim SourcePath As String
    6. 'End Button
    7. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    8. Close()
    9. End Sub
    10. 'Choose Source
    11. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    12. Label3.Text = FileCount
    13. Dim ShowFolders As FolderBrowserDialog = New FolderBrowserDialog
    14. ShowFolders.RootFolder = Environment.SpecialFolder.MyComputer
    15. If ShowFolders.ShowDialog = Windows.Forms.DialogResult.OK Then
    16. SourcePath = ShowFolders.SelectedPath
    17. TextBox1.Text = SourcePath
    18. End If
    19. BackgroundWorker1.RunWorkerAsync()
    20. End Sub
    21. 'Choose Destination
    22. Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    23. Dim ShowFolders1 As FolderBrowserDialog = New FolderBrowserDialog
    24. ShowFolders1.RootFolder = Environment.SpecialFolder.MyComputer
    25. If ShowFolders1.ShowDialog = Windows.Forms.DialogResult.OK Then
    26. Dim DestinationPath As String = ShowFolders1.SelectedPath
    27. TextBox2.Text = DestinationPath
    28. End If
    29. End Sub
    30. 'Copy
    31. Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    32. If TextBox1.Text <> Nothing And TextBox2.Text <> Nothing Then
    33. My.Computer.FileSystem.CopyDirectory(TextBox1.Text, TextBox2.Text, showUI:=FileIO.UIOption.AllDialogs)
    34. Else
    35. MessageBox.Show("No Source or Destination Path!")
    36. End If
    37. End Sub
    38. 'Count Files
    39. Private Sub Choice()
    40. FileCount = My.Computer.FileSystem.GetFiles(SourcePath, FileIO.SearchOption.SearchAllSubDirectories, "*.*").Count
    41. End Sub
    42. 'Background Worker that count files via Call Choice
    43. Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    44. Call Choice()
    45. BackgroundWorker1.ReportProgress(FileCount) 'Get Filecount to Progressbar1 via ReportProgress
    46. End Sub
    47. ' Define Progressbar1 as Backgroundworker1 in Percentage
    48. Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
    49. ProgressBar1.Value = e.ProgressPercentage
    50. End Sub
    51. ' If RunWorker is completed then Print Out FileCount
    52. Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    53. Label3.Text = FileCount
    54. End Sub
    55. End Class

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „garack“ ()

    @garack
    1. Wo kommt dier Wert 49509 her?
    2. Zugriff verweigert: Du hast nicht die erforderlichen Rechte, diesen Pfad einzusehen.
      Starte das Programm als Administrator (nicht fragen, sondern im Forum finden!), da hast Du Zugriff auf weitere Verzeichniss, auf alle jedoch nicht.
      Da musst Du Dir die Liste der interessierenden Verzeichnisse holen und das Auslesen dieser mit Try / Catch kapseln, wobei Du explizit diese Exception abfängst.
    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!
    Ok hatte mich vertippt, hier der aktuelle Code mit der korrekten Zeile des Fehlers:

    VB.NET-Quellcode

    1. ProgressBar1.Value = e.ProgressPercentage


    und ein Versuch mit Try/Catch der leider nicht funktioniert. (Bold und invers sollte der Abschnitt sein aber das Forum hat nur die Tags eingefügt..)

    Der Fehler mit zu hoher FileANzahl kommt auch schon mit nur 122 Files in MyDesktop:

    In System.ArgumentOutOfRangeException ist eine Ausnahme vom Typ "System.Windows.Forms.dll" aufgetreten, doch wurde diese im Benutzercode nicht verarbeitet.

    Zusätzliche Informationen: Der Wert 122 ist für Value ungültig. Value sollte zwischen 'minimum' und 'maximum' liegen.

    VB 2013 Studio Express wird als Admin gestartet. Das Problem ist das Verzeichnis C:\Users\Oliver\Documents\Eigene Bilder.

    Es existiert nicht ist wohl nur ein SymbolLink? Eigentlich sollte Try Catch das abfangen macht es auch wenn ich es ohne for/next Schleife laufen lasse, ich will aber natürlich weiter zählen, das geht aber nicht es kommt der gleiche Error:

    In System.UnauthorizedAccessException ist eine Ausnahme vom Typ "mscorlib.dll" aufgetreten, doch wurde diese im Benutzercode nicht verarbeitet.

    Zusätzliche Informationen: Der Zugriff auf den Pfad "C:\Users\Oliver\Documents\Eigene Bilder" wurde verweigert.



    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class Form1
    3. 'Set Variables
    4. Dim FileCount As Integer = 0
    5. Dim SourcePath As String
    6. 'End Button
    7. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    8. Close()
    9. End Sub
    10. 'Choose Source
    11. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    12. Label3.Text = FileCount
    13. Dim ShowFolders As FolderBrowserDialog = New FolderBrowserDialog
    14. ShowFolders.RootFolder = Environment.SpecialFolder.MyComputer
    15. If ShowFolders.ShowDialog = Windows.Forms.DialogResult.OK Then
    16. SourcePath = ShowFolders.SelectedPath
    17. TextBox1.Text = SourcePath
    18. End If
    19. BackgroundWorker1.RunWorkerAsync()
    20. End Sub
    21. 'Choose Destination
    22. Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    23. Dim ShowFolders1 As FolderBrowserDialog = New FolderBrowserDialog
    24. ShowFolders1.RootFolder = Environment.SpecialFolder.MyComputer
    25. If ShowFolders1.ShowDialog = Windows.Forms.DialogResult.OK Then
    26. Dim DestinationPath As String = ShowFolders1.SelectedPath
    27. TextBox2.Text = DestinationPath
    28. End If
    29. End Sub
    30. 'Copy
    31. Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    32. If TextBox1.Text <> Nothing And TextBox2.Text <> Nothing Then
    33. My.Computer.FileSystem.CopyDirectory(TextBox1.Text, TextBox2.Text, showUI:=FileIO.UIOption.AllDialogs)
    34. Else
    35. MessageBox.Show("No Source or Destination Path!")
    36. End If
    37. End Sub
    38. [i][b]'Count Files
    39. Private Sub Choice()
    40. For Each file As String In My.Computer.FileSystem.GetFiles(SourcePath, FileIO.SearchOption.SearchAllSubDirectories, "*")
    41. Try
    42. FileCount = My.Computer.FileSystem.GetFiles(SourcePath, FileIO.SearchOption.SearchAllSubDirectories, "*.*").Count
    43. Catch ex As Exception
    44. End Try
    45. Next
    46. End Sub
    47. [/b][/i]
    48. 'Background Worker that count files via Call Choice
    49. Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    50. Call Choice()
    51. BackgroundWorker1.ReportProgress(FileCount) 'Get Filecount to Progressbar1 via ReportProgress
    52. End Sub
    53. ' Define Progressbar1 as Backgroundworker1 in Percentage
    54. Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
    55. ProgressBar1.Value = e.ProgressPercentage
    56. End Sub
    57. ' If RunWorker is completed then Print Out FileCount
    58. Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    59. Label3.Text = FileCount
    60. End Sub
    61. End Class

    garack schrieb:

    Der Fehler mit zu hoher FileANzahl
    Wer oder was limitiert diesen Wert?

    RodFromGermany schrieb:

    Wo kommt diser Wert 49509 her?
    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!

    garack schrieb:

    Der Wert 122 ist für Value ungültig. Value sollte zwischen 'minimum' und 'maximum' liegen.
    Da gibts doch gar nichts zum drüber nachdenken.
    Wenn ein Fehler kommt, und meldet, der Wert sei ausserhalb von Minimum - Maximum, dann liegt das daran, dass der Wert ausserhalb von Minimum - Maximum ist.
    Denk mal nach: Welches Minimum / Maximum könnte gemeint sein?
    Und schau beim Denken die Fehlerzeile an:

    VB.NET-Quellcode

    1. ProgressBar1.Value = e.ProgressPercentage
    Der Wert wird limitiert durch den Datentyp der Variable FileCount welche als Integer also von -2.147.483.648 bis einschließlich 2.147.483.647 definiert ist. Sollte doch reichen?

    Aber stimmt der Min/Max Wert..

    msdn.microsoft.com/de-de/libra…cs-lang=vb#code-snippet-1

    Mit:

    VB.NET-Quellcode

    1. ProgressBar1.Maximum = 100000
    geht es!

    Finde es Super dass ihr richtig "Unterricht" gebt, also nicht alles vorkaut sondern mich selber grübeln lässt und Tipps gebt, so lerne ich gut, Danke !

    Nun ist meine Progressbar bei wenigen Files nicht zu sehen weil Max so groß ist, aber das werde ich wohl hinbekommen. Irgend eine Formel/Operation. Mal sehen.

    Ein anderes Problem ist das die Progressbar sich erst NACH dem zählen füllt nicht während...

    Aber das Problem mit dem

    In System.UnauthorizedAccessException ist eine Ausnahme vom Typ "mscorlib.dll" aufgetreten, doch wurde diese im Benutzercode nicht verarbeitet.Zusätzliche Informationen: Der Zugriff auf den Pfad "C:\Users\Oliver\Documents\Eigene Bilder" wurde verweigert.


    besteht weiter trotz dem Versuch diesen Fehler abzufagen mit:

    'Count Files

    Private Sub Choice()
    For Each file As String In My.Computer.FileSystem.GetFiles(SourcePath, FileIO.SearchOption.SearchAllSubDirectories, "*")
    'Try
    FileCount = My.Computer.FileSystem.GetFiles(SourcePath, FileIO.SearchOption.SearchAllSubDirectories, "*.*").Count
    Catch ex As Exception

    End Try
    Next

    End Sub

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

    garack schrieb:

    geht es!
    Bei der nächsten Überschreitung geht es nicht mehr.
    Die Frage

    RodFromGermany schrieb:

    Wo kommt diser Wert 49509 her?
    ist noch nicht beantwortet :!:
    Was bitte ganz genau wird da wem zugewiesen?
    Und bitte nicht "Ein Wert", sondern z.B.
    - Ein Progressionswert im Bereich von 0 bis 100,
    - eine Dateilänge im Bereich von 0 bis Long.MaxValue
    oder so.
    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!
    Der Variable FileCount welche mit

    VB.NET-Quellcode

    1. Dim FileCount As Integer = 0
    also Null als Integer Wert definiert ist wird durch

    VB.NET-Quellcode

    1. FileCount = My.Computer.FileSystem.GetFiles(SourcePath, FileIO.SearchOption.SearchAllSubDirectories, "*.*").Count


    GetFiles im namespace My die Anzahl der Files zugewiesen. Dieser Wert erhöht sich um 1 wenn ein neues Files gezählt wird. Wüsste nicht mehr darüber zu sagen.

    Übrigens zeigt die Progressbar in Echtzeit an wenn ich sagen wid 122 Files gezählt werden. Aber bei 50k files zeigt sie nichts an, so lange bis das Zählen beendet ist. Dann geht sie animiert in 1 Sekunde nach recht. Zeigt also nicht in Echtzeit an.
    Hi,

    /* die Progressbar ist nicht in Echtzeit, da die Methode die Oberfläche blockiert und du auch merken solltest, dass du nicht machen kannst, solange die Operation läuft,
    also kannst du ja dieses Tutorial verwenden, um asynchron zu arbeiten, um damit die Oberfläche zu "entlasten":
    Async, Await und Task */
    => Unnötig, da BackgroundWorker, aber ist gut zu wissen, wie man asynchron arbeitet :D

    Außerdem gibt es etwas schöneres als den My.Computer.FileSystem-Namespace, nämlich den System.IO-Namespace, der den gleichen Sinn hat, aber der My-Namespace macht alles eigentlich nur umständlicher.

    EDIT: Auskommentiert.
    ~ Alex-Digital :D

    if(!Internet.VBP.Get<User>("Alex-Digital").IsOnline) this.Close(); :D
    Ok danke Alex, werde mir das mal anschauen. Habe den Code nun erweitert und es läuft auch alles, aber immer noch kann ich nicht auf mydocuments zugreifen (wie oben beschrieben).
    Auch laufen die Fortschrittsbalken erst wenn das Kopieren oder Zählen fertig durch...Warum?

    Und ich habe nun eine Chekbox eingebaut die das überschreiben von Files möglich macht, das geht auch.

    Aber wenn ich sie nicht Checke kommt ein Fehler, da er nicht kopieren kann. Gut den Habe ich unterbunden, und eine Fehlermeldung ausgeben lassen.
    Nun muss ich aber gleichzeitig den backgroundworker2 beenden sonst kommt ein "Fertig" und der Fortschrittsbalken läuft durch.

    Das versuche ich mit

    VB.NET-Quellcode

    1. BackgroundWorker2.CancelAsync()
    , scheint aber nicht zu gehen, denn der Balken läuft durch und ein Fertig erscheint.

    hier frage ich den Wert des cancelns ab:

    VB.NET-Quellcode

    1. Private Sub BackgroundWorker2_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker2.RunWorkerCompleted
    2. If BackgroundWorker2.CancellationPending = True Then 'laut debugger ist der false..
    3. Label8.Text = "Abgebrochen"
    4. End If
    5. Label8.Text = "Fertig"
    6. End Sub


    Wenn ich mit den Wert im Debugger abfrage kommt hier auch false raus d.h. der Worker wurde nicht beenden. Also funktioniert BackgroundWorker2.CancelAsync() nicht...

    Sorry für die vielen Fragen, aber oft kann Dr.Google nicht weiterhelfen außerdem beschäftige ich mich erst sei4 Tage mit VB, hatte vorher noch nie programmiert.


    VB.NET-Quellcode

    1. ​Imports System.IO
    2. Public Class Form1
    3. 'Set Variables
    4. Dim FileCount As Integer = 0
    5. Dim SourcePath As String
    6. Dim ovrWrite As Boolean = False
    7. 'End Button
    8. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    9. Close()
    10. End Sub
    11. 'Choose Source
    12. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    13. Label3.Text = FileCount
    14. Dim ShowFolders As FolderBrowserDialog = New FolderBrowserDialog
    15. ShowFolders.RootFolder = Environment.SpecialFolder.MyComputer
    16. If ShowFolders.ShowDialog = Windows.Forms.DialogResult.OK Then
    17. SourcePath = ShowFolders.SelectedPath
    18. TextBox1.Text = SourcePath
    19. End If
    20. Label5.Text = "Counting FIles"
    21. ' Control.CheckForIllegalCrossThreadCalls = False
    22. BackgroundWorker1.RunWorkerAsync()
    23. End Sub
    24. 'Choose Destination
    25. Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    26. Dim ShowFolders1 As FolderBrowserDialog = New FolderBrowserDialog
    27. ShowFolders1.RootFolder = Environment.SpecialFolder.MyComputer
    28. If ShowFolders1.ShowDialog = Windows.Forms.DialogResult.OK Then
    29. Dim DestinationPath As String = ShowFolders1.SelectedPath
    30. TextBox2.Text = DestinationPath
    31. End If
    32. End Sub
    33. 'Copy
    34. Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    35. If TextBox1.Text <> Nothing And TextBox2.Text <> Nothing Then
    36. BackgroundWorker2.RunWorkerAsync()
    37. Else
    38. MessageBox.Show("No Source or Destination Path!")
    39. End If
    40. End Sub
    41. 'Count Files
    42. Private Sub Choice()
    43. 'For Each folder As String In My.Computer.FileSystem.GetFiles(SourcePath, FileIO.SearchOption.SearchAllSubDirectories, "*")
    44. 'Try
    45. FileCount = My.Computer.FileSystem.GetFiles(SourcePath, FileIO.SearchOption.SearchAllSubDirectories, "*.*").Count
    46. 'Catch ex As Exception
    47. 'End Try
    48. 'Next
    49. End Sub
    50. 'Copy Files
    51. Private Sub Copy()
    52. Try
    53. My.Computer.FileSystem.CopyDirectory(TextBox1.Text, TextBox2.Text, overwrite:=ovrWrite) 'Copy Routine
    54. Catch ex As Exception
    55. MessageBox.Show("Files Overweite Error! Check Overwrite Files if you want.")
    56. BackgroundWorker2.CancelAsync() 'Hier muss der Backgroundworker gestoppt werden, wird aber nicht?
    57. End Try
    58. End Sub
    59. ' Backgroundworker Tasks: ------------------------------------------------------------------------------------------------
    60. 'Background1 Worker that count files via Call Choice
    61. Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    62. Call Choice()
    63. BackgroundWorker1.ReportProgress(FileCount) 'Get Filecount to Progressbar1 via ReportProgress
    64. ' Label3.Refresh() ' refresh label3 but a thread error comes up can catched with line 34 but dont work
    65. End Sub
    66. ' Define Progressbar1 as Backgroundworker1
    67. Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
    68. ProgressBar1.Maximum = FileCount 'maximum ist die Anazahl der Files
    69. ProgressBar1.Value = e.ProgressPercentage
    70. Label3.Text = FileCount
    71. End Sub
    72. ' If RunWorker1 is completed then Print Out FileCount
    73. Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    74. Label3.Text = FileCount
    75. Label5.Text = ""
    76. End Sub
    77. ' Backgroundworker2 Start File Copy
    78. Private Sub BackgroundWorker2_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker2.DoWork
    79. Call Copy()
    80. BackgroundWorker2.ReportProgress(FileCount)
    81. End Sub
    82. ' Define Progressbar2 as Backgroundworker2
    83. Private Sub BackgroundWorker2_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker2.ProgressChanged
    84. ProgressBar2.Maximum = FileCount ' maximale Progressbar soll Anzahl der Files sein
    85. ProgressBar2.Value = e.ProgressPercentage
    86. End Sub
    87. ' Backgroundworker2 Ende Dann Print Fertig
    88. Private Sub BackgroundWorker2_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker2.RunWorkerCompleted
    89. If BackgroundWorker2.CancellationPending = True Then 'laut debugger ist der false..
    90. Label8.Text = "Abgebrochen"
    91. End If
    92. Label8.Text = "Fertig"
    93. End Sub
    94. Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged
    95. ovrWrite = True
    96. End Sub
    97. End Class
    Wie kann die

    garack schrieb:

    die Anzahl der Files
    eine System.ArgumentOutOfRangeException auslösen?
    Da ist doch Dein Design iwie daneben.
    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!