实例介绍
按行读文件
核心代码:
using System; using System.IO; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; namespace Junior.Utils { class FileReader : IDisposable { private string fileExt = null; private FileStream fs = null; private StreamReader sr = null; private string path = string.Empty; private Encoding encode = Encoding.Default; private FileInfo fileInfo = null; private bool eof; #region FileSize /// <summary> /// 文件大小 /// </summary> public long FileSize { get { if (fileInfo != null) return fileInfo.Length; fileInfo = new FileInfo(path); return fileInfo.Length; } } #endregion #region FileClusterSize //// <summary> /// 结构。硬盘信息 /// </summary> private struct DiskInfo { //public string RootPathName; //每簇的扇区数 public int SectorsPerCluster; //每扇区字节 public int BytesPerSector; //public int NumberOfFreeClusters; //public int TotalNumberOfClusters; } //调用windows API获取磁盘空闲空间 //导入库 [DllImport("kernel32.dll", CharSet = CharSet.Auto)] static extern bool GetDiskFreeSpace([MarshalAs(UnmanagedType.LPTStr)]string rootPathName, ref int sectorsPerCluster, ref int bytesPerSector, ref int numberOfFreeClusters, ref int totalNumbeOfClusters); private DiskInfo GetDiskInfo(string rootPathName) { DiskInfo diskInfo = new DiskInfo(); int sectorsPerCluster = 0, bytesPerSector = 0, numberOfFreeClusters = 0, totalNumberOfClusters = 0; GetDiskFreeSpace(rootPathName, ref sectorsPerCluster, ref bytesPerSector, ref numberOfFreeClusters, ref totalNumberOfClusters); //每簇的扇区数 diskInfo.SectorsPerCluster = sectorsPerCluster; //每扇区字节 diskInfo.BytesPerSector = bytesPerSector; return diskInfo; } /// <summary> /// 文件每簇的字节 /// </summary> public long FileClusterSize { get { long clusterSize = 0; DiskInfo diskInfo = new DiskInfo(); diskInfo = GetDiskInfo(fileInfo.Directory.Root.FullName); clusterSize = (diskInfo.BytesPerSector * diskInfo.SectorsPerCluster); return clusterSize; } } #endregion public long FileSizeOnDisk { get { long temp = 0; long clusterSize = FileClusterSize; if (fileInfo.Length % clusterSize != 0) { decimal res = fileInfo.Length / clusterSize; int clu = Convert.ToInt32(Math.Ceiling(res)) 1; temp = clusterSize * clu; } else { return fileInfo.Length; } return temp; } } public bool EOF { get { try { return sr.EndOfStream; } catch { eof = true; return eof; } } } /// <summary> /// 获取总行数 - 会重新创建文件流 /// </summary> public int TotalLines { get { using (FileStream tempfs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { int count = 0; using (StreamReader tempsr = new StreamReader(tempfs, encode)) { while (!tempsr.EndOfStream) { count ; tempsr.ReadLine(); } } return count; } } } /// <summary> /// 创建一个读文件对象 /// </summary> /// <param name="path"></param> public FileReader(string path) { try { this.path = path; fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); sr = new StreamReader(fs, Encoding.Default); fileExt = Path.GetExtension(path); fileInfo = new FileInfo(path); } catch { throw new FileNotFoundException("文件未找到"); } } public FileReader(string path, Encoding encoding) { try { this.path = path; encode = encoding; fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); sr = new StreamReader(fs, encoding); fileExt = Path.GetExtension(path); fileInfo = new FileInfo(path); } catch { throw new FileNotFoundException("文件未找到"); } } public List<string> AutoReadToList(bool filterDuplicate) { switch (fileExt) { case ".txt": return this.ReadTxtToList(filterDuplicate); case ".csv": return this.ReadCsvToList(0, filterDuplicate); default: throw new Exception("不能读取" fileExt "扩展名的文件"); } } /// <summary> /// 读取Txt中的行到list中 /// </summary> /// <param name="filterSame">是否过滤重复</param> /// <returns>Line List</returns> public List<string> ReadTxtToList(bool filterDuplicate) { List<string> lineList = null; string line = ""; //判断读文件流是否为空 if (sr != null) { //是否过滤重复 if (filterDuplicate) { lineList = new List<string>(); while (!sr.EndOfStream) { line = sr.ReadLine(); if (line.Trim().Length > 0) if (!lineList.Contains(line)) { lineList.Add(line); } } } else { lineList = new List<string>(); while (!sr.EndOfStream) { line = sr.ReadLine(); if (line.Trim().Length > 0) lineList.Add(line); } } } line = null; return lineList; } /// <summary> /// 读取Csv文件暂时不支持带","的列 /// </summary> /// <param name="nReadColumn">读取第几行</param> /// <param name="filterDuplicate">是否过滤重复</param> /// <returns>返回List</returns> public List<string> ReadCsvToList(int nReadColumn, bool filterDuplicate) { List<string> filedList = null; string[] splitTest = null; //判断读文件流是否为空 if (sr != null) { //是否过滤重复 if (filterDuplicate) { filedList = new List<string>(); while (!sr.EndOfStream) { splitTest = sr.ReadLine().Split(','); if (splitTest[nReadColumn].Trim().Length > 0) if (!filedList.Contains(splitTest[nReadColumn])) filedList.Add(splitTest[nReadColumn]); } } else { filedList = new List<string>(); while (!sr.EndOfStream) { splitTest = sr.ReadLine().Split(','); if (splitTest[nReadColumn].Trim().Length > 0) filedList.Add(splitTest[nReadColumn]); } } } splitTest = null; return filedList; } /// <summary> /// 读Txt文件中的链接到Dictionary中按照域名分组 /// </summary> /// <param name="filterDuplicate">是否过滤重复</param> /// <returns>Dictionary按照域名分组后的对象</returns> public Dictionary<string, List<string>> ReadTXTFileToDictionaryWithDomain(bool filterDuplicate) { Dictionary<string, List<string>> dictionary = new Dictionary<string, List<string>>(); Uri uri = null; string line = ""; //判断读文件流是否为空 if (sr != null) { //是否过滤重复 if (filterDuplicate) { while (!sr.EndOfStream) { line = sr.ReadLine(); if (line.Trim().Length > 0) { try { uri = new Uri(line); if (dictionary.ContainsKey(uri.Host)) { if (!dictionary[uri.Host].Contains(line)) { dictionary[uri.Host].Add(line); } } else { dictionary.Add(uri.Host, new List<string>()); dictionary[uri.Host].Add(line); } } catch { //string msg = "出错啦"; } } } } else { while (!sr.EndOfStream) { line = sr.ReadLine(); if (line.Trim().Length > 0) { try { uri = new Uri(line); if (dictionary.ContainsKey(uri.Host)) { dictionary[uri.Host].Add(line); } else { dictionary.Add(uri.Host, new List<string>()); dictionary[uri.Host].Add(line); } } catch { //string msg = "出错啦"; } } } } } line = null; return dictionary; } public string ReadTXTLine() { if (!sr.EndOfStream) { return sr.ReadLine(); } return null; } public string ReadToEnd() { if (!sr.EndOfStream) { return sr.ReadToEnd(); } return null; } /// <summary> /// 关闭流 /// </summary> public void Close() { if (this.sr != null) sr.Close(); if (this.fs != null) fs.Close(); } /// <summary> /// 释放此对象引用的所有资源 /// </summary> public void Dispose() { if (this.sr != null) sr.Close(); if (this.fs != null) fs.Close(); if (this.sr != null) sr.Dispose(); if (this.fs != null) fs.Dispose(); } } }
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论