最近做了一个查错工具,运用了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 == && fileArra.Length == )
{
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('\\') + ).Contains('.'))
{
filepath1 = filepath.Substring(, filepath.LastIndexOf('.'));
} if (lastfile.Substring(lastfile.LastIndexOf('\\') + ).Contains('.'))
{
lastfile1 = lastfile.Substring(, lastfile.LastIndexOf('.'));
}
//分割文件名
List<string> fName = splitFileName(filepath1);//被判断文件
List<string> fname = splitFileName(lastfile1);//前一个文件
//如果两个文件名都不能被分割
if (fName.Count == && fname.Count == )
{
string path1 = lastfile1.Substring(lastfile1.LastIndexOf("\\") + );
string path2 = filepath1.Substring(filepath1.LastIndexOf("\\") + );
int file1 = int.Parse(path1);
int file2 = int.Parse(path2);
if ((file2 - ) != file1)
{
signfile("不连续文件", filepath);
return;
}
}
//如果两个文件名分割的正确,即分割后数组不为空
else if (fName.Count != && fname.Count != )
{
if (fname[].Equals(fName[]))//判断最后一个分隔符前的字符串相同
{
int file1 = int.Parse(fname[]);
int file2 = int.Parse(fName[]);
if ((file2 - ) != file1)
{
signfile("不连续文件", filepath);//标记文件
}
}
else
{
signfile("不连续文件", filepath);//标记文件
}
}
else
{
if (fName.Count == )
{
signfile("不连续文件", filepath);//标记文件
return;
} if (fname.Count == )
{
signfile("不连续文件", lastfile);//标记文件
return;
}
}
}

检查文件名是否连续的方法

3.按照用户指定分隔符分割文件名

public static List<string> splitFileName(string filepath)
{
string fileName = filepath.Substring(filepath.LastIndexOf('\\') + );
List<string> fNameArr = new List<string>();
string fgf = ToolHelper.GetXmlNumber("ImgInspect", "fgf");
try
{
fNameArr.Add(fileName.Substring(, fileName.LastIndexOf(fgf)));//最后一个分隔符前的字符串
fNameArr.Add(fileName.Substring(fileName.LastIndexOf(fgf) + ));//最后一个分隔符后的字符串
}
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();
}

保存错误信息

winform IO文件操作的更多相关文章

  1. Java IO,io,文件操作,删除文件,删除文件夹,获取文件父级目录

    Java IO,io,文件操作,删除文件,删除文件夹,获取文件父级目录 这里先简单的贴下常用的方法: File.separator //当前系统文件分隔符 File.pathSeparator // ...

  2. (Unity)XML文件读写与IO文件操作类使用介绍

    using System.Xml;                //xml文件操作命名空间 #region 写入操作 void WriteXMLFile(string _fileName) { Xm ...

  3. Linux下普通IO文件操作函数---C语言

    普通文件IO总结 FILE结构体    typedef struct   {       int level; /*填充/清空一级缓存*/     unsigned flag; /*文件状态指针*/ ...

  4. IO文件操作

    × 目录 [1]IO文件的操作 [2]Directory类 [3]File类 [4]FileStream类 [5]文本文件的操作 一.IO文件的操作:   .net中对文件操作,经常会用到这样几个类: ...

  5. Java学习之==>IO文件操作体系

    一.概述 在整个 Java.io 中最重要的就是5个类和一个接口.5个类指的是 File.InputStream.OutputStream.Reader.Writer,一个接口指的是Serializa ...

  6. winform INI文件操作辅助类

    using System;using System.Runtime.InteropServices;using System.Text; namespace connectCMCC.Utils{ // ...

  7. Python3中IO文件操作的常见用法

    首先创建一个文件操作对象: f = open(file, mode, encoding) file指定文件的路径,可以是绝对路径,也可以是相对路径 文件的常见mode: mode = “r”   # ...

  8. java IO文件操作简单基础入门例子,IO流其实没那么难

    IO是JAVASE中非常重要的一块,是面向对象的完美体现,深入学习IO,你将可以领略到很多面向对象的思想.今天整理了一份适合初学者学习的简单例子,让大家可以更深刻的理解IO流的具体操作. 1.文件拷贝 ...

  9. java io 文件操作

    package com.svse; import java.io.File; import java.io.IOException; public class IOTest { public stat ...

随机推荐

  1. elasticsearch 集群、节点、索引、分片、副本概念

    原文链接: https://www.jianshu.com/p/297e13045605 集群(cluster): 由一个或多个节点组成, 并通过集群名称与其他集群进行区分 节点(node): 单个 ...

  2. pycharm 配置使用 flake8 进行语法检测

    打开 PyCharm 在 Terminal 处输入 pip install flake8 在 File ->Settings ->Tools->External Tools 添加一个 ...

  3. 分布式系统全局唯一ID的生成

    分布式系统全局唯一ID的生成 一 .什么是分布式系统唯一ID ​ 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识. ​ 如在金融.电商.支付.等产品的系统中,数据日渐增长,对数据分库分表后 ...

  4. java stream 集合运算

    1.对列表进行分组,构建成一个map对象. 键为用户名称,值为用户对象列表. Person p1 = new Person("张三", new BigDecimal("1 ...

  5. hexo笔记

    目录 hexo 常用指令 站内文章跳转 hexo安装 NexT主题 默认主题 评论插件-gitalk 修改内容区宽度 添加文章阴影 文章摘要设置 一篇文章多个 categories hexo的一些配置 ...

  6. 使用 HuTool时候,遇到Cannot add merged region A1:C1 to sheet because it overlaps with an existing merged region (A1:C1).

    java.lang.IllegalStateException: Cannot add merged region A1:C1 to sheet because it overlaps with an ...

  7. django学习-安装、创建应用、编写视图

    快速安装指南 py -3 -m pip install django >>> import django >>> django.get_version() '2.2 ...

  8. 用python提取xml里面的链接源码

    因群里朋友需要提取xml地图里面的链接,就写了这个程序. 代码: #coding=utf-8 import urllib import urllib.request import re url='ht ...

  9. 莫烦TensorFlow_06 plot可视化

    import tensorflow as tf import numpy as np import matplotlib.pyplot as plt def add_layer(inputs, in_ ...

  10. 【PL/SQL 卡】

    DBA给解决好了,但我不在场,要问一下