C 基礎知識系列 17 小工具優化

2021-10-05 21:16:06 字數 2642 閱讀 7447

每次啟動都需要經過漫長的時間去遍歷磁碟裡的檔案目錄

因為資料是用的字典儲存的,所以會消耗大量的記憶體空間

不能多次查詢

現在我們就針對這些問題,讓我們的小工具實用起來。

在動手之前,我們先分析一下問題。在實際開發之前,無論是接到什麼需求都要先仔細分析一下,確定好方案再動手方為開發的正道。嗯,沒毛病。因為開發過程中跟產品對線、跟客戶對線要佔整個專案的一半左右時間。好了,不廢話了。繼續:

遍歷檔案目錄的時間過長,那麼我們是不是可以用非同步併發去遍歷呢?

資料用字典儲存會消耗記憶體空間,那麼我們是不是可以用其他的方式儲存呢?

不能多次查詢,是不是可以使用迴圈,然後設定乙個退出條件?

在c#裡,非同步和併發的實現是依據執行緒、任務來實現的。在之前《c# 基礎知識系列- 12 任務和多執行緒》裡大概介紹了一下執行緒和任務,我們知道執行緒本身是沒法返回資料的,它與主線程進行資料互動的過程十分需要注意執行緒安全。而任務可以返回資料,不需要像執行緒一樣小心翼翼地與主線程進行資料互動。任務有乙個優點,它比執行緒更輕量,所以在當前環境下我們可以試試任務。

當然,執行緒也有優點,那就是執行緒的執行環境相對更封閉一點,它能完成乙個長的大型運算。

using system.threading.tasks;
先提取一組根據可列舉目錄集合建立任務組並取得結果的方法:

public static dictionary> overdirectories(ienumerabledirectories)

然後改造原有的overdirectories方法:

public static dictionary> overdirectories(directoryinfo rootdirectory)

"); var dict = new dictionary>();

ienumerablefiles = new list();

trycatch(exception e)

");//列印錯誤資訊

}foreach(var file in files)

dict[key].add(file.fullname);

}try

catch (system.exception e)

");//列印錯誤資訊

}return dict;

}

理想狀態下,我們的資料應該是儲存在資料庫的,但因為資料庫的操作是在下一系列的教程中,所以目前只能捨棄這個設想。

那麼,利用現有方式,我們可以使用檔案作為快取的方式,也就是說把資料儲存在檔案裡,在需要的時候從檔案中讀取出來。這時候就需要一組操作檔案的方法。

首先,宣告乙個靜態變數:

public static readonly string tempfile = "temp.txt";
然後編寫讀取、存放資料的方法:

public static void writelinestotemp(listlines)

public static listsearch(string file)

這時候在檔案中存放的都是路徑檔案,所以需要重新修改遍歷檔案路徑的方法,只保留路徑:

public static listoverdirectories(directoryinfo rootdirectory)

"); listfiles = new list();

try下 找到 檔案: 個");

}catch(exception e)

中\t錯誤資訊:");//列印錯誤資訊

}try

catch (system.exception e)

時發生錯誤:");

}return files;

}public static void overdirectories(ienumerabledirectories)}}

最後修改主方法,設定啟動時遍歷路徑的規則:

static void main(string args)

console.writeline("請輸入要查詢的檔名:");

var search = console.readline().trim();

}

設定使用者輸入q或q的時候退出程式,這時候就需要改造main方法了:

static void main(string args)

while(true)

console.writeline("查詢中……");

var results = search(search);

console.writeline("查詢結果:");

foreach(var r in results)

}console.writeline("程式已退出!");

}

在main 方法裡加了很多提示語句,以方便使用。

以上是第一次實戰課的所有內容。歡迎各位小夥伴們踴躍討論。這個小工具並不完善,但是隨著我們對.net core的了解和深入就會寫的得心應手了。

C 基礎 呼叫CMD的乙個小工具

由於經常要使用cmd的一些命令,比如檢視ip,ping乙個 之類的。於是就寫了乙個呼叫cmd.exe的小工具。主要就是實現這樣乙個事情 呼叫cmd.exe然後傳給它我想要執行的命令,最後獲取結果。介面 主要執行 using system.diagnostics using system.io nam...

C 基礎知識系列之 for迴圈

c 的for迴圈提供的迭代迴圈機制是在執行下一次迭代前,測試是否滿足某個條件,其語法如下 for initializer,condition,iterator statement s 其中 initializer是指在執行第一次迭代前要計算的表示式 通常把乙個區域性變數初始化為迴圈計數器 condi...

C 基礎知識梳理系列索引

摘 要 這個系列,將從山腳寫到山腰。由於鄙人知識匱乏,不敢奢望攀登山頂。c target runtime v4.0.30319 系列索引 c 基礎知識梳理系列一 clr及程式集部署 c 基礎知識梳理系列二 c 的演繹大師 型別 c 基礎知識梳理系列三 c 類成員 常量 字段 屬性 c 基礎知識梳理系...