Hej, Vad händer om du bara skriver ut filnamnen med Console.WriteLine eller liknande och inte använder din ListView? Eventuellt kan den replace du gör vara lite småseg. Lägg till listView.BeginUpdate() innan du börjar uppdatera listan och listView.EndUpdate() när du är klar så skall du se att du får upp prestandan lite. Det gick _väldigt_ mycket snabbare om jag bara lade till filnamnen i en sträng och sen visade den i en MessageBox. Ungefär 15 millisekunder tog det. Men jag vill ju gärna ha det i en ListView. Det jag skulle satsa på är att lägga alla filnamn i en ArrayList. När du sedan gått igenom hela din struktur kan du skapa en ListViewItemCollection och sedan bara sätta ListView.Items = dinCollection. Det blir en del fixande för att skapa en ListViewItemCollection från en vanlig Collection, men det kanske det är värt. Hej, Seg rekursiv funktion
Håller på med ett program som behöver lista alla filer och undermappar i en ListView.
Problemet är att det är riktigt segt. Jag använder DirectoryInfo och FileInfo och en foreach-sats.
Funktionen körs också på en egen tråd.
Jag läste någonstans att foreach-satsen kunde vara seg ibland och bytte därför till en vanlig for-sats, men det fungerade inte heller. Då provade jag att använda Win32 API (FindFirstFile, FindNextFile, FindClose) men det gick inte snabbare för det.
Andra program jag har provat listar allting på ~2 sekunder och då är det en mapp med ~850 filer, ~50 undermappar och med ett djup på högst 3 mappar. Med mitt program tar det ungefär lika långt tid, men då med en mapp med ~100 filer, 9 undermappar och ett djup på högst 2 mappar.
Min kod ser ut ungefär såhär just nu:
<code>
public void GetFilesAndDirectoriesRecursive(DirectoryInfo myParentDirectory)
{
ListViewItem myNewItem;
FileInfo[] myFiles = myParentDirectory.GetFiles();
foreach(FileInfo myFile in myFiles)
{
myNewItem = new ListViewItem(myFile.FullName.Replace(treeViewDirectories.SelectedNode.Tag.ToString() + "\\", ""), 2);
myNewItem.SubItems.Add("");
myNewItem.SubItems.Add("");
myNewItem.SubItems.Add(ConvertBytes(myFile.Length));
myNewItem.SubItems.Add(myFile.Extension.Replace(".", "").ToUpper());
myNewItem.SubItems.Add(myFile.CreationTime.ToShortDateString());
myNewItem.SubItems.Add(myFile.LastWriteTime.ToShortDateString());
myNewItem.SubItems.Add(myFile.LastAccessTime.ToShortDateString());
myNewItem.Tag = myFile.FullName;
//if-satser som kollar med olika filter om filen ska läggas till
}
DirectoryInfo[] myDirectories = myParentDirectory.GetDirectories();
foreach(DirectoryInfo myDirectory in myDirectories)
{
//if-satser som kollar med olika filter om mappen ska läggas till
GetFilesAndDirectoriesRecursive(myDirectory);
}
}
</code>
Någon som kan ge tips på hur jag kan få det att gå snabbare?Sv: Seg rekursiv funktion
Sv:Seg rekursiv funktion
Sv:Seg rekursiv funktion
Jag har stegvis kommenterat bort olika delar och det är när man skapar en ny ListViewItem det blir segt. Det har nog inget, eller väldigt lite att göra med den replace jag kör.
Nu är frågan hur jag gör för att snabba upp den biten.
Edit: Patrik, det har jag redan. Syns dock inte i koden jag visade.Sv: Seg rekursiv funktion
Sv:Seg rekursiv funktion
Hittade lite information här: http://www.pcreview.co.uk/forums/thread-1315025.php
Det står att Add() är väldigt seg och att det går mycket snabbare om man lägger sina items i en ListViewItem-array och sedan använder AddRange().
Jag provar detta och återkommer.