PDA

View Full Version : C# - Ricerca files


Silent killer
16-03-2012, 07:33
Ciao a tutti, mi sto cimentando da poco sul C# e volevo creare un programmino che individuasse files uguali all'interno di un percorso, analizzando anche le sottodir.
Inizialmente ho scritto il programma, e in un punto ho utilizzato questa:

foreach (string filePath in Directory.EnumerateFiles(Percorso, "*", SearchOption.AllDirectories)) { ListaFiles.Add(new FileInfo(filePath)); }

Per crearmi una lista di FileInfo, però l'opzione SearchOption.AllDirectories non funziona bene: in pratica quando trova una cartella con accesso negato, si blocca e termina, senza andare avanti nella ricerca di files.
Allora ho pensato di far da me un sistema per cercare i files e ho trovato un algoritmo su msdn che ho modificato in modo da ottenere alla fine una lista di FileInfo:

public class RecursiveFileSearch
{
static System.Collections.Specialized.StringCollection log = new System.Collections.Specialized.StringCollection();

static void Main()
{

System.IO.DirectoryInfo rootDir = new DirectoryInfo(@"F:\Disegni\");
System.IO.FileInfo[] ListaFiles = null;
ListaFiles= WalkDirectoryTree(rootDir, ListaFiles);


// Write out all the files that could not be processed.
Console.WriteLine("Files with restricted access:");
foreach (string s in log)
{
Console.WriteLine(s);
}
// Keep the console window open in debug mode.
Console.WriteLine("Press any key");
Console.ReadKey();
}




static FileInfo[] WalkDirectoryTree(System.IO.DirectoryInfo root, FileInfo[] files)
{

System.IO.DirectoryInfo[] subDirs = null;
FileInfo[] AllResults = null;

// First, process all the files directly under this folder
try
{
FileInfo[] filesSottoDir = root.GetFiles("*.*");
AllResults = new FileInfo[files.Length + filesSottoDir.Length];
files.CopyTo(AllResults, 0);
filesSottoDir.CopyTo(AllResults, files.Length);
}
// This is thrown if even one of the files requires permissions greater
// than the application provides.
catch (UnauthorizedAccessException e)
{
// This code just writes out the message and continues to recurse.
// You may decide to do something different here. For example, you
// can try to elevate your privileges and access the file again.
log.Add(e.Message);
}

catch (System.IO.DirectoryNotFoundException e)
{
//Console.WriteLine(e.Message);
}

catch { }


// Now find all the subdirectories under this directory.
try
{
subDirs = root.GetDirectories();
}
catch { }

foreach (System.IO.DirectoryInfo dirInfo in subDirs)
{
// Resursive call for each subdirectory.
AllResults = WalkDirectoryTree(dirInfo, AllResults);
}


return AllResults;
}
}










}



Il problema è che non funziona niente, qualcuno potrebbe aiutarmi? Non riesco a capire perchè non entra nel blocco di ricerca dei files.. grazie ;)

gugoXX
16-03-2012, 08:21
Per crearmi una lista di FileInfo, però l'opzione SearchOption.AllDirectories non funziona bene: in pratica quando trova una cartella con accesso negato, si blocca e termina, senza andare avanti nella ricerca di files.

Secondo me funziona benissimo :asd:

Silent killer
16-03-2012, 17:06
ho cercato ed è un problema comune a tutti :\

Silent killer
19-03-2012, 09:43
c'è nessuuuno? :asd:

Silent killer
19-03-2012, 11:25
ok ho risolto cmq :P

Silent killer
21-03-2012, 10:56
Sto avendo un altro problema, in pratica ho fatto un'interfaccia con windows forms, e cliccando sul button scansione viene eseguito l'algoritmo di ricerca e visualizzati i risultati. Al click voglio anche che appaia un'immagine di caricamento, infatti come prima istruzione inserisco:

pictureBox1.Image = Image.FromFile(Application.StartupPath + "/Images/picture.jpg");

Dopo di che avviene tutta la ricerca. Il problema è che l'immagine compare solo se interrompo l'algoritmo con una messagebox, altrimenti va tutto a buon fine ma non appare questa dannata immagine. Come posso risolvere?

Ho provato anche a mettere uno sleep per permettere il caricamento dell'immagine, ma non cambia nulla, non riesco a capire.. :\

ESSE-EFFE
21-03-2012, 13:27
pictureBox1.Image = Image.FromFile(Application.StartupPath + "/Images/picture.jpg");

Dopo di che avviene tutta la ricerca. Il problema è che l'immagine compare solo se interrompo l'algoritmo con una messagebox, altrimenti va tutto a buon fine ma non appare questa dannata immagine. Come posso risolvere?

Dopo aver caricato l'immagine, prova ad aggiungere:

pictureBox1.Refresh();

Silent killer
21-03-2012, 16:33
grande, funziona! :D Sull'interwebs non avevo trovato nulla

Silent killer
22-03-2012, 11:16
altro problema.

foreach (string percorso in checkedListBox1.SelectedItems)
{
FileInfo file = new FileInfo(percorso);
file.Delete();

}


Ho scoperto che in SelectedItems c'è sempre e solo un elemento, anche se seleziono più elementi tra i risultati. Perchè? Non dovrebbe restituirmi la lista di tutti gli oggetti selezionati nella checkedListBox?

Silent killer
22-03-2012, 13:04
ho trovato che la checkedListBox non supporta la multi selection... quindi non serve ad una benemerita mazza :\ Come posso ovviare?

edit: ho usato una listView, ma non è un granchè