• winform IO文件操作


    最近做了一个查错工具,运用了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 + "
    ");
                Writer.Dispose();
                Writer.Close();
                stream.Dispose();
                stream.Close();
            }
    保存错误信息
  • 相关阅读:
    记一次线上Kafka消息堆积踩坑总结
    golang Time to String
    转MongoDB 使用Skip和limit分页
    golang mongodb (mgo)插入或读取文档的字段值为空(nil)问题解决
    Golang 中操作 Mongo Update 的方法
    基础知识
    Linux安全之SSH 密钥创建及密钥登录
    ssh配置authorized_keys后仍然需要输入密码的问题
    SSH隧道技术----端口转发,socket代理
    社会信息化环境下的IT新战略
  • 原文地址:https://www.cnblogs.com/Li232/p/10811398.html
Copyright © 2020-2023  润新知