C#读写各类文件合集

C#文件操作合集

  • 一、利用字节流与文件流读写txt、json文件
    • 1.以文件的方式进行操作
    • 2.以文件流的方式进行读写
    • 3.以二进制数据流的方式进行读写
    • 4.以文本流的方式进行读写
    • 5.JOSN文件的读写
  • 二、kernel32读写ini文件
  • 三、XML文件的读写
    • 1.DataSet读取操作
    • 2.使用Json.Net转换读取
    • 3.使用XmlDocument读取
    • 4.使用XmlTextReader读取
    • 5.使用 Linq to Xml读取
  • 四、EXCEL文件的读写
    • 1.以NPOI的方式读写
    • 2.以ClosedXML的方式读写
    • 3.以Spire.Xls的方式读写
    • 4.以EPPlus的方式读写
  • 五、CSV文件的读取

一、利用字节流与文件流读写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";
/// 获取值
/// 段落名
/// 键名
/// 读取异常是的缺省值
/// 键名所对应的的值,没有找到返回空值
/// 返回值允许的大小
/// ini文件的完整路径
[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;
            // 得到标签的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.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
//{
//    Console.Write("");
//}

simple.csv文件示例

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

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

你可能感兴趣的:(c#)