最近作了一个查错工具,运用了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(); }