FOK!forum / Digital Corner / [VB.net] paar vraagjes
mscholzondag 23 september 2007 @ 15:38
ik ben bezig in VB.net een programmatje te schrijven dat een directory structuur inclusief bestanden uitleest en die gegevens door pompt naar Mysql server

echter heb ik (nu) 3 vragen:
1) ik heb een functie geschreven om een arrayList terug te krijgen met bestandsnamen:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
    Function searchFileSystem(ByVal path As String, ByVal searchPattern As String, ByVal searchOption As IO.SearchOption) As ArrayList
        'Dim returnValue As String()
        Dim fp As New FileIOPermission(PermissionState.None)
        fp.AllFiles = FileIOPermissionAccess.AllAccess
        'returnValue = System.IO.Directory.GetFiles(path, searchPattern, searchOption)

        Dim d As IO.DirectoryInfo
        Dim f As IO.FileInfo
        Dim regExpObj As New Regex(searchPattern)
        If path.LastIndexOf("\") = 1 Then
            path = path
        Else
            path = path & "\"
        End If
        Dim ofs As New IO.DirectoryInfo(path)
        For Each d In ofs.GetDirectories 'directorylist
            'MsgBox(path & d.Name, MsgBoxStyle.MsgBoxHelp)
            If d.Name <> "System Volume Information" And d.Name <> "$RECYCLE.BIN" And d.Name <> "Windows" And d.Attributes <> IO.FileAttributes.SparseFile Then
                For Each f In d.GetFiles
                    If regExpObj.IsMatch(f.Name, RegexOptions.IgnoreCase) Then
                        fileList.Add(path & d.Name & "\" & f.Name)
                    End If
                Next

                If searchOption = IO.SearchOption.AllDirectories And IO.Directory.Exists(path & d.Name) Then
                    searchFileSystem(path & d.Name, searchPattern, searchOption)
                End If

            End If
        Next
        Return fileList
    End Function


echter zit ik daar met een aantal probleempjes:
a) ik loop soms tegen Exceptions aan, hoe kan ik die het beste opvangen als ik een arraylist terug moet geven?

b) ik gebruik nu een if met daarin een aantal voorwaarden om mappen uit te sluiten..
dit wil ik soepeler kunnen aangeven.. hoe moet ik dat doen?

c) onder vista zijn link point (oid) dit zijn verwijzingen naar andere mappen maar zijn geen snelkoppelingen (zoals documents and settings), dat moet ik ook uitsluiten... hoe dat te doen? (zoals je misschien kan zien heb ik het al wel geprobeerd )


2) ik wil van de bestanden die ik in de array zet (audio/video bestanden) de eigenschappen hebben:
audio/videobitrate.
aantal audio/ondertitel streams.
audio/videocodec
talen van de ondertiteling en audio streams
iemand die mij er mee op weg kan helpen hoe ik die gegevens te pakken moet krijgen?
Detroitzondag 23 september 2007 @ 16:08
a) Het beste kun je exceptions afvangen door te beginnen met de meest specifieke exceptie en te eindigen met de meest algemene exceptie (volgens mij System.Exception)

b) Hoe bedoel je soepeler aangeven?

c) Geen verstand van Vista...

d) Denk dat daar vast wel iets van libraries voor zijn.. Geen idee hoe je dat handmatig moet doen, waarschijnlijk een aantal bytes in een byte-array gooien en op een bepaalde locatie kijken naar de waarde...
dikkedoruszondag 23 september 2007 @ 16:16
Link-points zijn idd lastig, ik heb er nog niet mee gewerkt. Het is een integraal deel van NTFS, dus volgens mij moet het ondersteund worden door de api die je gebruikt. Google er eens op zou ik zeggen.

Welke excepties krijg je? Zoals Detroit al zegt zou je afvangen moeten doen van meest specifieke naar meest algemene, zodat je je eigen handlers kan schrijven voor de excepties waar je wat mee kan, en dat je globale excepties (I/O errors e.d.) gewoon afhandeld door je programma te stoppen, critical termination oid..

Artiest e.d. zijn uit te lezen in de Windows shell, dus er moeten wel standaard libs voor zijn. Zoals altijd is google je vriend. MSDN helpt je ook vaak uit de nood, ik gebruik ze allebei.
mscholzondag 23 september 2007 @ 16:17
quote:
Op zondag 23 september 2007 16:08 schreef Detroit het volgende:
a) Het beste kun je exceptions afvangen door te beginnen met de meest specifieke exceptie en te eindigen met de meest algemene exceptie (volgens mij System.Exception)
oke... ga ik naar kijken..
quote:
b) Hoe bedoel je soepeler aangeven?
zoals je kan zien is de lijst nu hardcoded in het programma, dit wil ik los hebben in bijvoorbeeld een array (die ik via de gui weer kan aanpassen, mappen toevoegen c.q verwijderen)
ik kan er echter niet opkomen hoe dat te doen...
quote:
c) Geen verstand van Vista...

d) Denk dat daar vast wel iets van libraries voor zijn.. Geen idee hoe je dat handmatig moet doen, waarschijnlijk een aantal bytes in een byte-array gooien en op een bepaalde locatie kijken naar de waarde...
hmm oke...

ik ga nogmaals google bezoeken voor b.v. libraries
mscholzondag 23 september 2007 @ 16:19
quote:
Op zondag 23 september 2007 16:16 schreef dikkedorus het volgende:
Link-points zijn idd lastig, ik heb er nog niet mee gewerkt. Het is een integraal deel van NTFS, dus volgens mij moet het ondersteund worden door de api die je gebruikt. Google er eens op zou ik zeggen.

Welke excepties krijg je? Zoals Detroit al zegt zou je afvangen moeten doen van meest specifieke naar meest algemene, zodat je je eigen handlers kan schrijven voor de excepties waar je wat mee kan, en dat je globale excepties (I/O errors e.d.) gewoon afhandeld door je programma te stoppen, critical termination oid..
de grootste probleemgever is de SecurityException (o.a. op mappen in de windows folder, daarom nu ook geexclude) en onder vista de Link-point van Documents and settings
SuperRembozondag 23 september 2007 @ 16:39
Waarom gebruik je eigenlijk de searchoption niet in de GetDirectory method? Als je dat wel doet dan hoef je je searchFileSystem functie niet recursief aan te roepen. Dat is een stuk sneller.
mscholzondag 23 september 2007 @ 17:33
quote:
Op zondag 23 september 2007 16:39 schreef SuperRembo het volgende:
Waarom gebruik je eigenlijk de searchoption niet in de GetDirectory method? Als je dat wel doet dan hoef je je searchFileSystem functie niet recursief aan te roepen. Dat is een stuk sneller.
vind em al bijzonder rap (een volle 90GB partitie in 1-2 sec doorzoeken, zoniet sneller )


maar ben de lulligste niet en heb het geprobeerd.
dan krijg ik te maken met een exception (unauthorizedException) op system volume information
die moet ik dan gaan afvangen...

ik ga me boek maar induiken voor het afvangen van exceptions

[ Bericht 10% gewijzigd door mschol op 23-09-2007 17:45:32 ]
SuperRembozondag 23 september 2007 @ 17:44
De grootte van de bestanden doet er in dit geval niet toe, wel het aantal bestanden en mappen en hoe diep de mappen genest zijn.
Daarnaast is het gewoon stom om zo'n handige optie niet te benutten
mscholzondag 23 september 2007 @ 17:47
quote:
Op zondag 23 september 2007 17:44 schreef SuperRembo het volgende:
De grootte van de bestanden doet er in dit geval niet toe, wel het aantal bestanden en mappen en hoe diep de mappen genest zijn.
Daarnaast is het gewoon stom om zo'n handige optie niet te benutten
het gaat voornamelijk gebruikt worden voor 1 of 2 lagen diep en de hoeveelheid? geen idee, ik gok per dvd max 100 bestanden
dvdtje's met bestanden wil ik inlezen (en daar gelijk wat video info uithalen, hoef ik dat niet handmatig te doen )
F04zondag 23 september 2007 @ 17:49
tvp
mscholzaterdag 1 december 2007 @ 22:54
even een ordinaire kick van mijn kant...
inmiddels heb ik na veel rotzooien mijn functie helemaal herbouwd en ziet er nu zo uit:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
    Function fill_arraylist() As ArrayList
        excluded.Add("System Volume Information")
        excluded.Add("$Recycle.Bin")
        excluded.Add("Recycle Bin")
        excluded.Add("$RECYCLE.BIN")
        Return excluded
    End Function

    Function searchFileSystem(ByVal path As String, ByVal searchPattern As String, ByVal searchOption As IO.SearchOption) As ArrayList
        If excluded.Count >= 1 Then
            excluded.Clear()
        End If
        excluded = fill_arraylist()
        excluded.Add(Environment.GetEnvironmentVariable("windir").Substring(3))
        excluded.Sort()
        Dim d As IO.DirectoryInfo
        Dim f As IO.FileInfo
        Dim Regexp As New RegexOptions
        Dim dirs As New IO.DirectoryInfo(path)
        Dim files1 As Array = dirs.GetFiles("*")
        For Each f In files1
            If Regex.IsMatch(f.Name, searchPattern) Then
                files.Add(f)
            End If
        Next
        For Each d In dirs.GetDirectories()
            If excluded.BinarySearch(d.Name) < 0 Then
                Console.WriteLine(d.FullName)
                If Not CBool((d.Attributes And IO.FileAttributes.ReparsePoint)) Then
                    If searchOption = IO.SearchOption.AllDirectories Then
                        searchFileSystem(path & "\" & d.Name, searchPattern, searchOption)
                    End If
                End If
            End If
        Next
        Return files
    End Function


aanroep:
1      files = searchFileSystem(Me.Path.Text, ".*?\.(avi|ogm|mkv|mpg|mp3|rar|mp4|mpeg|txt)$", IO.SearchOption.AllDirectories)


de reparsepoints worden ontdekt en overgeslagen
alle folders in de excluded arraylist worden ook overgeslagen (weet nog niet of hij wel of niet hoofdletter gevoelig is maar aangezien ik $RECYCLE.BIN en $Recycle.Bin moet toevoegen denk ik van niet.

de zoek functie accepteert een regex
enige wat ik nu nog wil is dat hij zelf kan zien of hij wel of niet toegang heeft tot een folder (wat e.v.t zou leiden tot een NoAccessException) en deze dan automatisch overslaat (net als de reparsepoints)