Mappen en bestanden doorzoeken

Status
Niet open voor verdere reacties.

ferentuske

Gebruiker
Lid geworden
5 okt 2013
Berichten
78
Beste

Ik weet niet echt hoe ik er aan moet beginnen want ik weet nog niet zoveel af van threads en events.

Ik ben eindelijk bezig met een wpf te maken voor mappen te doorzoeken op hoeveel submappen er bv in de map
documenten staat hoeveel hoeveel bestanden er in de map staat en hoeveel mb en hoeveel onleesbare mappen en bestanden
met daaronder een listbox die aantoont waar hij momenteel aan het zoeken is

ik zou hier dus gebruik maken van de klasse DirectoryInfo

dan nog een klasse DirectoryCalculator die de events afvuurt wanneer er iets gevonden werd

Kan iemand me helpen bij de start A.U.B

kheb een foto van een wpf gevonden op internet maar geen turtorial ofzo
dus ik zou eindelijk enkel moeten weten hoe ik er aan moet beginnen



Alvast bedankt
 
Laatst bewerkt:
In principe is dit een veelvoorkomend geval waar genoeg informatie op internet over te vinden is. Het is vaak even weten waar je naar moet zoeken.
In jou geval wil je op basis van een gekozen directory alle subfolders en bestanden 'zoeken' en optellen. Dit betekent dat je voor elke folder dezelfde handeling wilt uitvoeren. Dit kan met recursiviteit.

Ik zou dus zoeken op: C# recursive loop through folder. Dat levert al een heleboel basis informatie op.

Waar jij zou kunnen beginnen is als volgt: Let op: Pseudo code!

Maak de velden aan zoals je in de bijlage toont. Dit levert dus een textbox op waar het path in staat, een 'scan' knop, een overzicht en een lijst met gevonden bestanden en folders.

ik gebruik in de pseudo code de volgende benamingen voor deze elementen:
textbox: txtPath
button: btnScan
listview overzicht: lvOverview
listview result: lvResult

Code:
private int _numDirectories = 0; // voor het gemak instantieer ik ze hier. normaal gebeurt dit in een constructor o.i.d.
private int _numFiles = 0;

// op moment dat je op de scan knop drukt
btnScan_Click(){
     // kijk of de directory bestaat
     if(Directory.Exists(txtPath.text)){
            // verwerk bestanden
            ProcessDirectory(txtPath.text);

            // vul overzicht
            lvOverview.items.add("Aantal directories: " + _numDirectories.toString());
            lvOverview.items.add("Aantal bestanden:" + _numFiles.toString());
      }
}


// functie voor het verwerken van een map
public void ProcessDirectory(string target){
    
    // loop door de mappen heen    
    foreach(string dir in Directory.GetDirectories(target)){
              
             // tel aantal gevonden mappen op
             _numDirectories++;
 
             // voeg map toe aan het overzichts lijstje
             lvResult.items.add(dir);

             // loop door bestanden heen
             foreach(string file in Directory.GetFiles(dir)){
                   
                       // tel aantal bestanden op
                       _numFiles++;
                       
                       // voeg toe aan resultaat
                       lvResult.items.add(file);
             }
              // roep eigen functie aan voor de volgende map. De input verandert steeds in de functie waardoor elke map wordt doorlopen.
             ProcessDirectory(dir);
    }
}

Nogmaals: bovenstaande code heb ik niet gecontroleerd maar het moet je een beginnetje kunnen geven over hoe je dit aan kan pakken.
 
bedankt ik had al gevonden met
DirectoryInfo di = new DirectoryInfo(TbLocatie.Text || );


System.IO.FileInfo[] files = di.GetFiles("*.*", SearchOption.AllDirectories);
int countfiles = files.Length;
lblFiles.Content = countfiles;

voor de bestanden te zoeken maar bedankt voor die listbox die was ik nog aan het zoeken

Maar heb eindelijk nog een vraag

Hoe kan ik als ik bv op een button bladeren druk een map selecteren

DirectoryInfo di = new DirectoryInfo(TbLocatie.Text);
Nullable<bool> result = dlg.ShowDialog();
string filename = dlg.FileName;
TbLocatie.Text = filename;

deze werkt wel maar alleen voor files blijkbaar maar ik wil folders selecteren
hoe kan ik dit doen want ik ben bezig met wpf en niet met forms
omdat de mogelijkheden met wpf meer zijn en ook nieuwer is.
 
als ik de map C wil nemen krijg ik dus een error Errorexception

Toegang tot het pad C:\$Recycle.Bin\S-1-5-18 is geweigerd.

Hoe kan ik dit oplossen ???
 
In principe is dit een veelvoorkomend geval waar genoeg informatie op internet over te vinden is. Het is vaak even weten waar je naar moet zoeken.
In jou geval wil je op basis van een gekozen directory alle subfolders en bestanden 'zoeken' en optellen. Dit betekent dat je voor elke folder dezelfde handeling wilt uitvoeren. Dit kan met recursiviteit.

Ik zou dus zoeken op: C# recursive loop through folder. Dat levert al een heleboel basis informatie op.

Waar jij zou kunnen beginnen is als volgt: Let op: Pseudo code!

Maak de velden aan zoals je in de bijlage toont. Dit levert dus een textbox op waar het path in staat, een 'scan' knop, een overzicht en een lijst met gevonden bestanden en folders.

ik gebruik in de pseudo code de volgende benamingen voor deze elementen:
textbox: txtPath
button: btnScan
listview overzicht: lvOverview
listview result: lvResult

Code:
private int _numDirectories = 0; // voor het gemak instantieer ik ze hier. normaal gebeurt dit in een constructor o.i.d.
private int _numFiles = 0;

// op moment dat je op de scan knop drukt
btnScan_Click(){
     // kijk of de directory bestaat
     if(Directory.Exists(txtPath.text)){
            // verwerk bestanden
            ProcessDirectory(txtPath.text);

            // vul overzicht
            lvOverview.items.add("Aantal directories: " + _numDirectories.toString());
            lvOverview.items.add("Aantal bestanden:" + _numFiles.toString());
      }
}


// functie voor het verwerken van een map
public void ProcessDirectory(string target){
    
    // loop door de mappen heen    
    foreach(string dir in Directory.GetDirectories(target)){
              
             // tel aantal gevonden mappen op
             _numDirectories++;
 
             // voeg map toe aan het overzichts lijstje
             lvResult.items.add(dir);

             // loop door bestanden heen
             foreach(string file in Directory.GetFiles(dir)){
                   
                       // tel aantal bestanden op
                       _numFiles++;
                       
                       // voeg toe aan resultaat
                       lvResult.items.add(file);
             }
              // roep eigen functie aan voor de volgende map. De input verandert steeds in de functie waardoor elke map wordt doorlopen.
             ProcessDirectory(dir);
    }
}

Nogmaals: bovenstaande code heb ik niet gecontroleerd maar het moet je een beginnetje kunnen geven over hoe je dit aan kan pakken.

Ja het werkt maar niet correct Als ik dus eerst controleer hoeveel mappen en bestanden er in de map staan komt er 12 bestanden 8 mappen maar
met die code krijg ik maar 8 mappen 7 bestanden. Dus ik dacht omdit op te lossen met Searchoption.Alldirectories maar dan lukt dit niet omdat die dir een string is
 
Laatst bewerkt door een moderator:
Ik heb momenteel deze code hieronder en dit werkt perfect.
Maar die listbox waar de bestanden en files staan krijg ik niet voor elkaar. Moet denk ik met een for lus gebeuren


Code:
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Forms;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;


namespace zoeker
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {

       System.Windows.Forms.OpenFileDialog ofd = new System.Windows.Forms.OpenFileDialog();
    
       
        public MainWindow()
        {
            InitializeComponent();

       
        }
       

        private void btnScan_Click(object sender, RoutedEventArgs e)
        {
            lblBestanden.Content = null;
            lblFiles.Content = null;
            lblGroote.Content = null;
          
            
            if (Directory.Exists(TbLocatie.Text))
            {
               // @"C:\Users\Alexander\Desktop\test"
                
                DirectoryInfo di = new DirectoryInfo(TbLocatie.Text);

                try
                {
                   
                    
                    
                    {
                    System.IO.FileInfo[] files = di.GetFiles("*.*", SearchOption.AllDirectories);
                    int countfiles = files.Length;
                    lblFiles.Content = countfiles;
                    }
                    System.IO.DirectoryInfo[] bestanden = di.GetDirectories("*.*", SearchOption.AllDirectories);
                    int countbestanden = bestanden.Length;
                    lblBestanden.Content = countbestanden;


                    FileInfo[] fileInfo;

                    // FileSystemInfo[] filelist = di.GetFileSystemInfos();

                    fileInfo = di.GetFiles("*.*", SearchOption.AllDirectories);
                    FileSizeFormatProvider sizeconv = new FileSizeFormatProvider();
                    convertor conv = new convertor();

                    // double sizeMB = Convert.ToDouble(lblGroote.Content);

                    long size = Convert.ToInt64(fileInfo.Length);
                   

                    for (int i = 0; i < fileInfo.Length; i++)
                    {


                        
                        size += fileInfo[i].Length / 1024;
                        lblGroote.Content = conv.ByteSize(size);
                            //size;


                   }
                }
                catch (UnauthorizedAccessException) { System.Windows.Forms.MessageBox.Show("Noob item gevonden"); }
                //catch (NullReferenceException) { }

            }

           else
            {
               System.Windows.MessageBox.Show("niet gevonden");
            }

          






            // FileInfo[] fiArr = di.GetFiles();

            // foreach (FileInfo f in fiArr)
            // lblGroote.Content = f.Name + f.Length;
            // Console.WriteLine("The size of {0} is {1} bytes.", f.Name, f.Length);


        }

        private void btnBladeren_Click(object sender, RoutedEventArgs e)
        {
          
            System.Windows.Forms.FolderBrowserDialog fo = new System.Windows.Forms.FolderBrowserDialog();
            if (fo.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                TbLocatie.Text = fo.SelectedPath;
                Properties.Settings.Default.Save();
                
            }
            else
            {
                System.Windows.Forms.MessageBox.Show("brolll");
            }
           
             //fo.RootFolder = Environment.SpecialFolder.ProgramFiles;

        }
           

    }
    
}
 
Heb je dit ondertussen al opgelost? Ik zag namelijk in een nieuwe post al een vraag naar voren komen voor het berekenen van je filesize

(http://www.helpmij.nl/forum/showthread.php/795645-Getfiles-groote-bestand-omzetten-naar-mb)

Daar heb ik net op gereageerd.

Als je vraag niet is opgelost:

Ik neem aan dat je de mappen en bestanden in de goede volgorde in je listbox wilt hebben.
In mijn eerdere voorbeeld gaf ik al aan dat je recursief door de mappenstructuur kunt lopen. Op die manier kun je meteen de map en de bestanden aan de listbox toevoegen. Ik las dat je aantal mappen niet overeen kwam. Het was ook pseudo code maar met die info moet je op internet wel een voorbeeld kunnen vinden die het wel goed doet.

Je gebruikt nu functionaliteit die een lijst haalt van alle bestanden. Het probleem hierbij is dat je dus niet de mappen kan weergeven. De efficientste manier om dit te doen is toch een soort constructie op te zetten die ik al eerder genoemd heb.

je kan namelijk wel zeggen: 'ik haal alle mappen op, loop door de mappen en haal per map de bestanden op' maar dan heb je een probleem met submappen en de bestanden die daar nog weer in zitten. Handmatig is dus geen optie omdat je in praktijk niet altijd weet hoeveel lagen diep je mappenstructuur gaat.

Mijn tip: probeer nog eens te googlen om een werkend 'recursive loop through directory' script te vinden. En laatste tip: ga vooral niet het wiel opnieuw uitvinden, dit is veelvoorkomende functionaliteit waarvan ik zeker weet dat het wel ergens beschreven en toegelicht wordt.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan