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}
}

相关内容

热门资讯

黄金珠宝怎么选?内侧刻字都代表... 潮新闻客户端 记者 马焱 通讯员 任倩影 9月8日下午,“云游杭州 乐购金秋”——“浙城·浙放心”活...
原创 冰... 最近全球国债市场正在上演魔幻一幕: 美债、日债、欧债遭遇猛烈抛售,收益率冲到几十年新高,美国财政部都...
日韩股市开盘表现分化 上证报中国证券网讯 9月9日,日韩股市开盘表现分化,韩国综合指数开盘上涨0.26%,报6972.87...
国际原油拉升,中曼石油涨超8%... 9月8日,油气开采及服务板块持续走高, 中曼石油(603619.SH)涨超8%, 石化油服(6008...
宁波银行启动2026年金融教育... 9月7日至13日,宁波银行开展2026年金融教育宣传周。此次活动紧扣“清朗金融网络 守护安心消费”主...
食物发芽后都有毒吗?哪些不能吃... 不少家庭囤放的食材放置一段时间后,悄悄长出了“小芽”。提到食物发芽,大多数人会认为“发芽的食物一般都...
3年9700万美元!骑士官宣与... 搜狐体育消息,北京时间9月9日,骑士官方今日宣布,球队已与哈登续签了一份多年期合同。 骑士官方写道...
农行工行定增2600亿 或于年... 记者 胡艳明 国有大行新一轮资本补充方案落地。 2026年9月7日,农业银行(下称“农行”)、工商银...
9月9日每日研选丨超强厄尔尼诺... 超强厄尔尼诺正成为近期农产品板块走强的核心推手。据美国国家海洋和大气管理局(NOAA)预测,2026...
巨头库存告急,美股光学网络携手... 当地时间9月8日,劳动节长假后的首个交易日,美股三大指数同步走低。标普500指数跌0.58%报767...
原创 A... 9月9日,新股市场迎来洛轴股份(301699)的上市交易。恐怕有些中签的股民已经等急了,因为在同一天...
早报美股光通信,逆市大涨;美袭... 宏观新闻 1、习近平同英国首相伯纳姆通电话。习近平祝贺伯纳姆就任英国首相,指出中英是全面战略伙伴,虽...
原创 “... 备受社会关注的“梅姨案”有了最新消息。9月8日下午,“梅姨”案被拐人申聪和父亲申军良及其代理律师面向...
哪些人群适合选择北方地区熏鸡加... 当前国内小成本餐饮赛道发展平稳,熟食类项目因客群覆盖广、投入门槛低、操作难度可控,成为不少创业者的选...
央视报道丨2026年服贸会首批... 央视《新闻联播》(2026年9月7日) 记者:张萍、叶奂 央视《朝闻天下》(2026年9月8日) 记...
原创 美... 近期,国际能源地缘格局迎来重大变动。 美国通过全新合作协议深度切入委内瑞拉石油产业,调整当地多年形成...
住院后突然糊涂?元凶不是年龄,... 住院后突然糊涂,真的是年纪大了么?很多人第一反应是把谵妄归因于年龄,但最近的一项权威研究给出一个更清...
消费新势力|山东省代表团参加第... 9月8日,第26届中国国际投资贸易洽谈会在福建厦门开幕,活动由商务部主办,是我国对外开放的重要窗口和...
消金公司半年考:头部缩表控险,... 来源:市场资讯 华夏时报记者 付乐 北京报道 近期,已开业的31家消费金融公司中,多家机构披露了2...
三星Q3大幅增加HBM4供应,... 每经编辑:肖芮冬 截至9时40分,市场震荡活跃,同指数费率最低标的科创芯片ETF(588290)跟踪...