C#读写各类文件合集

2023-11-13

一、利用字节流与文件流读写txt、json文件

1.以文件的方式进行操作

适用于小型文本全文的读取和写入。
首先创建C#窗体程序,然后写入以下代码:

string filePath = @"D:\Test_C#\TestTxt.txt";
// 1、文件操作类(File)
void FileDo()
{
    string ret = "";
    #region 读取
    {
        //File.ReadAllBytes打开一个二进制文件,将文件的内容读入一个字节数组,然后关闭该文件。因为可以读取到每个字节 所以可以处理所有类型的文件
        byte[] buffer1 = File.ReadAllBytes(filePath);
        //File.ReadAllText 打开一个文本文件,将文件中的所有文本读取到一个字符串中,然后关闭此文件。
        string alltxt = File.ReadAllText(filePath);
        string[] lines = File.ReadAllLines(filePath);
        ret = Encoding.UTF8.GetString(buffer1);
        Console.WriteLine(ret);
    }
    #endregion

    #region 写入
    {
        //覆盖式写入
        byte[] buffer2 = Encoding.UTF8.GetBytes(ret+"\n黄河入海流");
        //File.WriteAllBytes创建一个新文件,在其中写入指定的字节数组,然后关闭该文件。 如果目标文件已存在,则覆盖该文件。
        File.WriteAllBytes(filePath, buffer2);
        //File.WriteAllText 创建一个新文件,向其中写入内容,然后关闭文件。 如果目标文件已存在,则覆盖该文件。
        File.WriteAllText(filePath2, ret);
    }
    #endregion
}

2.以文件流的方式进行读写

void FileStreamDo()
{
    #region 读取
    byte[] buffer;
    //方式1
    //1.FileStream文件流——这个类主要用于在二进制文件中读写二进制数据。
    //FileStream类操作字节和字节数组,有些操作比如随机文件访问(访问文件中间某点的数据),就必须由FileStream对象执行。
    using (FileStream fs = new FileStream(filePath, FileMode.Open))
    {
        buffer = new byte[fs.Length];
        fs.Read(buffer, 0, buffer.Length);
    }
    //2.StreamReader(流读取器)和StreamWriter(流写入器)这两个类专门用于文本格式的流产品API
    //3.BinaryReader和BinaryWriter这两个类专门用于读写二进制格式的流产品API.
    //方式2
    //using (FileStream fs = File.OpenRead(filePath))
    //{
    //    buffer = new byte[fs.Length];
    //    fs.Read(buffer, 0, buffer.Length);
    //}
    #endregion
    //读取1中文件流,写入2中
    #region 写入
    using (FileStream fs = new FileStream(filePath2, FileMode.Create))
    {
        buffer = Encoding.UTF8.GetBytes(Encoding.UTF8.GetString(buffer)+"\n欲穷千里目");
        fs.Write(buffer, 0, buffer.Length);
        fs.Close();
    }
    #endregion
}

3.以二进制数据流的方式进行读写

void BinaryDo()
{
    #region 读取
    byte[] buffer;
    //方式1
    //Stream类操作字符数据。字符数据易于使用
    using (Stream stream = File.Open(filePath2, FileMode.Open))
    {
        using (BinaryReader reader = new BinaryReader(stream))
        {
            buffer = reader.ReadBytes((int)stream.Length); //将流读入到字节数组中
        }
    }
    #endregion
    #region 写入
    using (Stream stream = File.Open(filePath3, FileMode.Create))
    {
        using (BinaryWriter writer = new BinaryWriter(stream))
        {
            writer.Write(Encoding.UTF8.GetBytes(Encoding.UTF8.GetString(buffer) + "\n更上一层楼"));
        }
    }
    #endregion
}

4.以文本流的方式进行读写

void StreamDo()
{
    string text = "";
    #region 读取
    using (StreamReader reader = new StreamReader(filePath3))
    {
        text = reader.ReadToEnd();
        Console.WriteLine(text);
    }
    #endregion

    #region 写入
    using (FileStream fs = new FileStream(filePath4, FileMode.Create))
    {
        using (StreamWriter writer = new StreamWriter(fs))
        {
            writer.Write(text+"\nThis is tuesday!");
        }
    }
    #endregion
}

5.JOSN文件的读写

首先安装依赖包

Install - Package Newtonsoft.Json

config.json内容如下:

{
  "server": "1.1.1.1",
  "user": "sa",
  "passwd": "1"
}

代码块入下:

void Get_Json()
{
    try
    {
        StreamReader reader = File.OpenText(filePath5);
        JsonTextReader jsonTextReader = new JsonTextReader(reader);
        JObject jsonObject = (JObject)JToken.ReadFrom(jsonTextReader);
        string server = jsonObject["server"].ToString(); //user ,passwd 类似
        reader.Close();
        Console.WriteLine(server);
    }
    catch (Exception ex)
    {
        Console.WriteLine("读取错误" + ex);
    }
}

void Set_Json(string server)
{
    try
    {
        StreamReader reader = File.OpenText(filePath5);
        JsonTextReader jsonTextReader = new JsonTextReader(reader);
        JObject jsonObject = (JObject)JToken.ReadFrom(jsonTextReader);
        jsonObject["server"] = server; 
        reader.Close();
        string output = JsonConvert.SerializeObject(jsonObject, Newtonsoft.Json.Formatting.Indented);
        File.WriteAllText(filePath5, output);
    }
    catch(Exception ex)
    {
        Console.WriteLine("写入错误"+ex);
    }
}

//Set_server("1.1.1.2");
//Get_server();

二、kernel32读写ini文件

创建.ini文件,内容如下:
(注意文件编码格式使用ANSI,否则读取会出现乱码)

[Information]
Name=醒醒
Gender=男
Age=35
Region=广东

然后写入以下代码块:

string filePath6 = @"D:\Test_C#\temp.ini";
/// 获取值
/// <param name="section">段落名</param>
/// <param name="key">键名</param>
/// <param name="defval">读取异常是的缺省值</param>
/// <param name="retval">键名所对应的的值,没有找到返回空值</param>
/// <param name="size">返回值允许的大小</param>
/// <param name="filepath">ini文件的完整路径</param>
[DllImport("kernel32.dll")]
static extern int GetPrivateProfileString(
            string section,
            string key,
            string defval,
            StringBuilder retval,
            int size,
            string filepath);
// 写入
[DllImport("kernel32.dll")]
static extern int WritePrivateProfileString(
    string section,
    string key,
    string val,
    string filepath);

// 获取数据
static string getString(string section, string key, string def, string filename)
{
    StringBuilder sb = new StringBuilder(1024);
    GetPrivateProfileString(section, key, def, sb, 1024, filename);
    return sb.ToString();
}
// 写入数据
static void writeString(string section, string key, string val, string filename)
{
    WritePrivateProfileString(section, key, val, filename);
}
//调用上述方法
void IniDO()
{
    string names = getString("Information", "Name", null, filePath6);
    string gender = getString("Information", "Gender", null, filePath6);
    string age = getString("Information", "Age", null, filePath6);
    string region = getString("Information", "Region", null, filePath6);
    Console.WriteLine("名称:"+names+"\n性别:"+ gender + "\n年龄:"+ age + "\n籍贯:" + region);
}
//IniDO();

三、XML文件的读写

1.DataSet读取操作

创建两个.xml文件,内容如下:
不带ID的文件

<?xml version="1.0" encoding="utf-8" ?>
<studentList>
	<student>
		<name>张三</name>
		<sex></sex>
		<old>20</old>
	</student>
	<student>
		<name>李四</name>
		<sex></sex>
		<old>21</old>
	</student>
</studentList>

带ID的文件

<?xml version="1.0" encoding="utf-8" ?>
<studentList>
	<student Type="Bad" ISBN="541801">
		<name id="1">张三</name>
		<sex id="11"></sex>
		<old id="111">20</old>
	</student>
	<student Type="Good" ISBN="541802">
		<name id="2">李四</name>
		<sex id="22"></sex>
		<old id="222">21</old>
	</student>
</studentList>

C#代码块如下:

void DataSet_ReadXml()
{
    //dataset读取简单xml文件
    DataSet ds = new DataSet();
    ds.ReadXml(filePath7);
    //读取第一条数据的name节点
    string name = ds.Tables[0].Rows[0]["name"].ToString();
    //输出:张三
    Console.WriteLine(name);
}

void DataSet_ReadXml_id()
{
    //dataset读取带属性的xml文件
    DataSet ds = new DataSet();
    ds.ReadXml(filePath8);
    //读取的节点名称
    string nodeName = "name";
    string name = "";
    name = ds.Tables[nodeName].Rows[0][nodeName + "_Text"].ToString();
    //读取节点的id属性
    string id = ds.Tables[nodeName].Rows[0]["id"].ToString();
    //输出:id:1,name:张三
    Console.WriteLine("id:{0},name:{1}", id, name);
}
//DataSet_ReadXml();
//DataSet_ReadXml_id();

2.使用Json.Net转换读取

void XmlToJson()
{
    //XmlDocument读取xml文件
    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.Load(filePath8);
    //转换为json
    string json = JsonConvert.SerializeXmlNode(xmlDoc);
    //解析json
    JObject jobj = JObject.Parse(json);
    JArray jarr = JArray.Parse(jobj["studentList"]["student"].ToString());
    //输出:id:1,name:张三
    Console.WriteLine("id:{0},name:{1}", jarr[0]["name"]["#text"], jarr[0]["name"]["@id"]);
}
//XmlToJson();

3.使用XmlDocument读取

void XmlDocument_Load()
{
    //XmlDocument读取xml文件
    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.Load(filePath8);

    //获取xml根节点
    XmlNode xmlRoot = xmlDoc.DocumentElement;
    //根据节点顺序逐步读取
    //读取第一个name节点
    string name = xmlRoot.SelectSingleNode("student/name").InnerText;

    //读取节点的id属性
    string id = xmlRoot.SelectSingleNode("student/name").Attributes["id"].InnerText;
    //输出:id:1,name:张三
    Console.WriteLine("id:{0},name:{1}", id, name);

    //读取所有的name节点
    foreach (XmlNode node in xmlRoot.SelectNodes("student/name"))
    {
        //循环输出
        Console.WriteLine("id:{0},name:{1}", node.Attributes["id"].InnerText, node.InnerText);
    }
}
//XmlDocument_Load();
void XmlDocument_Load2()
{
    //使用的时候,首先声明一个XmlDocument对象,然后调用Load方法,从指定的路径加载XML文件.
    XmlDocument doc = new XmlDocument();

    XmlReaderSettings settings = new XmlReaderSettings();
    settings.IgnoreComments = true;//忽略文档里面的注释
    using (XmlReader reader = XmlReader.Create(filePath8, settings))
    {
        doc.Load(reader);
        //doc.Load(@"d:/demo.xml");
        //然后可以通过调用SelectSingleNode得到指定的结点,通过GetAttribute得到具体的属性值.参看下面的代码
        // 得到根节点bookstore
        XmlNode xn = doc.SelectSingleNode("studentList");
        // 得到根节点的所有子节点
        XmlNodeList xnl = xn.ChildNodes;
        string info = "\n";
        string info2 = "\n";
        foreach (XmlNode xn1 in xnl)
        {
            
            // 将节点转换为元素,便于得到节点的属性值
            XmlElement xe = (XmlElement)xn1;
            // 得到<student>标签的Type和ISBN两个属性的属性值
            info += "TYPE:" + xe.GetAttribute("Type").ToString();
            info += "  ISBN:" + xe.GetAttribute("ISBN").ToString() + "\n";
            // 得到Book节点的所有子节点
            XmlNodeList xnl0 = xe.ChildNodes;
            info2 += "name:" + xnl0.Item(0).InnerText;
            info2 += "  sex:" + xnl0.Item(1).InnerText;
            info2 += "  old:" + xnl0.Item(2).InnerText + "\n";
        }
        Console.WriteLine(info+info2);
    }
}
//XmlDocument_Load2();

4.使用XmlTextReader读取

#region XmlTextReaderDemo
 void XmlTextReaderDemo()
{
    string info = "\n";
    string info2 = "\n";
    XmlTextReader reader = new XmlTextReader(filePath8);
    while (reader.Read())
    {
        if (reader.NodeType == XmlNodeType.Element)
        {
            if (reader.Name == "student")
            {
                info += "TYPE:" + reader.GetAttribute("Type");
                info += "  ISBN:" + reader.GetAttribute("ISBN") + "\n";
            }
            if (reader.Name == "name")
            {
                info2 += "name:" + reader.ReadElementContentAsString();
            }
            if (reader.Name == "sex")
            {
                info2 += "  sex:" + reader.ReadElementString().Trim();
            }
            if (reader.Name == "old")
            {
                info2 += "  old:" + reader.ReadElementString().Trim() + "\n";
            }
            //for(int i=0;i<reader.AttributeCount;i++)
            //{
            //  reader.MoveToAttribute(i);
            //}
        }
    }
    reader.Close();
    Console.WriteLine(info + info2);
}
#endregion XmlTextReaderDemo
//XmlTextReaderDemo();

5.使用 Linq to Xml读取

void Linq_To_Xml()
{
    XElement xe = XElement.Load(filePath8);
    //xe.Descendants
    var elements = from ele in xe.Elements()
                   select ele;
    string info = "";
    foreach (var ele in elements)
    {
        info += "name:" + ele.Element("name").Value;
        info += "  old:" + ele.Element("old").Value + "\n";
    }
    Console.WriteLine(info);
}
//Linq_To_Xml();

四、EXCEL文件的读写

参考文章:EXCEL的读取方式

1.以NPOI的方式读写

//NPOI方式
//优点:用户电脑上没有安装office,使用NPOI,依旧可以在它的机器上对word或者excel文档进行读写
//缺点:有的需要下载插件,添加到系统引用中。
//如果需要读写多种Word、Excel等Office文件,OpenXml和NPOI也是不错的选择。
//using NPOI.SS.UserModel;
void Excle_NPOI()
{
    //导入
    IWorkbook workbook = WorkbookFactory.Create(filePath12);
    ISheet sheet = workbook.GetSheetAt(0);//获取第一个工作薄
    sheet.CreateRow(0).CreateCell(0).SetCellValue("A");
    //向第一行第一个单元格写入字符串
    sheet.CreateRow(1).CreateCell(1).SetCellValue(2);
    sheet.CreateRow(2).CreateCell(2).SetCellValue("B");
    IRow row = (IRow)sheet.GetRow(0);//获取第一行
    //设置第一行第一列值,更多方法请参考源官方Demo
    row.CreateCell(4).SetCellValue("Excle_NPOI");//设置第一行第一列值
    //导出excel
    FileStream fs = new FileStream(filePath12, FileMode.Create, FileAccess.ReadWrite);
    workbook.Write(fs);
    fs.Close();
}
Excle_NPOI();

2.以ClosedXML的方式读写

添加相应的NuGet包

//using ClosedXML.Excel;
void Excle_ClosedXml()
{
    var workbook = new XLWorkbook(filePath11);
    IXLWorksheet sheet = workbook.Worksheet(1);//这个库也是从1开始
    //设置第一行第一列值,更多方法请参考官方Demo
    sheet.Cell(1, 5).Value = "Excle_ClosedXml";//该方法也是从1开始,非0
    workbook.SaveAs(filePath12);
}
//Excle_ClosedXml();
//导出不支持覆盖,如果路径12的文件存在则报错?

3.以Spire.Xls的方式读写

//如果需要在WinForm中展示,那么Spire.Office可能是唯一选择。
//Nuget下载Free Spire.xls
void Excle_spire()
{
    Spire.Xls.Workbook workbook = new Spire.Xls.Workbook();
    workbook.LoadFromFile(filePath11);
    //处理Excel数据,更多请参考官方Demo
    Spire.Xls.Worksheet sheet = workbook.Worksheets[0];
    sheet.Range[1, 6].Text = "Excle_spire";//该方法也是从1开始,非0
    workbook.SaveToFile(filePath12);
}
//Excle_spire();
//覆盖式导出

4.以EPPlus的方式读写

//如果只是需要读写Excel,那么EPPlus非常方便而且符合使用习惯。
//using OfficeOpenXml;
void TestEPPlus()
{
    ExcelPackage.LicenseContext = LicenseContext.NonCommercial;//指明非商业应用;EPPlus通过LicenseContext来区分商业应用(Commercial)和非商业应用(NonCommercial)
    ExcelPackage package = new ExcelPackage(filePath12);//加载Excel工作簿
    ExcelWorksheet sheet1 = package.Workbook.Worksheets["Sheet1"];//读取工作簿中名为"Sheet1"的工作表

    sheet1.Cells[1, 1].Value = "A";//设置单元格内容
    sheet1.Cells[2, 2].Value = "B";
    sheet1.Cells[3, 3].Value = "C";
    //package.Save();//将更改保存到原文件
    package.SaveAs(filePath12);//将更改保存到新的文件,类似于另存为
}
//TestEPPlus();

五、CSV文件的读取

参考博客:CSV文件的读取方式

DataTable CSV2DataTable(string fileName)
{
    try
    {
        DataTable dt = new DataTable();
        FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
        StreamReader sr = new StreamReader(fs, Encoding.Default);
        //记录每次读取的一行记录
        string strLine = "";
        //记录每行记录中的各字段内容
        string[] aryLine;
        //标示列数
        int columnCount = 0;
        //标示是否是读取的第一行
        bool IsFirst = true;
        //逐行读取CSV中的数据
        while ((strLine = sr.ReadLine()) != null)
        {
            aryLine = strLine.Replace('"', ' ').Replace(" ", "").TrimEnd(',').Split(',');
            if (IsFirst == true)
            {
                IsFirst = false;
                columnCount = aryLine.Length;
                //创建列
                for (int i = 0; i < columnCount; i++)
                {
                    DataColumn dc = new DataColumn(aryLine[i]);
                    try
                    {
                        dt.Columns.Add(dc);
                    }
                    catch (Exception ex)
                    {
                        return null;
                    }
                }
            }
            else
            {
                DataRow dr = dt.NewRow();
                for (int j = 0; j < columnCount; j++)
                {
                    dr[j] = aryLine[j];
                }
                dt.Rows.Add(dr);
            }
        }
        sr.Close();
        fs.Close();
        return dt;
    }
    catch (Exception)
    {
        return null;
    }
}
//仅能读取简单的CSV
//DataTable dt = CSV2DataTable(filePath9);
//for (int i = 0; dt.Rows.Count<i; i++)
//{
//    Console.Write("");
//}

simple.csv文件示例

Test1,Test2,Test3,Test4,Test5,Test6
s1,s2,s3,s4,s5,s6
r1,r2,r3,r4,r5,r6

以上便是本文的所有内容啦,如有遗漏,欢迎补充!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#读写各类文件合集 的相关文章

  • Rx.NET 中是否有一个Subject 实现,其功能类似于BehaviourSubject,但仅在值发生更改时才发出?

    有没有Subject https learn microsoft com en us previous versions dotnet reactive extensions hh229699 v vs 103 Rx NET 中的实现在功能
  • 转换 const void*

    我有一个函数返回一个const void 我想用它的信息作为char 我可以将它投射为 C 风格的罚款 char variable但是当我尝试使用reinterpret cast like reinterpret cast
  • 现代 C++ 编译器是否能够在某些情况下避免调用 const 函数两次?

    例如 如果我有以下代码 class SomeDataProcessor public bool calc const SomeData d1 const SomeData d2 const private Some non mutable
  • 有些有助于理解“产量”

    在我不断追求少吸的过程中 我试图理解 产量 的说法 但我不断遇到同样的错误 someMethod 的主体不能是迭代器块 因为 System Collections Generic List 不是迭代器接口类型 这是我被卡住的代码 forea
  • 无法注册时间触发的后台任务

    对于 Windows 8 应用程序 在 C Xaml 中 我尝试注册后台任务 很难说 但我想我的后台任务已正确注册 但是当我单击调试位置工具栏上的后台任务名称时 我的应用程序停止工作 没有任何消息 我查看了事件查看器上的日志 得到 具有入口
  • extern 声明和函数定义都在同一文件中

    我只是浏览了一下gcc源文件 在gcc c 我发现了类似的东西 extern int main int char int main int argc char argv 现在我的疑问是extern是告诉编译器特定的函数不在这个文件中 但可以
  • 处理右值时的 insert 与 emplace

    std string myString std unordered set
  • RestSharp获取序列化输出

    我正在寻找一种方法来访问 AddBody 调用的序列化结果 我正在使用内置的 RestSharp 序列化器 例子 class Foo public string FooField void SendRecord var f new Foo
  • 不同 C++ 文件中的相同类名

    如果两个 C 文件具有相同名称的类的不同定义 那么当它们被编译和链接时 即使没有警告也会抛出一些东西 例如 a cc class Student public std string foo return A void foo a Stude
  • 在 VS 中运行时如何查看 C# 控制台程序的输出?

    我刚刚编写了一个名为 helloworld 的聪明程序 它是一个 C NET 4 5 控制台应用程序 在扭曲的嵌套逻辑迷宫深处 使用了 Console WriteLine 当我在命令行运行它时 它会运行并且我会看到输出 我可以执行其他命令并
  • 从网页运行 ClickOnce 应用程序,无需用户操作

    我们有一个基于 Java 的 Web 应用程序以及用 C 编写的相同应用程序 如果 java 检查器发现客户端计算机上没有安装 Java 则应该运行该应用程序 这个想法是运行 C 单击一次 http en wikipedia org wik
  • 如何递归取消引用指针(C++03)?

    我正在尝试在 C 中递归地取消引用指针 如果传递一个对象 那就是not一个指针 这包括智能指针 我只想返回对象本身 如果可能的话通过引用返回 我有这个代码 template
  • 将 Word 转换为 PDF - 禁用“保存”对话框

    我有一个用 C 编写的 Word 到 PDF 转换器 除了一件事之外 它工作得很好 有时 在某些 Word 文件上 后台会出现一条消息保存源文件中的更改 gt 是 否 取消 但我没有对源文件进行任何更改 我只想从 Word 文件创建 PDF
  • 如何最好地以编程方式将 `__attribute__ ((unused))` 应用于这些自动生成的对象?

    In my makefile我有以下目标 它将文本 HTML 资源 编译 为unsigned char数组使用xxd i http linuxcommand org man pages xxd1 html 我将结果包装在匿名命名空间和标头保
  • 如何在 C# 中创建异步方法?

    我读过的每一篇博客文章都会告诉您如何在 C 中使用异步方法 但由于某些奇怪的原因 从未解释如何构建您自己的异步方法来使用 所以我现在有这段代码使用我的方法 private async void button1 Click object se
  • C++ 对象用 new 创建,用 free() 销毁;这有多糟糕?

    我正在修改一个相对较大的 C 程序 不幸的是 并不总是清楚我之前的人使用的是 C 还是 C 语法 这是在一所大学的电气工程系 我们 EE 总是想用 C 来做所有事情 不幸的是 在这种情况下 人们实际上可以逃脱惩罚 但是 如果有人创建一个对象
  • WPF DataGrid / ListView 绑定到数组 mvvm

    我们假设你有 N 个整数的数组 表示行数的整数值 在模型中 该整数绑定到视图中的 ComboBox Q1 如何将数组 或数组的各个项目 绑定到 DataGrid 或 ListView 控件 以便 当您更改 ComboBox 值时 只有那么多
  • 代码中的.net Access Forms身份验证“超时”值

    我正在向我的应用程序添加注销过期警报 并希望从我的代码访问我的 web config 表单身份验证 超时 值 我有什么办法可以做到这一点吗 我认为您可以从 FormsAuthentication 静态类方法中读取它 这比直接读取 web c
  • Visual Studio 2015 - Web 项目上缺少共享项目参考选项卡

    我从 MSDN 订阅升级到 Visual Studio 2015 因为我非常兴奋地阅读有关共享项目的信息 当我们想要做的只是重用代码时 不再需要在依赖项中管理 21382 个 nuget 包 所以我构建了一个测试共享项目 其中包含一些代码
  • 了解 Lambda 表达式和委托 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已经尝试解决这个问题很长一段时间了 阅读在线博客和文章 但到目前为止还没有成功 什么是代表 什么是 Lambda 表达式 两者的优点

随机推荐