最近做了一个查错工具,运用了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. 7.InfluxDB-InfluxQL基础语法教程--INTO子句

    本文翻译自官网,官网地址:(https://docs.influxdata.com/influxdb/v1.7/query_language/data_exploration/) 通过INTO子句,可 ...

  2. openstack 创建实例报错 **aborted: Failed to allocate the network(s), not rescheduling

    消息 Build of instance 6320b5f2-edc2-4e8e-b07c-0047f7ed8f6a aborted: Failed to allocate the network(s) ...

  3. CMS垃圾收集器深入详解

    上一次[https://www.cnblogs.com/webor2006/p/11048407.html]对安全点和安全区进行了理论化的了解,接下来继续对CMS进行其它理论的了解,还是纯理论!!坚持 ...

  4. flask的request如何获取参数

    1.request.form.get("key", type=str, default=None) 获取表单数据 2.request.args.get("key" ...

  5. P4677 山区建小学|区间dp

    P4677 山区建小学 题目描述 政府在某山区修建了一条道路,恰好穿越总共nn个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往.已知任意两个相邻的村庄之间的距离为di 为了提高山区 ...

  6. C#基础表达式语句详解(下)

    书接上文: 4.选择语句:if语句和switch语句 4.1If语句:statement:两种格式:A与B A:If(boolean-expression)embedded-statement(嵌入式 ...

  7. Subversion简介(一)

    Subversion 就是一款实现版本控制的工具软件,通常也称为版本控制器,简称 SVN. Subversion 是 Apache 软件基金会组织下的一个项目. SVN 的工作原理:采取客户端/服务器 ...

  8. Codechef Prime Distance On Tree

    [传送门] FFT第四题! 暑假的时候只会点分,然后合并是暴力合并的...水过去了... 其实两条路径长度的合并就是卷积的过程嘛,每次统计完路径就自卷积一下. 刚开始卷积固定了值域.T了.然后就不偷懒 ...

  9. nwjs-打包

    1: 将项目内所有文件压缩成一个压缩包 app.zip 2: 将压缩包重命名为 app.nw 3: 将压缩包放置到 下载解压后的 nw.js 根目录下 4: shift+鼠标右键 选择在此处打开命令窗 ...

  10. 动态规划 | 对输入进行hash处理的LIS 1045

    把序列M处理为有序序列,并且M不存在的序列要在A中删除. 对A进行了处理之后,执行LIS的操作(O(N^2)复杂度).当然可以优化为对数复杂度的,不过pat不卡这个. LCS解法:动态规划 | 保留重 ...