Anti Virus

Status
Niet open voor verdere reacties.

JibbeDz

Gebruiker
Lid geworden
23 sep 2013
Berichten
15
Hallo,

ik krijg een error omdat ik niet genoeg toegang heb om door mappen te scannen dit is mijn code

Code:
Private Sub full_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles full.DoWork
        System.Threading.Thread.Sleep(15000)
        Dim drname As String
        For Each drive As IO.DriveInfo In IO.DriveInfo.GetDrives
            If drive.IsReady Then
                drname = drive.Name
                For Each File In System.IO.Directory.GetFiles(drname, "*", SearchOption.AllDirectories)
                    Dim fs As New FileInfo(File)
                    TextBox4.Text = mdsc(fs.FullName)
                    TextBox4.Text = shsc(fs.FullName)
                    Label4.Text = fs.FullName
                    Label5.Text += 1
                    If TextBox1.Text.Contains(TextBox4.Text) Then
                        Label10.Text = fs.FullName
                    End If
                    ProgressBar1.Value = Label5.Text
                Next

            End If
        Next
    End Sub

de error is in For Each File In System.IO.Directory.GetFiles(drname, "*", SearchOption.AllDirectories)
en houd in:
System.UnauthorizedAccessException was unhandled by user code
HResult=-2147024891
Message=Access to the path 'C:\$Recycle.Bin\S-1-5-21-1775725311-3999192811-938221265-500' is denied.
Source=mscorlib
StackTrace:
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileSystemEnumerableIterator`1.AddSearchableDirsToStack(SearchData localSearchData)
at System.IO.FileSystemEnumerableIterator`1.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.IO.Directory.GetFiles(String path, String searchPattern, SearchOption searchOption)
at MYAV2._0.Form1.full_DoWork(Object sender, DoWorkEventArgs e) in C:\Users\Jibbe\Downloads\MYAV2.0\MYAV2.0\MYAV2.0\Form1.vb:line 135
at System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs e)
at System.ComponentModel.BackgroundWorker.WorkerThreadStart(Object argument)
InnerException:
 
Laatst bewerkt door een moderator:
Pas je bericht aan en plaats CODE tags rond je code, dat maakt het wat leesbaarder.

De map C:\$Recycle.Bin\ is een verborgen Windows map waar je normaal gesproken niets te zoeken hebt, maar ondanks dat kan die map wel gevonden worden als je bijvoorbeeld door alle folder op C: loopt, wat jij dus doet, en aangezien je dus geen toegang hebt tot deze map, krijg je een exception.

Wat je kan doen is je hele For Each blok in een Try...Catch blok zetten, en dan in het Catch block de regel Continue For te zetten.
Dit zou ervoor moeten zorgen dat je For Each loop verder gaat wanneer er een fout optreed.
Dit heb ik niet getest, maar volgens mij moet dat zo wel werken.

Eventueel kun je in het Catch blok ook nog wat code plaatsen dat de exception details in een TextBox, ListBox of wat dan ook laat zien, of je laat het naar een tekstbestandje schrijven.
 
Je hoeft je vraag niet twee keer te plaatsen, een druk op de knop meld misbruik is voldoende om je vraag verplaatst te krijgen. Je vraag in de VBA sectie is gesloten. Bovendien wordt de aanhef "hey" niet gewaardeerd. Tevens dient code tussen codetags geplaatst te worden.
 
Hallo bedankt voor je reply je bedoeld dit?
Code:
    Private Sub full_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles full.DoWork
        System.Threading.Thread.Sleep(15000)
        Dim drname As String
        For Each drive As IO.DriveInfo In IO.DriveInfo.GetDrives
            If drive.IsReady Then
                drname = drive.Name
                Try
                    For Each File In System.IO.Directory.GetFiles(drname, "*", SearchOption.AllDirectories)
                    Next
                Catch ex As Exception
                    Continue For
                End Try
                Dim fs As New FileInfo(File)
                TextBox4.Text = mdsc(fs.FullName)
                TextBox4.Text = shsc(fs.FullName)
                Label4.Text = fs.FullName
                Label5.Text += 1
                If TextBox1.Text.Contains(TextBox4.Text) Then
                    Label10.Text = fs.FullName
                End If
                ProgressBar1.Value = Label5.Text
            End If
        Next
    End Sub
Jammer genoeg werkt dit ook niet omdat hij zegt bij deze code
Code:
Dim fs As New FileInfo(File)
'file' is a type and can not be used as an expression
Zou je me met dat verder willen helpen?
 
Laatst bewerkt door een moderator:
@JibbeDz Ik heb aangegeven dat de aanhef "hey" niet gewaardeerd wordt op Helpmij. Mijn advies, doe wat met deze info. Wederom reactie van je aangepast.
 
Omdat File al een bestaand type is in System.IO. Verander File in foundFile of iets dergelijks.

En die Next onder For Each.. is volgens mij niet nodig.
 
Laatst bewerkt:
Hallo, bedankt voor het beantwoorden. Ik snap je antwoord niet helemaal denk ik :(. ik krijg die Next niet onder bij de end sub en foundfile als fileinfo (andere dingetjes werken ook niet :o)
Bedankt voor het helpen al zo ver ;)
 
Laatst bewerkt door een moderator:
;D, maar hoe moet het nu verder met
Code:
im fs As New FileInfo(File)
 
Laatst bewerkt door een moderator:
@JibbeDz Onnodige quotes verwijderd. Wanneer je direct reageert op een reactie is het niet nodig om dat bericht te quoten. Onnodig quoten heet dat, hetgeen niet gewenst is.
 
Hoi,

Op dat moment 'kent' het programma de variable "File" nog niet, omdat die in de loop staat die in het try-blok staat.

Probeer dit eens:
[CPP] Private Sub full_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles full.DoWork
System.Threading.Thread.Sleep(15000)
Dim drname As String
For Each drive As IO.DriveInfo In IO.DriveInfo.GetDrives
If drive.IsReady Then
drname = drive.Name
Try
For Each File1 In System.IO.Directory.GetFiles(drname, "*", SearchOption.AllDirectories)
Dim fs As New FileInfo(File1)
TextBox4.Text = mdsc(fs.FullName)
TextBox4.Text = shsc(fs.FullName)
Label4.Text = fs.FullName
Label5.Text += 1
If TextBox1.Text.Contains(TextBox4.Text) Then
Label10.Text = fs.FullName
End If
ProgressBar1.Value = Label5.Text
Next
Catch ex As Exception
Continue For
End Try
End If
Next
End Sub[/CPP]

Volgens mij zou dat moeten werken.

Succes!
MartinJM
 
Hallo, bedankt voor je reply het werkte inderdaad alleen bleef hangen na +/- 5 files hij begon met mijn disk:
Code:
    Private Sub Progbar_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles Progbar.DoWork
        Dim drname As String
        If Label8.Text = "Quick" Then
            Dim i As Integer = 0
            Label4.Text = "Processing"
            Dim size As Double = 0
            For i = 1 To 3
                Dim di As New DirectoryInfo(path(i))
                For Each File In System.IO.Directory.GetFiles(path(i), "*", SearchOption.AllDirectories)
                    Label6.Text += 1
                    ProgressBar1.Maximum = Label6.Text
                Next
            Next
        ElseIf Label8.Text = "Full" Then
        End If

        For Each drive As IO.DriveInfo In IO.DriveInfo.GetDrives
            If drive.IsReady Then
                drname = drive.Name
                For Each File In System.IO.Directory.GetFiles("E:", "*", SearchOption.AllDirectories)
                    Label6.Text += 1
                    ProgressBar1.Maximum = Label6.Text
                Next
            End If
        Next

        Exit Sub
    End Sub
E:\ is mijn disk. dus dacht ik ik doe dit stuk
Code:
        For Each drive As IO.DriveInfo In IO.DriveInfo.GetDrives
            If drive.IsReady Then
                drname = drive.Name
                For Each File In System.IO.Directory.GetFiles("E:", "*", SearchOption.AllDirectories)
                    Label6.Text += 1
                    ProgressBar1.Maximum = Label6.Text
                Next
            End If
        Next
'en Dim drname As String
weg maar dan doet hij helemaal niks meer

bedankt in ieder geval tot hier
 
Laatst bewerkt door een moderator:
@JibbeDz Onnodige quotes verwijderd. Wanneer je direct reageert op een reactie is het niet nodig om dat bericht te quoten. Onnodig quoten heet dat, hetgeen niet gewenst is.
Oh, ik moet dus reageren zonder dat ik reageer op die persoon :o
 
Hoi,

Doorgaans quote je niet tenzij het echt nodig is. Ook dan quote je alleen het deel waarop je reactie is.
Als je nog een toevoeging hebt aan je laatste bericht kan je onderaan dat bericht de 'edit'-knop gebruiken (mits er geen reactie geweest is). Dan hoef je geen nieuw bericht te plaatsen.

Ik zou voor je disk dit proberen:
[CPP] For Each drive As IO.DriveInfo In IO.DriveInfo.GetDrives
If drive.IsReady Then
drname = drive.Name
For Each File In System.IO.Directory.GetFiles(drname, "*", SearchOption.AllDirectories)
Try
Label6.Text += 1
ProgressBar1.Maximum = Label6.Text
Catch ex As Exception
Continue For
End Try
Next
End If
Next[/CPP]

Let wel op dat deze code ook alle harde schijven gaat checken.

De fout zat 'm waarschijnlijk in de "E:", wat dan "E:\" zou moeten zijn. Ik heb dat niet geprobeerd omdat de bovenstaande code bij mij werkte, maar dat is mijn gok.

MartinJM
 
Dus wat ik dus nu doe is fout ^^? ik moet dat gedeelte verwijderen?
Maar even

Code:
  For Each drive As IO.DriveInfo In IO.DriveInfo.GetDrives
            If drive.IsReady Then
                drname = drive.Name
                For Each File In System.IO.Directory.GetFiles("E:\", "*", SearchOption.AllDirectories)
                    Label6.Text += 1
                    ProgressBar1.Maximum = Label6.Text
                Next
            End If
        Next

        Exit Sub
werkt niet omdat hij dat zegt IO.apperaat is niet klaar
dus ik heb jouw code geprobeerd maar dat werkt niet omdat je dan weer geen toegang tot recycle bin heb dus dacht ik ik doe the try-catch-end try tussen the for each dus dan krijg ik dit:
Code:
        For Each drive As IO.DriveInfo In IO.DriveInfo.GetDrives
            If drive.IsReady Then
                drname = drive.Name
                Try
                    For Each File In System.IO.Directory.GetFiles(drname, "*", SearchOption.AllDirectories)
                    Next
                Catch ex As Exception
                    Continue For
                End Try
                Label6.Text += 1
                ProgressBar1.Maximum = Label6.Text

            End If
        Next

        Exit Sub
maar nu gebeurt er weer niks :/
 
Laatst bewerkt door een moderator:
Hoi,

In de eerste code die ik je gaf zat toch nog een (grote) fout: Door de "continue for" zal de code bij een error gelijk naar de volgende disk gaan... Maar die kan je er niet zomaar uit halen, want dan zal het niet meer werken.

Ik denk dus dat je een splitsing moet gaan maken tussen de mappen en bestanden. Dan kan je namelijk één map overslaan, wat nu niet gaat.

Ik ga straks wel even kijken of ik een code in elkaar kan knutselen die het trucje doet.

MartinJM

[edit]
Dus wat ik dus nu doe is fout ^^? ik moet dat gedeelte verwijderen?
Ja, dat is dus niet de bedoeling. Je kan het zelf verwijderen door rechtsonder in je post op "bericht aanpassen" te drukken en het te verwijderen.
[/edit]
 
Laatst bewerkt:
Dus zo moet ik dus antwoorden ;)?
In ieder geval bedankt ik zal wachten op een nieuwe reply ;D
 
Hoi,

Zo beantwoord je inderdaad zoals gebruikelijk op dit forum.

Ik heb nu een code, maar ik ben nu eerst nog even aan het kijken of hij inderdaad werkt. Morgen heb ik helaas geen tijd, dus als ik het vandaag niet af krijg wordt het waarschijnlijk zaterdag.

MartinJM

[edit]
Ik heb het toch af gekregen. Ik heb het een soort van voorbeeld gemaakt, je moet zelf even kijken wat je eruit wil gebruiken (Ik heb het onder andere ge-multi-threaded). De controls op het form zijn simpel: een button, een listview en een progressbar. De progressbar gaat niet helemaal netjes, maar dat komt omdat je pas weet hoeveel mappen er zijn als je klaar bent. Ook komen de mappen niet helemaal netjes op volgorde eruit.

Ook ben ik er niet 100% zeker van dat alle mappen eruit komen, aangezien ik niet weet hoeveel mappen ik precies op mijn computer heb. Het zijn er volgens het programma 165973 ;)

Dan is hier de code:
[/edit]
[CPP]Imports System.IO
Imports System.Threading

Public Class Form1

''//Delegate subs zijn voor het multithreaden
Delegate Sub DelListviewAddItem(ByVal Item As String)
Delegate Sub DelSetProgressbar(ByVal Max As Integer, ByVal Value As Integer)

''//Hier maak ik alvast de thread aan zodat die door de hele form te gebruiken is
Private Thr As Thread = Nothing
''//Hier maak ik een variable aan die bepaald of de thread zichzelf af moet sluiten
Private ThrAlive As Boolean = False

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
''//Hier check ik wat er in de button staat. Bij "start" moet de thread gestart worden, bij "stop" moet de thread gestopt worden
If Button1.Text = "Start" Then
''//De listview leeg maken, bij het opnieuw beginnen moet de listview eerst leeg, anders krijg je dubbele
ListView1.Items.Clear()
''//De thread opnieuw aanmaken
Thr = New Threading.Thread(AddressOf Thread)
''//De button tekst op "Stop" zetten
Button1.Text = "Stop"
''//ThrAlive op True zetten zodat de thread niet meteen afsluit
ThrAlive = True
''//De thread ook werkelijk starten
Thr.Start()
ElseIf Button1.Text = "Stop" Then
''//Kijken of de thread al gemaakt is
If Not Thr Is Nothing Then
''//Kijken of de thread bezig is (beide zijn tegen fouten)
If Thr.IsAlive Then
''//ThrAlive op False zetten zodat de thread afsluit
ThrAlive = False
''//De button tekst aanpassen zodat de thread opnieuw gestart kan worden
Button1.Text = "Start"
End If
End If
End If
End Sub

Private Sub Thread()
''//Alle drives in een variable zetten
Dim Drives() As DriveInfo = DriveInfo.GetDrives
''//Een list maken waar alle folders in komen te staan als de thread klaar is
Dim Folders As New List(Of String)
''//Loopen door alle drives
For i As Integer = 0 To Drives.Count - 1 Step 1
''//Kijken of de drive klaar is
If Drives(i).IsReady Then
''//Een lijst maken met mappen die nog gechecked moeten worden
Dim FoldersToCheck As New List(Of String)
''//Een lijst maken met de mappen die toegankelijk zouden moeten zijn
Dim CheckedFolders As New List(Of String)
''//Alle folders in de RootDirectory van de drive in de FoldersToCheck lijst zetten
FoldersToCheck.AddRange(Directory.GetDirectories(Drives(i).Name, "*", SearchOption.TopDirectoryOnly))
''//Een counter maken om te kijken bij welk nummer we zijn in de lijst FoldersToCheck
Dim Counter As Integer = 0
''//Een counter maken zodat de loop ophoudt als de hele lijst gechecked is
Dim Maximum As Integer = FoldersToCheck.Count

''//Loopen totdat de hele lijst gechecked is (een for loop, maar zo kan je meer aanpassen)
Do Until Counter >= Maximum
''//Een try-block om alle fouten af te vangen
Try
''//De nieuw te checken map in een variable zetten
Dim CurrentFolder As String = FoldersToCheck(Counter)
''//Alle submappen van de map in een variable zetten
Dim SubDirs() As String = Directory.GetDirectories(CurrentFolder, "*", SearchOption.TopDirectoryOnly)
''//Het maxima verhogen met het aantal mappen wat nu ook nog gechecked moet worden
Maximum += SubDirs.Count
''//Alle gevonden mappen toevoegen aan de lijst FoldersToCheck zodat die ook nog gechecked worden voor submappen
FoldersToCheck.AddRange(SubDirs)
''//De map die gecontroleerd is op submappen in de lijst zetten met gecontroleerde mappen
CheckedFolders.Add(CurrentFolder)
''//De gecontroleerde map gelijk toevoegen aan de listbox (kan niet zomaar vanwege de thread)
ListviewAddItem(CurrentFolder)
Catch ex As UnauthorizedAccessException
''//Alleen UnauthorizedAccessExceptions afvangen zodat andere errors apart behandeld kunnen worden
Catch ex As Exception
''//Bij het afsluiten van de thread kreeg ik een foutmelding, maar zo wordt alleen die eruit gefilterd (hij was niet belangrijk)
If Not Thr.IsAlive Then
''//De rest van de fouten weergeven
MsgBox("Error: " & vbNewLine & ex.Message)
End If
Finally
''//De counter moet altijd met 1 verhoogd worden, ook als er een fout is opgetreden, anders blijft hij in dezelfde map hangen
Counter += 1
''//De progressbar moet ook altijd bijgewerkt worden (kan niet zoals normaal vanwege de thread)
SetProgressbar(Maximum, Counter)
End Try

''//Als de variable ThrAlive False is dan moet de For-loop afgesloten worden zodat de thread verder wel netjes kan sluiten
If Not ThrAlive Then
''//Uit de for-loop springen
Exit For
End If
Loop

''//Alle gecheckte mappen in de lijst Folders zetten
Folders.AddRange(CheckedFolders)
End If
Next

''//In de variable Folders staan alle mappen.

''//De thread netjes afsluiten (de progressbar op 0 zetten en de button een andere tekst geven)
ThreadDone()
End Sub

Private Sub ListviewAddItem(ByVal Item As String)
''//Als er een invoke nodig is, dan invoken (heeft met threading te maken)
If InvokeRequired Then
''//invoken
Dim d As New DelListviewAddItem(AddressOf ListviewAddItem)
Me.Invoke(d, New Object() {Item})
Else
''//Het item aan de listview toevoegen
ListView1.Items.Add(Item)
End If
End Sub

Private Sub SetProgressbar(ByVal Max As Integer, ByVal Value As Integer)
''//Als er een invoke nodig is, dan invoken (heeft met threading te maken)
If InvokeRequired Then
''//Invoken
Dim d As New DelSetProgressbar(AddressOf SetProgressbar)
Me.Invoke(d, New Object() {Max, Value})
Else
''//Progressbar maximum zetten op het aantal gevonden mappen
ProgressBar1.Maximum = Max
''//Progressbar value zetten op het aantal gecheckte mappen
ProgressBar1.Value = Value
End If
End Sub

Private Sub ThreadDone()
''//Als er een invoke nodig is, dan invoken (heeft met threading te maken)
If InvokeRequired Then
''//Invoken (gaat hier makkelijker omdat er geen variablen zijn)
Me.Invoke(New MethodInvoker(AddressOf ThreadDone))
Else
''//Button tekst op "Stop" zetten
Button1.Text = "Start"
''//Progressbar op 0 zetten
ProgressBar1.Value = 0
End If
End Sub

Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
''//Dit sluit het programma gelijk af. Het stopt alles meteen. Het is eigenlijk netter om het anders te doen
End
End Sub
End Class
[/CPP]
 
Laatst bewerkt:
ik denk dat ik niet zo goed in vb.net ben :shocked: . het werk wel voor zover ik weet maar ik weet niet wat het betekent :eek: . Dus is mijn vraag hoe scan je nu deze files met jouw code of nog beter is er nog een oplossing hoe ik met mijn oude code verder kan?

Ik wil je heel erg bedanken dat je me tot hier al heb geholpen en allemaal tijd erin hebt gestoken
 
Hoi,

Ik heb in mijn code overal uitgelegd waarvoor het is, zodat je het misschien beter kan begrijpen. Ik maak gebruik van multithreading zodat het programma niet 'bevriest' als hij aan het scannen is. Het nadeel daarvan is dat je niet meer zomaar controls op het form aan kan passen, maar dan moet je 'invoken'. Ik heb het grootste deel van mijn kennis over multithreaden van msdn: http://msdn.microsoft.com/en-us/library/eed6swsx(v=vs.90).aspx.

Hoe je de files zelf gaat scannen weet ik niet. Ik heb zelf nog nooit een virus scanner gebouwd, maar wat ik ervan weet is dat je de codes in de bestanden vergelijkt met een database met bekende virussen erin (of alleen stukjes van virussen waaraan je kan zien dat het een virus is). Een virus scanner bouwen kost veel tijd en hij moet ook constant bijgehouden worden, vandaar dat ik er nooit de tijd voor heb genomen.

Het scannen van bestanden zou ik persoonlijk ergens binnen de thread doen. Misschien ook wel met een aparte thread (zou wel ingewikkeld worden). Het makkelijkst is denk ik om de 'CurrentFolder' te scannen bij lijn 77 in mijn voorbeeld.

Ik hoop dat ik je hiermee nog een eind verder op weg heb geholpen.

MartinJM
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan