C#个人珍藏基础类库分享 — 3、目录、文件帮助类FileHelper
admin
2024-04-27 07:43:25
0

       做.NET后台开发的同学,对缓存处理一定不陌生,这里把我混迹C#圈子十余载珍藏的基础类库分享出来,希望能够给刚踏入开发门槛的朋友一些帮助。

        后续我会逐步分享基础库的其余部分,先列个大纲:

C#个人珍藏基础类库分享 — 1、通用缓存帮助类CacheHelper

C#个人珍藏基础类库分享 — 2、Memcached缓存帮助类MemcachedHelper

C#个人珍藏基础类库分享 — 3、目录、文件帮助类FileHelper

C#个人珍藏基础类库分享 — 4、字节数组帮助类BytesObjectHelper

C#个人珍藏基础类库分享 — 5、日志帮助类LogHelper

C#个人珍藏基础类库分享 — 6、数据库处理帮助类SqlHelper

C#个人珍藏基础类库分享 — 7、Xml处理帮助类XmlHelper

C#个人珍藏基础类库分享 — 8、通用工具帮助类ToolHelper
 

直接进入主题,文件处理类主要包括以下方法:

1、获得指定(文件或目录)相对路径的物理路径

2、确保目录存在,如果目录不存在,则创建目录(包括上级目录)

3、确保文件存在,如果文件目录不存在,则创建目录(包括上级目录)

4、将默认编码类型(Unicode)的字符串,追加至指定文件

5、将指定编码类型的字符串,追加至指定文件

6、将默认编码类型(Unicode)的字符串,写入指定文件

7、将指定编码类型的字符串,写入指定文件

8、依据默认编码类型(Unicode),获取指定文件、指定范围的字符

9、依据指定的编码类型,获取指定文件、指定范围的字符

10、基于默认编码类型(Unicode),将字节数组追加至指定的二进制文件

11、基于所提供编码类型,将字节数组追加至指定的二进制文件

12、基于默认编码类型(Unicode),将字节数组写入指定的二进制文件

13、基于所提供编码类型,将字节数组写入指定的二进制文件

14、依据默认编码类型(Unicode),获取指定文件、指定范围的二进制数据

15、依据指定的编码类型,获取指定文件、指定范围的二进制数据

源码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.IO;
using Microsoft.Win32.SafeHandles;namespace BaseUtilities
{/// /// 目录、文件与文件内容相关,常用的处理方法集合。/// public class FileHelper{#region Path & Directory & File/// /// 获得指定(文件或目录)相对路径的物理路径。/// 支持 Web 程序、Windows 服务程序、控制台等程序。/// /// 相对路径/// 返回指定相对路径的物理路径(异常时返回值为 Null)。public static string GetMapPath(string path){try{if (HttpContext.Current != null)return HttpContext.Current.Server.MapPath(path);elsereturn Path.Combine(AppDomain.CurrentDomain.BaseDirectory, path);}catch (Exception ex){LogHelper.Error("Sxmobi.FileHelper", null, ex);return null;}}/// /// 确保目录存在。/// 如果目录不存在,则创建目录(包括上级目录)。/// /// 目录路径(不含文件名)/// 返回一个 Boolean 值,如果目录不存在且创建目录出现异常时,返回值为 False。public static bool EnsureDir(string path){try{if (Directory.Exists(path))return true;if (EnsureDir(Directory.GetParent(path).ToString())){Directory.CreateDirectory(path);return true;}return false;}catch (Exception ex){LogHelper.Error("Sxmobi.FileHelper", null, ex);return false;}}/// /// 确保文件存在。/// 如果文件目录不存在,则创建目录(包括上级目录)。/// /// 文件路径/// 返回一个 Boolean 值,如果目录或文件不存在且创建它们出现异常时,返回值为 False。public static bool EnsureFile(string path){try{if (File.Exists(path))return true;if (EnsureDir(Directory.GetParent(path).ToString())){File.Create(path).Close();return true;}return false;}catch (Exception ex){LogHelper.Error("Sxmobi.FileHelper", null, ex);return false;}}#endregion#region Text 相关/// /// 将默认编码类型(Unicode)的字符串,追加至指定文件。/// 系统推荐使用默认的 Unicode 编码类型格式来进行文字的读取与写入。/// 方法将确保目录与文件存在/// /// 文件路径/// 需要写入的字符/// 指定是否将字符串写入新行/// 返回一个 Boolean 值,如果指定的目录、文件不存在且创建它们(或写入字符时)出现异常,返回值为 False。public static bool AddFileText(string path, string text, bool isNewLine){return AddFileText(path, Encoding.Unicode, text, isNewLine);}/// /// 将指定编码类型的字符串,追加至指定文件。/// 方法将确保目录与文件存在。/// 系统推荐使用默认的 Unicode 编码类型格式来进行文字的读取与写入。/// /// 文件路径/// 编码类型/// 需要写入的字符/// 指定是否将字符串写入新行/// 返回一个 Boolean 值,如果指定的目录、文件不存在且创建它们(或写入字符时)出现异常,返回值为 False。public static bool AddFileText(string path, Encoding encodingType, string text, bool isNewLine){if (!EnsureFile(path))return false;try{using (FileStream fs = new FileStream(path, FileMode.Append, FileAccess.Write, FileShare.ReadWrite)){using (StreamWriter sw = new StreamWriter(fs, encodingType)){if (isNewLine)sw.WriteLine(text);elsesw.Write(text);}}return true;}catch (Exception ex){LogHelper.Error("Sxmobi.FileHelper", null, ex);return false;}}/// /// 将默认编码类型(Unicode)的字符串,写入指定文件。/// 方法将确保目录与文件存在。/// 系统推荐使用默认的 Unicode 编码类型格式来进行文字的读取与写入。/// /// 文件路径/// 需要写入的字符/// 返回一个 Boolean 值,如果指定的目录、文件不存在且创建它们(或写入字符时)出现异常,返回值为 False。public static bool SetFileText(string path, string text){return SetFileText(path, Encoding.Unicode, text);}/// /// 将指定编码类型的字符串,写入指定文件。/// 方法将确保目录与文件存在。/// 系统推荐使用默认的 Unicode 编码类型格式来进行文字的读取与写入。/// /// 文件路径/// 编码类型/// 需要写入的字符/// 返回一个 Boolean 值,如果指定的目录、文件不存在且创建它们(或写入字符时)出现异常,返回值为 False。public static bool SetFileText(string path, Encoding encodingType, string text){if (!EnsureDir(Directory.GetParent(path).ToString()))return false;try{using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.ReadWrite)){using (StreamWriter sw = new StreamWriter(fs, encodingType)){sw.Write(text);}}return true;}catch (Exception ex){LogHelper.Error("Sxmobi.FileHelper", null, ex);return false;}}/// /// 依据默认编码类型(Unicode),获取指定文件、指定范围的字符。/// 系统推荐使用默认的 Unicode 编码类型格式来进行文字的读取与写入。/// /// 文件路径/// 指定要获取内容的起始索引位置(例如文件内容:“类型 FileHelper 是...”,如果 index 设置为 3,则取得字符串“FileHelper 是...”)/// 指定要获取内容的长度,内容读取长度设置不宜过大,以避免内存溢出/// 返回 String 类型值,当文件不存在或其它异常时,返回值为 Null。public static string GetFileText(string path, int index, int count){return GetFileText(path, Encoding.Unicode, index, count);}/// /// 依据指定的编码类型,获取指定文件、指定范围的字符。/// 系统推荐使用默认的 Unicode 编码类型格式来进行文字的读取与写入。/// /// 文件路径/// 编码类型/// 指定要获取内容的起始索引位置(例如文件内容:“类型 FileHelper 是...”,如果 index 设置为 3,则取得字符串“FileHelper 是...”)/// 指定要获取内容的长度,内容读取长度设置不宜过大,以避免内存溢出/// 返回 String 类型值,当文件不存在或其它异常时,返回值为 Null。public static string GetFileText(string path, Encoding encodingType, int index, int count){try{if (!File.Exists(path))return null;int maxReads = 10000;char[] tempChars = new char[maxReads];char[] chars = new char[count];int loopCount = index / maxReads;int tempIndex = index % maxReads;using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)){using (StreamReader sr = new StreamReader(fs, encodingType)){// 如果起始索引超过 1W 个字符,则以 1W 个字符为单位,循环丢弃起始索引之前的所有字符,以避免内存开销过大。while (loopCount-- > 0)sr.ReadBlock(tempChars, 0, maxReads);sr.ReadBlock(tempChars, 0, tempIndex);sr.ReadBlock(chars, 0, count);}}return new string(chars);}catch (Exception ex){LogHelper.Error("Sxmobi.FileHelper", null, ex);return null;}}#endregion#region Binary 相关/// /// 基于默认编码类型(Unicode),将字节数组追加至指定的二进制文件/// /// 二进制文件/// 字节数组/// 返回一个 Boolean 值,如果指定的目录、文件不存在且创建它们(或写入二进制数据时)出现异常,返回值为 False。public static bool AddFileBinary(string path, byte[] bytes){return AddFileBinary(path, Encoding.Unicode, bytes);}/// /// 基于所提供编码类型,将字节数组追加至指定的二进制文件/// /// 二进制文件/// 编码类型/// 字节数组/// 返回一个 Boolean 值,如果指定的目录、文件不存在且创建它们(或写入二进制数据时)出现异常,返回值为 False。public static bool AddFileBinary(string path, Encoding encodingType, byte[] bytes){if (!EnsureDir(Directory.GetParent(path).ToString()))return false;try{using (FileStream fs = new FileStream(path, FileMode.Append, FileAccess.Write, FileShare.ReadWrite)){using (BinaryWriter bw = new BinaryWriter(fs, encodingType)){bw.Write(bytes);}}return true;}catch (Exception ex){LogHelper.Error("Sxmobi.FileHelper", null, ex);return false;}}/// /// 基于默认编码类型(Unicode),将字节数组写入指定的二进制文件/// /// 二进制文件/// 字节数组/// 返回一个 Boolean 值,如果指定的目录、文件不存在且创建它们(或写入二进制数据时)出现异常,返回值为 False。public static bool SetFileBinary(string path, byte[] bytes){return SetFileBinary(path, Encoding.Unicode, bytes);}/// /// 基于所提供编码类型,将字节数组写入指定的二进制文件/// /// 二进制文件/// 编码类型/// 字节数组/// 返回一个 Boolean 值,如果指定的目录、文件不存在且创建它们(或写入二进制数据时)出现异常,返回值为 False。public static bool SetFileBinary(string path, Encoding encodingType, byte[] bytes){if (!EnsureDir(Directory.GetParent(path).ToString()))return false;try{using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.ReadWrite)){using (BinaryWriter bw = new BinaryWriter(fs, encodingType)){bw.Write(bytes);}}return true;}catch (Exception ex){LogHelper.Error("Sxmobi.FileHelper", null, ex);return false;}}/// /// 依据默认编码类型(Unicode),获取指定文件、指定范围的二进制数据。/// /// 文件路径/// 指定要获取数据的起始索引位置/// 指定要获取数据的长度,内容读取长度设置不宜过大,以避免内存溢出/// 返回 byte[] 类型值,当文件不存在或其它异常时,返回值为 Null。public static byte[] GetFileBinary(string path, int index, int count){return GetFileBinary(path, Encoding.Unicode, index, count);}/// /// 依据指定的编码类型,获取指定文件、指定范围的二进制数据。/// /// 文件路径/// 编码类型/// 指定要获取数据的起始索引位置/// 指定要获取数据的长度,内容读取长度设置不宜过大,以避免内存溢出/// 返回 byte[] 类型值,当文件不存在或其它异常时,返回值为 Null。public static byte[] GetFileBinary(string path, Encoding encodingType, int index, int count){try{if (!File.Exists(path))return null;int maxReads = 1024000;byte[] bytes = new byte[count];int loopCount = index / maxReads;int tempIndex = index % maxReads;using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)){using (BinaryReader br = new BinaryReader(fs, encodingType)){// 如果起始索引超过1M(1000K),则以1M为单位,循环丢弃起始索引之前的所有字节,以避免内存开销过大。while (loopCount-- > 0)br.ReadBytes(maxReads);br.ReadBytes(tempIndex);bytes = br.ReadBytes(count);}}return bytes;}catch (Exception ex){LogHelper.Error("Sxmobi.FileHelper", null, ex);return null;}}#endregion}
}

相关内容

热门资讯

省委书记、省长的大年初一 政知见消息,干部在岗,群众过节。春节万家团圆的背后,是各级有关部门和工作人员值班值守,把各项服务保障...
韩文秀:拓展内需增长新空间 做... 来源:格隆汇APP 格隆汇2月16日|据求是网消息,中央财办分管日常工作的副主任、中央农办主任韩文秀...
春晚机器人集体“炸场”:看似科... 2月16日除夕夜,当全国观众聚焦央视春晚的明星阵容时,另一批“特殊嘉宾”凭实力抢镜——魔法原子、银河...
抓主升靠趋势,看行为比持仓 很多投资者都有过类似经历:手中标的浮亏时能长期持有,稍有浮盈就急于离场,眼睁睁看着后续行情冲高,只能...
法国国家银行账户档案系统遭非法... 法国经济和财政部当地时间18日在一份公报中指出,自2026年1月底起,有人冒用一名公务员的登录凭证,...
谷歌再掀AI战火:Gemini... 来源:市场资讯 (来源:财联社) 财联社2月19日讯(编辑 赵昊)周三(2月18日)美股盘中,谷歌在...
新生儿护理10个小常识 宝爸宝... 新生儿机体非常娇嫩,软软糯糯的样子让人不知道该怎么照顾,害怕一不留神就对宝宝产生伤害。别担心,本文将...
【朝医新闻】国际医疗部成功举办... 2026年2月5日,北京朝阳医院国际医疗部成功举办“商业健康保险开放日”活动。本次活动旨在推动商业健...
寒假来河南省科技馆体验健康新玩... 本报讯(全媒体记者 曹聪) “小朋友,抬头挺胸,让叔叔看看你的脊柱有没有长歪。”2月7日,河南省科技...
2026江西余干结石科诊疗机构... 一、行业背景与筛选依据 据《2025中国泌尿系结石诊疗现状白皮书》数据显示,我国泌尿系结石发病率已达...
长治市必须品尝的小吃都有哪些 长治,这座历史悠久的城市,不仅有着深厚的文化底蕴,还拥有众多令人垂涎欲滴的特色小吃。这些小吃承载着当...
从云计算、AI到许可政策,FT... 来源:市场资讯 (来源:IT之家) IT之家 2 月 15 日消息,据彭博社 2 月 13 日报道,...
预见金马|贝莱德中国区范华:2... 新 春 快 乐 顺流逆流,皆为行路的风景;心有罗盘,便有笃定的方向。券商中国微信平台粉丝总量已强势突...
段永平出手!加仓巨头超1110... 【导读】段永平四季度持仓曝光 中国基金报记者 莫琳 根据13F持仓披露情况,和巴菲特旗下的伯克希尔一...
烧光800亿后,外卖佣金终于开... 文丨新博弈 林一白 外卖大战一年后,行业硝烟仍在蔓延。 近日,多地外卖商家晒出与淘宝闪购的新合同,...
业绩预亏近3亿元,老板分家13... 近日,卓胜微(300782)发布公告,公司收到实际控制人之一许志翰的通知,其与ZHANG YU(张昱...
AI春晚来了,节后或迎来端侧概... 窗外的城市终于褪去白日的喧嚣,连楼下的便利店都关了门,手机推送的消息也慢了下来。刚刚刷到的那篇关于A...
金银大跌遭抛售,苹果成“救市英... 本文自南都·湾财社 湾财社综合同花顺、新浪财经、金投网等报道 2026年2月18日清晨,全球金融市场...
原创 就... 标题:就因为我是独生女,结婚就要我家出一套房子做嫁妆? 在当今社会,婚姻不仅仅是两个人的事,更是两...
用友:2025年ERP价值化国... 今天分享的是:用友:2025年ERP价值化国产替代方法、路径与实践报告 报告共计:44页 这份202...