最近做了一個查錯工具,運用了winform文件操作的知識,做了幾點總結,不全面,只總結了幾點項目里用過的知識(關於以下內容只是個人的理解和總結,不對的地方請多指教,有補充的可以評論留言大家一起討論學習)。 一:基礎知識 1.根據文件路徑得到文件夾對象:DirectoryInfo di = new D ...
最近做了一個查錯工具,運用了winform文件操作的知識,做了幾點總結,不全面,只總結了幾點項目里用過的知識(關於以下內容只是個人的理解和總結,不對的地方請多指教,有補充的可以評論留言大家一起討論學習)。
一:基礎知識
1.根據文件路徑得到文件夾對象:DirectoryInfo di = new DirectoryInfo(filepath);
2.根據文件路徑得到路徑下所有的子目錄的名稱(包含路徑)的集合:
string[] diArray = Directory.GetDirectories(filepath);//得到文件夾下的文件夾的集合
string[] fiArray = Directory.GetFiles(filepath);//得到文件夾下文件的集合(包含文件路徑)
二:關於文件操作速度慢的原因:
因為以前沒怎麼用到夠winform io文件這一塊的操作知識,所以在項目中遇到很多問題,尤其是運行速度這一塊,我發現並總結了以下幾點導致程式運行緩慢的原因:
1.封裝了對文件進行操作的方法時,在傳參時儘量不要傳文件對象,而是傳路徑,因為每次實例化對象時都在程式內部占了存儲,我們在傳對象作為參數的時候雖然方便了,但是也占了記憶體了。儘量減少對文件對象的實例化
2.實例化文件對象後,在用完之後進行釋放掉。file.Dispose();
3.得到圖片對象時,儘量不要用Image im = Image.FromFile(path);因為我做圖像解析度查錯時,用了這個得到對象,225張圖片判斷解析度用了三十多秒才查出來,檢查了很久都沒找到問題,後來發現是這句代碼的問題,我改成了下麵這兩句代碼就解決了
FileStream myFileStream = new FileStream(path, FileMode.Open, FileAccess.Read);
Image img = Image.FromStream(myFileStream, false, false);
三:查錯工具一:圖像查錯之邏輯代碼
1.檢查文件夾是不是空文件夾
/// <summary> /// 檢查是否是空文件夾 /// </summary> /// <param name="di"></param> public static void checkEmptyFile(string di) { string[] fileArra = Directory.GetFiles(di); string[] filesArra = Directory.GetDirectories(di); if (filesArra.Length == 0 && fileArra.Length == 0) { signfile("空文件夾", di); } }文件夾是否為空的方法
2.檢查文件名是否連續
/// <summary> /// 檢查文件名是否連續 /// </summary> /// <param name="filepath">被判斷的文件路徑</param> /// <param name="lastfile">被判斷文件夾的前一個文件路徑</param> public static void checkFilesName(string filepath, string lastfile) { string filepath1 = filepath; string lastfile1 = lastfile; //根據文件路徑得到文件名 if (filepath.Substring(filepath.LastIndexOf('\\') + 1).Contains('.')) { filepath1 = filepath.Substring(0, filepath.LastIndexOf('.')); } if (lastfile.Substring(lastfile.LastIndexOf('\\') + 1).Contains('.')) { lastfile1 = lastfile.Substring(0, lastfile.LastIndexOf('.')); } //分割文件名 List<string> fName = splitFileName(filepath1);//被判斷文件 List<string> fname = splitFileName(lastfile1);//前一個文件 //如果兩個文件名都不能被分割 if (fName.Count == 0 && fname.Count == 0) { string path1 = lastfile1.Substring(lastfile1.LastIndexOf("\\") + 1); string path2 = filepath1.Substring(filepath1.LastIndexOf("\\") + 1); int file1 = int.Parse(path1); int file2 = int.Parse(path2); if ((file2 - 1) != file1) { signfile("不連續文件", filepath); return; } } //如果兩個文件名分割的正確,即分割後數組不為空 else if (fName.Count != 0 && fname.Count != 0) { if (fname[0].Equals(fName[0]))//判斷最後一個分隔符前的字元串相同 { int file1 = int.Parse(fname[1]); int file2 = int.Parse(fName[1]); if ((file2 - 1) != file1) { signfile("不連續文件", filepath);//標記文件 } } else { signfile("不連續文件", filepath);//標記文件 } } else { if (fName.Count == 0) { signfile("不連續文件", filepath);//標記文件 return; } if (fname.Count == 0) { signfile("不連續文件", lastfile);//標記文件 return; } } }檢查文件名是否連續的方法
3.按照用戶指定分隔符分割文件名
public static List<string> splitFileName(string filepath) { string fileName = filepath.Substring(filepath.LastIndexOf('\\') + 1); List<string> fNameArr = new List<string>(); string fgf = ToolHelper.GetXmlNumber("ImgInspect", "fgf"); try { fNameArr.Add(fileName.Substring(0, fileName.LastIndexOf(fgf)));//最後一個分隔符前的字元串 fNameArr.Add(fileName.Substring(fileName.LastIndexOf(fgf) + 1));//最後一個分隔符後的字元串 } catch (Exception ex) { //throw; } return fNameArr; }指定字元分割文件名
4.查詢圖像解析度
/// <summary> /// 根據解析度查錯 /// </summary> /// <param name="path"></param> public static void checkImageDpi(string path) { try { FileStream myFileStream = new FileStream(path, FileMode.Open, FileAccess.Read); Image img = Image.FromStream(myFileStream, false, false); //得到用戶輸入的解析度 int dpi = int.Parse(ckImageMethod.strDpi); //獲取此圖形的水平解析度(即水平dpi)(以像素/英寸為單位) int dpiX = (int)img.HorizontalResolution; //垂直解析度 int dpiY = (int)img.VerticalResolution; if (dpiX != dpi || dpiY != dpi) { signfile("dpi不正確圖片", path); } img.Dispose(); myFileStream.Dispose(); } catch (Exception ex) { ToolHelper.ErrorInfoSave("圖片Dpi:" + path + ex.Message); } }圖像解析度查錯
5.保存錯誤信息到錯誤文檔,創建txt文檔保存
/// <summary> /// 保存錯誤信息到文本文檔 /// </summary> /// <param name="StrError">錯誤信息</param> public static void ErrorInfoSave(string StrError) { string TxtName = DateTime.Now.ToString("yyyyMMddhhmmss") + "_Error.txt"; string TxtPath = System.AppDomain.CurrentDomain.BaseDirectory + @"Error"; if (!Directory.Exists(TxtPath)) { Directory.CreateDirectory(TxtPath); } FileStream stream = new FileStream(TxtPath + @"\" + TxtName, FileMode.Create); StreamWriter Writer = new StreamWriter(stream); Writer.WriteLine(StrError + "\r\n"); Writer.Dispose(); Writer.Close(); stream.Dispose(); stream.Close(); }保存錯誤信息