winform IO文件操做

最近作了一個查錯工具,運用了winform文件操做的知識,作了幾點總結,不全面,只總結了幾點項目裏用過的知識(關於如下內容只是我的的理解和總結,不對的地方請多指教,有補充的能夠評論留言你們一塊兒討論學習)。數組

一:基礎知識ide

1.根據文件路徑獲得文件夾對象:DirectoryInfo di = new DirectoryInfo(filepath);工具

2.根據文件路徑獲得路徑下全部的子目錄的名稱(包含路徑)的集合:學習

string[] diArray = Directory.GetDirectories(filepath);//獲得文件夾下的文件夾的集合spa

string[] fiArray = Directory.GetFiles(filepath);//獲得文件夾下文件的集合(包含文件路徑)3d

二:關於文件操做速度慢的緣由:code

由於之前沒怎麼用到夠winform io文件這一塊的操做知識,因此在項目中遇到不少問題,尤爲是運行速度這一塊,我發現並總結了如下幾點致使程序運行緩慢的緣由:orm

  1.封裝了對文件進行操做的方法時,在傳參時儘可能不要傳文件對象,而是傳路徑,由於每次實例化對象時都在程序內部佔了存儲,咱們在傳對象做爲參數的時候雖然方便了,可是也佔了內存了。儘可能減小對文件對象的實例化對象

  2.實例化文件對象後,在用完以後進行釋放掉。file.Dispose();blog

  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();
        }
保存錯誤信息
相關文章
相關標籤/搜索