我一直在研究“檔案資源管理器”專案一段時間,作為一個學習專案,并通過嘗試新的編碼方式獲得一些樂趣。到目前為止,一切進展順利,我對自己設法解決的問題感到非常滿意。我遇到的障礙是速度。在 Windows 資源管理器中,如果您進入一個新目錄,它(當然取決于版本和其他變數)只需要幾分鐘即可列出所有檔案和子目錄。另一方面,我的應用程式仍然相當快,但是目錄中的專案越多,速度就會非常明顯。
我有這個功能,我在“導航”功能中呼叫它。我相信這是我可能會找到罪魁禍首和解決方案的地方:
private void GetDirectoryContent(string directory)
{
txtPath.Text = directory;
currentDirectoryFiles.Clear();
filesList.Items.Clear();
int longestName = 0;
int longestType = 0;
foreach (string item in Directory.GetDirectories(directory))
{
int nameLength = item.Substring(item.LastIndexOf('\\') 1).Length;
if (nameLength > longestName) longestName = nameLength;
if ("Folder".Length > longestType) longestType = "Folder".Length;
}
foreach (string item in Directory.GetFiles(directory))
{
int nameLength = item.Substring(item.LastIndexOf('\\') 1).Length;
if (nameLength > longestName) longestName = nameLength;
if (GetFileType(item).Length > longestType) longestType = GetFileType(item).Length;
}
filesList.Sorting = SortOrder.Ascending;
filesList.View = View.Details;
filesList.Columns.Clear();
filesList.Columns.Add("Name", longestName * 8);
filesList.Columns.Add("Date Modified", 160);
filesList.Columns.Add("Type", longestType * 8);
foreach (string item in Directory.GetDirectories(directory))
{
string name = item.Substring(item.LastIndexOf('\\') 1);
smallImageList.Images.Add(new Bitmap(Environment.CurrentDirectory "\\Xplorer.ico"));
ListViewItem row = new ListViewItem(name, smallImageList.Images.Count - 1); // Name
row.SubItems.Add(Directory.GetLastWriteTime(item).ToString(CultureInfo.CurrentCulture)); // Date Modified
row.SubItems.Add("Folder"); // Type
row.Tag = "Folder";
currentDirectoryFiles.Add(item);
filesList.Items.Add(row);
}
foreach (string item in Directory.GetFiles(directory))
{
string name = item.Substring(item.LastIndexOf('\\') 1);
smallImageList.Images.Add(Icon.ExtractAssociatedIcon(item) ?? throw new InvalidOperationException());
ListViewItem row = new ListViewItem(name, smallImageList.Images.Count - 1); // Name
row.SubItems.Add(File.GetLastWriteTime(item).ToString(CultureInfo.CurrentCulture)); // Date Modified
row.SubItems.Add(GetFileType(item)); // Type
row.Tag = "File";
currentDirectoryFiles.Add(item);
filesList.Items.Add(row);
}
}
我仍然是一個新手程式員,所以我知道很多這段代碼可能會被壓縮,但我實際上不知道如何壓縮,所以這就是我的主要問題。我怎樣才能壓縮/優化這個函式來加速結果(并且只是為了在以后的專案中遵循更好的實踐。)
如果我遺漏了您可能需要的任何細節,請告訴我,因為我說我還是個新手,不知道什么可能有幫助。提前致謝!
uj5u.com熱心網友回復:
似乎是學習專案的不錯選擇:) 也許使用 DirectoryInfo 而不是使用字串進行搜索。它會讓你更容易,而且可能會快一點
private void GetDirectoryContent(DirectoryInfo directory)
{
//you could also leave it as string and write var dir = new DirectoryInfo(directory);
/*...*/
foreach (DirectoryInfo item in directory.GetDirectories())
{
string name = item.Name; //.FullName would include the path
smallImageList.Images.Add(new Bitmap(Environment.CurrentDirectory "\\Xplorer.ico"));
ListViewItem row = new ListViewItem(name, smallImageList.Images.Count - 1);
row.SubItems.Add(item.LastWriteTime.ToString(CultureInfo.CurrentCulture))
row.SubItems.Add("Folder"); // Type
row.Tag = "Folder";
currentDirectoryFiles.Add(item);
filesList.Items.Add(row);
}
foreach (FileInfo item in directory.GetFiles())
{
/* also knows its name, extension, last write time, ...*/
}
/*...*/
}
如果你走得更遠一點并且感覺舒服,也許還可以嘗試一些新東西。我認為對你的學習專案有用的東西是 IEnumerables 或遞回之類的東西(它對像檔案系統這樣的樹狀結構非常有用)
uj5u.com熱心網友回復:
感謝大家的幫助!這是一個新功能,它作業得非常快!
private void GetDirectoryContent(string directory)
{
txtPath.Text = directory;
currentDirectoryFiles.Clear();
filesList.Items.Clear();
string[] files = Directory.EnumerateFiles(directory).ToArray();
string[] directories = Directory.EnumerateDirectories(directory).ToArray();
filesList.Sorting = SortOrder.Ascending;
filesList.View = View.Details;
filesList.Columns.Clear();
filesList.Columns.Add("Name", 250);
filesList.Columns.Add("Date Modified", 160);
filesList.Columns.Add("Type", 125);
foreach (string item in directories)
{
string name = item.Substring(item.LastIndexOf('\\') 1);
smallImageList.Images.Add(new Bitmap(Environment.CurrentDirectory "\\Xplorer.ico"));
ListViewItem row = new ListViewItem(name, smallImageList.Images.Count - 1); // Name
row.SubItems.Add(Directory.GetLastWriteTime(item).ToString(CultureInfo.CurrentCulture)); // Date Modified
row.SubItems.Add("Folder"); // Type
row.Tag = "Folder";
currentDirectoryFiles.Add(item);
filesList.Items.Add(row);
}
foreach (string item in files)
{
string name = item.Substring(item.LastIndexOf('\\') 1);
smallImageList.Images.Add(Icon.ExtractAssociatedIcon(item) ?? throw new InvalidOperationException());
ListViewItem row = new ListViewItem(name, smallImageList.Images.Count - 1); // Name
row.SubItems.Add(File.GetLastWriteTime(item).ToString(CultureInfo.CurrentCulture)); // Date Modified
row.SubItems.Add(GetFileType(item)); // Type
row.Tag = "File";
currentDirectoryFiles.Add(item);
filesList.Items.Add(row);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/370687.html
