Op heel de schijf zoeken naar 1 Bestand.

Status
Niet open voor verdere reacties.

Schippertje

Gebruiker
Lid geworden
20 jul 2011
Berichten
64
Hallo,


Heb een tijdje geleden gevraagd naar zoeken op meerdere locatie's.
Maar nou zou ik het graag zo willen instellen, dat die zoekt op bijv een schijf naar 1 bestand.
Ik gebruik nu deze code.

Code:
Dim AppExcel As Object
        Dim workBook As Object
        AppExcel = CreateObject("Excel.Application")
        If System.IO.File.Exists("D:\Schippertje\Map1\Doc.xlsx") Then
            workBook = AppExcel.Workbooks.Open("D:\Schippertje\Map1\Doc.xlsx")
        Else
            workBook = AppExcel.Workbooks.Open("C:\Schippertje\Map1\Doc.xlsx")
        End If
        AppExcel.Visible = False

        Worksheets = workBook.worksheets
        Worksheets("Blad1").Cells(1, 1).value = TextBox1.Text
        Worksheets("Blad1").PrintOut()

        workBook.Saved = True
        AppExcel.Quit()

    End Sub


Kan iemand me hier mee helpen?

Grt Schippertje
 
Kan je hier wat mee?

Code:
Dim gevonden As Boolean = False

        For Each Folder In New IO.DirectoryInfo("C:\").GetDirectories

            For Each File As IO.FileInfo In New IO.DirectoryInfo(Folder.FullName).GetFiles("*.*", IO.SearchOption.AllDirectories)
                On Error Resume Next

                If File.Name = "bestandsnaam" Then
                    MsgBox(File.Name & " is gevonden in: " & Folder.FullName)
                    gevonden = True
                End If
            Next

            On Error Resume Next
        Next

        If gevonden = False Then
            MsgBox("De file is niet gevonden.")
        Else
            MsgBox("Klaar met zoeken!")
        End If

Deze code checkt alle files WAARVOOR HET RECHTEN HEEFT op de "C:\" schijf.

Met hulp van The Mighty Atom: Originele code van The Mighty Atom

Succes!:thumb:
 
Dit is nou de code die ik gebruik.


Code:
Dim AppExcel As Object
        Dim workBook As Object
        AppExcel = CreateObject("Excel.Application")
        Dim gevonden As Boolean = False

        For Each Folder In New IO.DirectoryInfo("C:\").GetDirectories

            For Each File As IO.FileInfo In New IO.DirectoryInfo(Folder.FullName).GetFiles("*.*", IO.SearchOption.AllDirectories)
                On Error Resume Next

                If File.Name = "doc.xlsx" Then
                    MsgBox(File.Name & " is gevonden in: " & Folder.FullName)
                    gevonden = True
                End If
            Next

            On Error Resume Next
        Next

        If gevonden = False Then
            MsgBox("De file is niet gevonden.")
        Else
            MsgBox("Klaar met zoeken!")
        End If
        AppExcel.Visible = False

        Worksheets = workBook.worksheets
        Worksheets("Blad1").Cells(1, 1).value = TextBox1.Text
        Worksheets("Blad1").PrintOut()

        workBook.Saved = True
        AppExcel.Quit()

    End Sub

Alleen ik krijg nu een error, hij zegt dat ie niet toegang krijgt tot een bepaald bestand.


naamlooszv.jpg


Volgens mij werkt het voor de rest prima alleen omdat ik die error krijg gaat ie niet veder met zoeken naar het opgegeven bestand, dus kan ik niet zien of die werkt.
 
Vreemd, met On Error Resume Next zou die gewoon verder moeten gaan met de volgende file.
Of $Recycle.Bin moet een uitzondering zijn.

En weet je dat je, nadat het bestand gevonden is, je For Each loop nog door gaat met zoeken? Je kunt beter uit de For Each loop stappen zodra het bestand gevonden is omdat het geen zin meer heeft nog verder te zoeken naar het bestand.
Om uit de For Each loop te stappen zet je Exit For onder gevonden = true. Mogelijk moet je Exit For ook plaatsen onder Next en boven On Error Resume Next omdat deze loop (de For Each Folder loop) waarschijnlijk nog wel door loopt maar dat weet ik niet zeker, één Exit For statement is mogelijk al voldoende.
 
Laatst bewerkt:
Heb het geprobeerd wat je verteld hebt, maar ik stuit nog steeds op de zelfde melding dat ie niet toegang krijgt tot Recycle.Bin.
Volgens mij loopt ie niet meer door met zoeken als die melding is gekomen, want dan geeft ie aan dat het programma "niet reageert"
En hij heeft het bestand ook nog niet gevonden voordat die de melding weer geeft, want dan zou die al gaan moeten printen en dat doet ie niet.
Maar als ik hem in een andere map laat zoeken dan doet het veder wel, dan vindt ie wel het bestand alleen dan gaat ie het niet uitprinten, dan zit ik daar nog mee.
Maarja het mooiste zou zijn dat ie op de hele C schijf gaat zoeken.
kzal nog eens ff veder prutsen
 
Misschien kun je zoiets doen:

PDEUDO CODE:

Code:
If Not Folder = "C:\System Volume Information" Or Not Folder = "C:\$Recycle.Bin" Then
'Toevoegen
End If
 
Of gewoon in de For-Loop een Try-Catch blok plaatsen zodat de fouten, mappen waar het programma geen toegang tot heeft, netjes worden afgevangen.

Anders moet je elke map benoemen, wat misschien ook per systeem verschilt. Dat lijkt me niet zo handig :P
 
@The Mighty Atom: Dan moet je toch weer eerst toegang hebben tot het pad, waarbij die error komt (als ik het goed begrijp...)

@JoZ1: Nadat de error er dan is geweest, houdt het programma op met zoeken, wat niet de bedoeling is. Het zou pas op moeten houden met zoeken nadat het bestand gevonden is/als het alles doorzocht heeft.
Daarvoor ook het: On Error Resume Next


@TS: Als je het zoeken probeert met alleen de output van een msgbox in een ander project, werkt het dan wel?
 
MartinJM zei:
@JoZ1: Nadat de error er dan is geweest, houdt het programma op met zoeken, wat niet de bedoeling is.

Natuurlijk niet, de try-catch staat ín de for-loop.
 
Ik denk dat je beter een functie kunt gebruiken. Probeer deze code:

Code:
    Private Function ZoekBestand() As Boolean

        For Each Folder In New DirectoryInfo("C:\").GetDirectories
            Try
                For Each File As FileInfo In New DirectoryInfo(Folder.FullName).GetFiles("*.*", SearchOption.AllDirectories)

                    If File.Name = "doc.xlsx" Then
                        MessageBox.Show(File.Name & " is gevonden in: " & Folder.FullName)
                        Return True
                    End If

                Next
            Catch
            End Try
        Next
        Return False

    End Function

Als het bestand gevonden is, zie je een messagebox en vervolgens word de waarde True gereturned. Dit zorgt ervoor dat de functie stopt met zoeken, hij springt direct naar End Function.

Aanroepen gaat zo:

Code:
        If ZoekBestand() Then
            MessageBox.Show("File gevonden, klaar met zoeken.")
        Else
            MessageBox.Show("De file is niet gevonden.")
        End If
 
Is het dan niet:

[cpp]If ZoekBestand() = True Then
MessageBox.Show("File gevonden, klaar met zoeken.")
Else
MessageBox.Show("De file is niet gevonden.")
End If[/cpp]
 
Code:
        If ZoekBestand() Then
            MessageBox.Show("File gevonden, klaar met zoeken.")
        Else
            MessageBox.Show("De file is niet gevonden.")
        End If

Dat werkt ook, probeer maar. Als je = True weglaat, betekent dat dat tie automatisch checked of de expressie True is.

Werkt met alles waarvan de expressie een boolean is. Nog een voorbeeld:

Code:
If ThisCheckBox.Checked Then
MessageBox.Show("I am True")
Else
MessageBox.Show("I am False")
End If

Dat is hetzelfde als wanneer je het zo zou schrijven:

Code:
If ThisCheckBox.Checked [b]= True[/b] Then
MessageBox.Show("I am True")
Else
MessageBox.Show("I am False")
End If
 
Laatst bewerkt:
Een nieuwe wereld gaat voor me open :D
Tnx
 
Was niet serieus bedoeld, ik wist niet dat het ook zo kon ;)
 
Zal dinsdag even kijken, dan ben ik namelijk weer thuis.
Doe nu internetten via telefoon en dat is toch geen suc6.
In iedergeval bedankt voor alle reactie's.

Grt Schippertje
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan