Soubory v podsložkách   zodpovězená otázka

VB.NET, I/O operace

Dobrý den. Potřeboval bych poradit s operací, která by mi do pole přiřadila soubory obsažené v zadané složce a jejích podsložkách. Zkoušel jsem kombinaci

Dim soubory() As String = IO.Directory.GetFiles(cesta)
Dim slozky() As String = IO.Directory.GetDirectories(cesta)

Tímto ale zjistím pouze soubory a složky obsažené v zadané složce. Jenomže každá složka v poli slozky() může mít další podsložky.

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

Jedno z možných řešení je napsat jednoduchou rekurzivní funkci, která bude přidávat System.IO.FileInfo do seznamu System.Collections.Generic.List(T).

Použití:

Dim files As New List(Of FileInfo)
GetAllFiles("C:\Program Files", files)

Definice rekurzivní funkce:

Public Sub GetAllFiles(ByVal path As String, fileInfosList As List(Of FileInfo))
  Try
    Dim parentDirectory As New DirectoryInfo(path)
    For Each file As FileInfo In parentDirectory.GetFiles()
      fileInfosList.Add(file)
    Next
    For Each directory As DirectoryInfo In parentDirectory.GetDirectories()
      GetAllFiles(directory.FullName)
    Next
  Catch ex As DirectoryNotFoundException
    REM Ošetřit případ neexistující složky
  Catch ex As FileNotFoundException
  Catch ex As UnauthorizedAccessException
    REM Ošetřit případ zamítnutí přístupu do složky
  End Try
End Sub

Výhoda tohoto řešení je možnost jednoduše přerušit proces prohledávání složek, což v případě Microsoft.VisualBasic.FileIO.FileSystem.GetFiles nelze. To se může hodit při prohledávání složité stromové struktury s velkým množstvím souborů a složek.

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

Zdravím,

já bych použil funkce:

Dim slozky() As String = Microsoft.VisualBasic.FileIO.FileSystem.GetDirectories("c:\slozka\", FileIO.SearchOption.SearchAllSubDirectories)
Dim soubory() As String = Microsoft.VisualBasic.FileIO.FileSystem.GetFiles("c:\slozka\", FileIO.SearchOption.SearchAllSubDirectories)

Dodaným parametrem FileIO.SearchOption.SearchAllSubDirectories totiž určíte, že se mají prohledávat i nižší úrovně složek.

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

Bohužel mi ani jedno z těchto řešení nefunguje. Ten parametr SearchAllSubDirectories mi přijde jako lepší a hlavně jednodušší varianta, ale bohužel mi to píše error: Value of type 'System.Collections.ObjectModel.ReadOnlyCollection(Of String)' cannot be converted to '1-dimensional array of String'.

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

Omlouvám se, zapomněl jsem, že tyto funkce nevrací klasické pole. Proto použijte toto:

Dim slozky() As Collections.ObjectModel.ReadOnlyCollection(Of String) = _
Microsoft.VisualBasic.FileIO.FileSystem.GetDirectories("c:\slozka\", FileIO.SearchOption.SearchAllSubDirectories)
Dim soubory() As Collections.ObjectModel.ReadOnlyCollection(Of String) = _
Microsoft.VisualBasic.FileIO.FileSystem.GetFiles("c:\slozka\", FileIO.SearchOption.SearchAllSubDirectories)

S ReadOnlyCollection můžete pracovat prakticky stejně jako s polem.

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

Me to nefunguje, pise mi to:

Error 1 Value of type 'System.Collections.ObjectModel.ReadOnlyCollection(Of String)' cannot be converted to '1-dimensional array of System.Collections.ObjectModel.ReadOnlyCollection(Of String)'. C:\Documents and Settings\Zdrazil1\Local Settings\Data aplikací\Temporary Projects\WindowsApplication1\Form1.vb 3 5 WindowsApplication1

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

Vyhoďte pryč ty závorky za jménem proměnné:

Dim slozky As Collections.ObjectModel.ReadOnlyCollection(Of String) = _
Microsoft.VisualBasic.FileIO.FileSystem.GetDirectories("c:\slozka\", FileIO.SearchOption.SearchAllSubDirectories)
Dim soubory As Collections.ObjectModel.ReadOnlyCollection(Of String) = _
Microsoft.VisualBasic.FileIO.FileSystem.GetFiles("c:\slozka\", FileIO.SearchOption.SearchAllSubDirectories)
 

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