Seznam souboru   zodpovězená otázka

VB.NET, Algoritmy

Nemá VB net nějakou funkci(mozna se to nenazývá funkce, nejsem programator), která by mi vratila buď do pole, nebo do kolekce seznam vsech souboru ze zadane slozky + ze vsech podslozek dane slozky a zaroven napsala soubory s celou cestou?

Predem dekuji

Zdenek

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Žádná taková metoda ve Frameworku není. Lze použít tak maximálně System.IO.Directory.GetFileSystemEntries(ByVal String) As String() který získá názvy podřízených složek a souborů z určité složky, ovšem ne rekurzivně.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Proti tomu bych si dovolil protestovat. V .NET Frameworku existuje funkce System.IO.Directory.GetFiles(string path, string searchPattern, System.IO.SearchOption searchOption), která při použití parametru searchOption s hodnotou System.IO.SearchOption.AllDirectories vrátí pole cest ke všem souborům v uvedené složce + k souborům ve všech jejich podsložkách.

Př.: string[] paths = System.IO.Directory.GetFiles(@"C:\", "*", System.IO.SearchOption.AllDirectories);

Po tomto zavolání metody budou v proměnné paths uloženy cesty ke všem souborům na disku C.

VB.NET neznám, takže příklad je uveden v C#.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Ano. Bohužel jsem původní dotaz chybně interpretoval tak, že je požadavek aby se do toho pole uložily i cesty všech složek, nejen souborů (něco jako GetFileSystemEntries, ovšem rekurzivně). A na to funkce neexistuje (leda použít nejdřív GetDirectories a potom GetFiles)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Takhle nejak jsem to dal do kupy, akorat je to desne pomaly, coz mi relativně nevadí.


Imports System.IO.Directory
Imports System.Collections.ObjectModel

Public Class Form1

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

        '--------------------------------------------------------------------------------------------------------------
        Dim slozky As Collections.ObjectModel.ReadOnlyCollection(Of String) = _
        Microsoft.VisualBasic.FileIO.FileSystem.GetDirectories("D:\VSB\Druhak\1.semestr", FileIO.SearchOption.SearchAllSubDirectories)

        Dim PocetSlozek As Integer
        Dim SouboryJedneSlozky As Collections.ObjectModel.ReadOnlyCollection(Of String)
        Dim Soubory As New Collection(Of String)

        For PocetSlozek = 0 To slozky.Count - 1
            SouboryJedneSlozky = Microsoft.VisualBasic.FileIO.FileSystem.GetFiles(slozky(PocetSlozek), FileIO.SearchOption.SearchAllSubDirectories)
            Dim PocetSouboruJedneSlozky As Integer
            For PocetSouboruJedneSlozky = 0 To SouboryJedneSlozky.Count - 1

                Soubory.add(SouboryJedneSlozky(PocetSouboruJedneSlozky))

                System.Windows.Forms.Application.DoEvents()
            Next
        Next
        '--------------------------------------------------------------------------------------------------------------

        'Zapis do textboxu
        Dim PocetSouboru As Integer
        For PocetSouboru = 0 To soubory.Count - 1

            TextBox1.Text &= (soubory(PocetSouboru)) & vbCrLf

            System.Windows.Forms.Application.DoEvents()
        Next


    End Sub
End Class


nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pomalé to máte díky výše uvedenému, naprosto úděsnému kódu a použití DoEvents. Rychlost potom můžete porovnat s tímto:

Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
  Dim paths() As String = IO.Directory.GetFiles("D:\VSB\Druhak\1.semestr", FileIO.SearchOption.SearchAllSubDirectories)
  Dim n = paths.Length
  Dim builder As New Text.StringBuilder(n)
  n -= 1
  For index As Integer = 0 To n
    builder.AppendLine(paths(index))
  Next
  TextBox1.Text = builder.ToString()
End Sub

Předpokládám, že záměrem bylo načíst cesty všech souborů z uvedené složky a jejích podřízených složek rekurzivně.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Omlouvám se, ze je kod spatne čitelný. Za programátora se ani nepovažuji. Ted jsem to zkusil upravit do citelnejsi podoby.


'Vypsani souboru do kolekce soubory--------------------------------------------------------------------------------------------------------------
            Dim PodSlozky As Collections.ObjectModel.ReadOnlyCollection(Of String)
            Dim Soubory As New Collection(Of String)

            'pridani souboru podslozek
            PodSlozky = Microsoft.VisualBasic.FileIO.FileSystem.GetFiles(ProhledavanaSlozka, FileIO.SearchOption.SearchAllSubDirectories)
            Dim PocetSouboruKorenoveSlozky As Integer
            For PocetSouboruKorenoveSlozky = 0 To PodSlozky.Count - 1
                Soubory.Add(PodSlozky(PocetSouboruKorenoveSlozky))
            Next
            '--------------------------------------------------------------------------------------------------------------

Zjistil jsem, ze problem v rychlosti, byl hlavne v tom, ze jsem to zapisoval do textboxu, kdyz to ted zapisuji primo do souboru, je to mnohonasobne rychlejsi.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dobry den,

pouzivam toto, je to jednoduche a rychle :

Dim Str as string

Str = Dir("C:\Windows\", FileAttribute.Directory)

Do While Len(Str) <> 0

ListBox.Items.Add(Str)

Str = Dir()

Loop

snad pomuze

s Pozdravem Ales Bedac

nahlásit spamnahlásit spam 0 odpovědětodpovědět

http://vbnet.cz/forum-tema--622-soubory_...

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback