none
Výčet složek

    Dotaz

  • Ahoj, mám prosbu. Jak na funkci, která mě vyčte obsah složky do listboxu s maskou ve formátu *.txt;*.doc;*.ini; a boolem zda hledat i v podsložkách.

    Prosím o přesnou ukázku této funkce, jsem úplný začátečník ve VS 2008 Express. Děkuji.

    sobota 8. ledna 2011 12:41

Odpovědi

  • Vyzkoušel bych i následující kód:

    	/// <summary>
    	/// Seznam souborů ve výchozí složce, které odpovídají zadané masce (respektive několika zadaným maskám).
    	/// </summary>
    	/// <param name="strVychoziSlozka">Výchozí složka, která se bude prohledávat.</param>
    	/// <param name="ienMaska">Seznam masek, kterým má vyhovovat hledaný souboru, např. <example>*.txt, *_2011.doc</example></param>
    	/// <param name="blnVcetnePodslozek">Zda se mají prohledávat i podsložky (<value>true</value>), nebo jenom výchozí složka (<value>false</value>).</param>
    	/// <returns>Vrací seznam souborů, které odpovídají zadaným maskám.</returns>
    	public static IEnumerable<string> SeznamSouboru(string strVychoziSlozka, IEnumerable<string> ienMaska, bool blnVcetnePodslozek)
    	{
    	 //objekt pro uložení seznamu nalezených souborů
    	 List<string> glsSoubory = new List<string>();
    	 //informace o výchozí složce
    	 DirectoryInfo di = new DirectoryInfo(strVychoziSlozka);
    
    	 //procházení jednotlivých masek
    	 foreach (string sMaska in ienMaska)
    	 {
    		//nalezení všech souborů, které odpovídají zadané masce
    		//pokud blnVcetnePodslozek je rovno true, prohledávají se i podsložky
    		FileInfo[] fis = di.GetFiles(sMaska, blnVcetnePodslozek ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly);
    		
    		//přidání všech nalezených souborů do výstupníhé seznamu
    		foreach (FileInfo fi in fis)
    		 //do seznamu se vkládá celá cesta, ale samozřejmě je možné vložit jenom název souboru,
    		 //nebo relativní cestu vzhledem k výchozí složce
    		 glsSoubory.Add(fi.FullName);
    	 }
    
    	 //v seznamu jsou soubory seřazeny podle přípon,
    	 //ale lze je uspořádat i podle jména: glsSoubory.Sort();
    	 return glsSoubory;
    	}
    

    Použití:

    IEnumerable<string> lst = Soubory.SeznamSouboru(@"D:\Slozka", new string[] { "*.txt", "*.doc", "*.docx" }, true);
    
    foreach (string item in lst) {
    	listbox.Items.Add(item);
    }
    


    Boris Lehečka (Word, Access, VBA, XML, C#, SQL)
    pátek 11. února 2011 9:52

Všechny reakce

  • Ahoj, napísal som ti tú funkciu (metódu):

     

    void VypisSuborov(ListBox listbox, string Zlozka, bool AjPodzlozky, string[] pripony)
    {
     //prechadzame vsetky subory v zlozke
     string[] subory = Directory.GetFiles(Zlozka);
     foreach (string subor in subory)
     {
      //a kazdy najdeny subor skontrolujeme ci ma pozadovanu priponu
      string ext = subor.Substring(subor.LastIndexOf(".") + 1);
      foreach(string pripona in pripony)
      {
       if (String.Compare(pripona, ext, true) == 0) listbox.Items.Add(subor);//ak ano tak ho pridame do listboxu
      }
     }
    
     //to iste pre vsetky podzlozky (rekurzivne volania)
     if(AjPodzlozky == true)
     {
      string[] zlozky = Directory.GetDirectories(Zlozka);
      foreach(string zlozka in zlozky)
      {
       VypisSuborov(listbox,zlozka,true,pripony);//rekurzine volanie
      }
     }
    }
    

     

    Príklad volania:

     

    this.listBox1.Items.Clear(); //vymazanie obsahu listBox1
    VypisSuborov(this.listBox1, "C:\\MojaSlozka", true, new string[] {"txt", "doc", "ini"});
    

     

    Metoda VypisSuborov pre jednoduchosť a prehladnosť neošetruje situácie ak by si jej parametre zadal nesprávne. Napríklad ak by si zadal neexistujúcu zložku.

    čtvrtek 10. února 2011 23:07
  • Vyzkoušel bych i následující kód:

    	/// <summary>
    	/// Seznam souborů ve výchozí složce, které odpovídají zadané masce (respektive několika zadaným maskám).
    	/// </summary>
    	/// <param name="strVychoziSlozka">Výchozí složka, která se bude prohledávat.</param>
    	/// <param name="ienMaska">Seznam masek, kterým má vyhovovat hledaný souboru, např. <example>*.txt, *_2011.doc</example></param>
    	/// <param name="blnVcetnePodslozek">Zda se mají prohledávat i podsložky (<value>true</value>), nebo jenom výchozí složka (<value>false</value>).</param>
    	/// <returns>Vrací seznam souborů, které odpovídají zadaným maskám.</returns>
    	public static IEnumerable<string> SeznamSouboru(string strVychoziSlozka, IEnumerable<string> ienMaska, bool blnVcetnePodslozek)
    	{
    	 //objekt pro uložení seznamu nalezených souborů
    	 List<string> glsSoubory = new List<string>();
    	 //informace o výchozí složce
    	 DirectoryInfo di = new DirectoryInfo(strVychoziSlozka);
    
    	 //procházení jednotlivých masek
    	 foreach (string sMaska in ienMaska)
    	 {
    		//nalezení všech souborů, které odpovídají zadané masce
    		//pokud blnVcetnePodslozek je rovno true, prohledávají se i podsložky
    		FileInfo[] fis = di.GetFiles(sMaska, blnVcetnePodslozek ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly);
    		
    		//přidání všech nalezených souborů do výstupníhé seznamu
    		foreach (FileInfo fi in fis)
    		 //do seznamu se vkládá celá cesta, ale samozřejmě je možné vložit jenom název souboru,
    		 //nebo relativní cestu vzhledem k výchozí složce
    		 glsSoubory.Add(fi.FullName);
    	 }
    
    	 //v seznamu jsou soubory seřazeny podle přípon,
    	 //ale lze je uspořádat i podle jména: glsSoubory.Sort();
    	 return glsSoubory;
    	}
    

    Použití:

    IEnumerable<string> lst = Soubory.SeznamSouboru(@"D:\Slozka", new string[] { "*.txt", "*.doc", "*.docx" }, true);
    
    foreach (string item in lst) {
    	listbox.Items.Add(item);
    }
    


    Boris Lehečka (Word, Access, VBA, XML, C#, SQL)
    pátek 11. února 2011 9:52
  • Ďakujem za ukážku toho ako to spraviť z pohladu programátora jednoduchšie.
    pátek 11. února 2011 15:10