[VB.NET 2005] Risorse del computer

martedì 08 maggio 2007 - 08.56

ssj5trunks Profilo | Newbie

Salve a tutti, sto sviluppando una specie di esplora risorse in VB.NET 2005 tramite degli User Control in modo da poterli usare in tutti i programmi che farò.

Ora però sono arrivato al punto di fare uno user control che mi ritorni la lista dei file di una certa cartella.
Ho utilizzato per fare questo una ListView ma ho notato che è molto lenta quando si caricano cartelle di + di 300/400 files.
Ho già provato usando BeginUpdate e EndUpdate ma le cose non cambiano di molto.
C'è un sistema per cachare le cartelle una volte caricate e poterle riassegnare al listview senza dover passare obbligatoriamente dal comand .Add degli item?
Infatti ho notato che la lentezza è dovuta proprio al caricamento degli oggetti tramite l' Items.Add.

E' meglio cercare di usare un altro tipo di controllo?
Pensavo al webBrowser e mi creo io l'html oppure una datagridview con la lista dei files ma poi perdo i controlli del listview(i vari tipi di visualizzazioni e la selezione multipla degli oggetti).

Cosa mi consigliate?

Ciao a tutti

Brainkiller Profilo | Guru

>Ora però sono arrivato al punto di fare uno user control che
>mi ritorni la lista dei file di una certa cartella.
>Ho utilizzato per fare questo una ListView ma ho notato che è
>molto lenta quando si caricano cartelle di + di 300/400 files.
>Ho già provato usando BeginUpdate e EndUpdate ma le cose non
>cambiano di molto.

Ciao,
mi sa che il problema risiede altrove, forse nelle prestazioni del computer.
Ho fatto un test sul mio PC che non è recente.
Per aggiungere 2200 file nella Listview ci metto:

dai 170 ai 185 millisecondi senza usare BeginUpdate/EndUpdate

62 millisecondi con BeginUpdate/EndUpdate

Non so che tempi hai tu, ma se sono di questa entità sono trascurabili.
Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

ssj5trunks Profilo | Newbie

Aggiungi almeno 3 subitems per ogni items che aggiungi alla lista, tipo dimensione file, tipo file e data ultima modifica.

Io ad esempio se provo a caricare c:\windows\system32 e ci mette un casino per 2250 files.

Io ho un Pentium 4 a 2.4 Ghz con 1 Gb di ram.

Ciao

Brainkiller Profilo | Guru

>Io ad esempio se provo a caricare c:\windows\system32 e ci mette
>un casino per 2250 files.

Io ho usato questo codice:

listView1.BeginUpdate(); DateTime start=DateTime.Now; string[] files=Directory.GetFiles("C:\\windows\\system32","*.*"); for (int i=0;i<files.Length;i++) { System.IO.FileInfo d=new FileInfo(files[i]); listView1.Items.Add(new ListViewItem(files[i])); listView1.Items[listView1.Items.Count-1].SubItems.Add(d.Length.ToString()); listView1.Items[listView1.Items.Count-1].SubItems.Add("test"); listView1.Items[listView1.Items.Count-1].SubItems.Add("test"); } DateTime end=DateTime.Now; TimeSpan ts=end-start; listView1.EndUpdate(); Console.WriteLine("{0}",ts.TotalMilliseconds);

>Aggiungi almeno 3 subitems per ogni items che aggiungi alla lista,
>tipo dimensione file, tipo file e data ultima modifica.

Ho messo 2 subitems inventati e uno reale (la dimensione del file). Mettendo anche gli altri 2 veri non cambia il tempo visto che ormai la struttura FileInfo è stata valorizzata.

Ci metto 350 millisecondi.
Tu dici che ci metti tanto, ma tanto quanto è a casa tua ?
Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

ssj5trunks Profilo | Newbie

Da me caricando la directory c:\Windows\System32 ci metteva almeno 2 minuti.

Ora però ho cambiato le cose, ho creato un oggetto, gli assegno le proprietà e infine faccio l'add sul listview ed ora è molto + veloce, invece prima facevo l'add subito e poi assegnavo le altre proprietà dell'oggetto appena aggiunto cercandolo nella lisview tramite la chiave e risultava lento.

Ora sto provando a implementare le icone prese dai file e sto cercando un buon sistema veloce, ne avete uno da consigliarmi?

Brainkiller Profilo | Guru

>Da me caricando la directory c:\Windows\System32 ci metteva almeno
>2 minuti.
>Ora però ho cambiato le cose, ho creato un oggetto, gli assegno
>le proprietà e infine faccio l'add sul listview ed ora è molto
>+ veloce, invece prima facevo l'add subito e poi assegnavo le
>altre proprietà dell'oggetto appena aggiunto cercandolo nella
>lisview tramite la chiave e risultava lento.

Bastava che copiassi il codice che ti ho indicato. Io per esempio faccio all'opposto aggiungo un ListViewItem e poi aggiungo i SubItems e le prestazioni sono rapidissime, quelle che ti ho indicato.

>Ora sto provando a implementare le icone prese dai file e sto
>cercando un buon sistema veloce, ne avete uno da consigliarmi?

In questo caso è un po' più complicato, la procedura può effettivamente rallentare. Dovresti fare una DISTINCT delle varie estensioni di file quindi otterai tipo massimo una ventina di tipi diversi di file,recuperi le icone rispettive, in questo modo la procedura viene lanciata 20 volte e non tante volte quanti sono i files se no diventa lentissima.
ciao


David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

ssj5trunks Profilo | Newbie

Infatti ho fatto 2 ImageList, una per le icone piccole e una per le icone grandi e poi a seconda dell'estensione le carico nelle imagelist, ma comunque c'è un problema molte estensioni, ad esempio gli exe, hanno icone diverse anche se l'estensione rimane quella, come si può fare?
C'è un modo per capire se l'icona è differente?

Ciao

Brainkiller Profilo | Guru

>Infatti ho fatto 2 ImageList, una per le icone piccole e una
>per le icone grandi e poi a seconda dell'estensione le carico
>nelle imagelist, ma comunque c'è un problema molte estensioni,
>ad esempio gli exe, hanno icone diverse anche se l'estensione
>rimane quella, come si può fare?
>C'è un modo per capire se l'icona è differente?

Purtroppo no, non lo sai fino a quando non la estrai.
Naturalmente tu puoi farti come avevi accennato all'inizio un meccanismo di caching, ossia una volta estratte le puoi serializzare/salvare in un file esterno che ri-utilizzi quando viene scansionata nuovamente una cartella già scansionata in precedenza in modo da aumentare le performance generali dell'applicazione. Un po' come fa Windows con il file dei thumbnails thumbs.db
cIao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5