C#基本文件操作,读取xml、json、excel文件

一、基础文件操作

1、文件、文件夹基础操作

  • FileInfo和DirectoryInfo的属性列表

CreationTime 创建文件或文件夹的时间

DirectoryName(用于FileInfo) 包含文件夹的完整路径

Parent(用于DirectoryInfo) 指定子目录的父目录

Exists 文件或文件夹是否存在

Extension 文件的扩展名,对于文件夹,它返回空白

FullName 文件或文件夹的完整路径名

LastAccessTime 最后一次访问文件或文件夹的时间

LastWriteTime 最后一个修改文件或文件夹的时间

Name 文件或文件夹的名称

Root(仅用于DirectoryInfo) 路径的根部分

Length(仅用于FileInfo) 返回文件的大小(以字节为单位)

  • FileInfo和DirectoryInfo的方法列表

Create() 创建给定名称的文件夹或者空文件,对于FileInfo,该方法会返回一个流对象,以便于写入文件。

Delete() 删除文件或文件夹。对于文件夹有一个可以递归的Delete选项

MoveTo() 移动或重命名文件或文件夹

CopyTo() (只用于FileInfo)复制文件,文件夹没有复制方法,如果想要复制完整的目录树,需要单独复制每个文件和文件夹

GetDirectories() (只适用于DirectoryInfo)返回DirectoryInfo对象数组,该数组表示文件夹中包含的所有文件夹

GetFiles() (只适用于DirectoryInfo)返回FileInfo对象数组,该数组表示文件夹中所有的文件

GetFileSystemInfos() (只适用于DirectoryInfo)返回FileInfo和DirectoryInfo对象,它把文件夹中包含的所有对象表示为一个FileSystemInfo引用数组

namespace _001_文件操作基础
{
    internal class Program
    {
        static void Main(string[] args)
        {

            //相对路径:就是找当前程序所在的路径
            FileInfo fileInfo = new FileInfo("TextFile1.txt");

            //绝对路径:加上文件完整的路径名
            //FileInfo fileInfo = new FileInfo(@"C:\Users\Administrator\source\repos\001_文件操作基础\bin\Debug\net6.0");
            Console.WriteLine(fileInfo.Exists);//判断该文件是否存在

            Console.WriteLine(fileInfo.Name);//文件名.后缀

            Console.WriteLine(fileInfo.Directory);//取得文件所在路径

            Console.WriteLine(fileInfo.Length);

            Console.WriteLine(fileInfo.IsReadOnly);

            //fileInfo.Delete();//删除的是输出路径的文件,工程下的文件还是存在的

            //fileInfo.CopyTo("tt.txt");

            FileInfo fileInfo1 = new FileInfo("siki.txt");
            if (fileInfo1.Exists == false)//如果当前文件不存在
            {
                fileInfo1.Create();//创建当前文件
            }
            fileInfo1.MoveTo("siki2.txt");//重命名操作

            //文件夹操作(目录操作) (按照完整路径名创建)
            DirectoryInfo dirInfo = new DirectoryInfo(@"C:\Users\Administrator\source\repos\001_文件操作基础\bin\Debug\net6.0");//查看Debug文件夹的信息

            Console.WriteLine(dirInfo.Exists);
            Console.WriteLine(dirInfo.Name);
            Console.WriteLine(dirInfo.Parent);
            Console.WriteLine(dirInfo.Root);
            Console.WriteLine(dirInfo.CreationTime);
            dirInfo.CreateSubdirectory("siki");

            DirectoryInfo dirInfo1 = new DirectoryInfo("test");
            if (dirInfo1.Exists == false)
            {
                dirInfo1.Create();//创建目录
            }

        }
    }
}

2、文件的读写操作

  • File.ReadAllText(FilePath);根据文件路径读取文件中所有的文本
  • File.ReadAllText(FilePath,Encoding);//Encoding可以指定一个编码格式Encoding.ASCII;
  • File.ReadAllBytes()方法可以打开二进制文件把内容读入一个字节数组
  • File.ReadAllLines() 以行的形式读取文件,一行一个字符串,返回一个字符串的数组
namespace _001_文件操作基础
{
    internal class Program
    {
        static void Main(string[] args)
        {
            string[] strArray = File.ReadAllLines("TextFile1.txt");
            //读取文件,把每一个行文本读取成一个字符串,最后组成一个字符串的数组
            foreach (var str in strArray) 
            {
                Console.WriteLine(str);
            }

            string s = File.ReadAllText("TextFile1.txt");
            Console.WriteLine(s);


            //byte[] byteArray = File.ReadAllBytes("3.LINQ.png");
            //foreach (var b in byteArray)
            //{
            //    Console.Write(b);
            //}


            File.WriteAllText("textfile2.txt", "hello sdf中国");
            File.WriteAllLines("textfile3.txt",new string[]{" sdfsdflk","213412","流口水的减肥"});

            byte[] data = File.ReadAllBytes("3.LINQ.png");
            File.WriteAllBytes("4.png", data);
        }
    }
}

3、使用FileStream读写文件

namespace _002_fileStream读写文件
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //1,创建文件流 用来操作文件
            FileStream stream = new FileStream("TextFile1.txt", FileMode.Open);

            //2, 读取或者写入数据
            byte[] data = new byte[1024];//数据容器
            while (true)
            {
                int length = stream.Read(data, 0, data.Length);
                if (length == 0) {
                    Console.WriteLine("读取结束");
                    break;}

                for (int i = 0; i < length; i++)
                {
                    Console.WriteLine(data[i] + " ");
                }
            }

            //使用filestream完成文件复制
            FileStream readStream = new FileStream("新建 Microsoft Excel 工作表.xlsx", FileMode.Open);

            FileStream writeStream = new FileStream("新建 Microsoft Excel 工作表fu.xlsx", FileMode.Create);

            byte[] data1 = new byte[1024];

            while (true)
            {
                int length = readStream.Read(data1, 0, data.Length);
                if (length == 0)
                {
                    Console.WriteLine("读取结束");
                    break;
                }
                else
                {
                    writeStream.Write(data1, 0, length);
                }
            }

            writeStream.Close();
            readStream.Close();

        }
    }
}

4、使用StreamReader和StreamWriter读写文件

namespace _003_Streamread_write
{
    internal class Program
    {
        static void Main(string[] args)
        {
            StreamReader reader = new StreamReader("TextFile1.txt");

            while (true)
            {
                string line = reader.ReadLine();
                if (line == null) break;
                Console.WriteLine(line);
            }


            StreamReader reader1 = new StreamReader("TextFile1.txt");
            string str = reader1.ReadToEnd();//读取到文本的结尾(读取文本中所有的字符)
            Console.WriteLine(str);
            reader.Close();
            reader1.Close();


            //文本文件写入流
            StreamWriter writer = new StreamWriter("Textfile2.txt");

            while (true)
            {

                string line = Console.ReadLine();
                if (line == "q") break;
				//writer.Write(message);//写入一个字符串
                writer.WriteLine(line);//写入一个字符串并换行
            }

            writer.Close();
        }
    }
}

5、读取XML文件

XML实例文件

# 

<skills>
  <skill>
    <id>2id>
    <name lang="cn">天下无双name>
    <damage>123damage>
   skill>
  <skill>
    <id>3id>
    <name lang="cn">永恒零度name>
    <damage>90damage>
  skill>
  <skill>
    <id>4id>
    <name lang="en">Xxxname>
    <damage>400damage>
  skill>
skills>

读取xml文件

//Skill.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _004_XML文件读取
{
    internal class Skill
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Lang { get; set; }
        public int Damage { get; set; }

        public override string ToString()
        {
            return string.Format("Id: {0}, Name: {1}, Lang: {2}, Damage: {3}", Id, Name, Lang, Damage);
        }

    }
}

//Program.cs

using System.Xml;

namespace _004_XML文件读取
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //创建技能信息集合,用来存储所有的技能信息
            List<Skill> skillList = new List<Skill>();
            // XmlDocment专门用来解析xml文档的
            XmlDocument xmlDoc = new XmlDocument();

            //选择要加载解析的xml文档的名字
            //xmlDoc.Load("skillinfo.txt");
            xmlDoc.LoadXml(File.ReadAllText("skillinfo.txt"));//传递一个字符串(xml格式的字符串)

            //得到根结点 (xmlnode用来代表一个结点)
            XmlNode rootNode = xmlDoc.FirstChild;

            //得到根结点下面的子节点的集合
            XmlNodeList skillNodeList = rootNode.ChildNodes;//获取当前结点下面的所有子节点

            foreach (XmlNode skillNode in skillNodeList)
            {
                Skill skill = new Skill();
                XmlNodeList fileNodeList = skillNode.ChildNodes;//获取skill结点下面所有的结点 
                foreach (XmlNode fileNode in fileNodeList)
                {
                    if (fileNode.Name == "id")//通过Name属性 可以获取一个结点的名字
                    {
                        int id = Int32.Parse(fileNode.InnerText);//获取结点内部的文本
                        skill.Id = id;
                    }
                    else if (fileNode.Name == "name")
                    {
                        skill.Name = fileNode.InnerText;
                        skill.Lang = fileNode.Attributes[0].Value;
                    }
                    else
                    { 
                        skill.Damage = Int32.Parse(fileNode.InnerText);
                    }
                }

                skillList.Add(skill);
            }

            foreach (Skill skill in skillList)
            {
                Console.WriteLine(skill);
            }


        }
    }
}

示例文件

//xml技能信息.txt

<SkillInfo>
    <SkillList>
        <Skill
            SkillID="20002"  
            SkillEngName="Smash" 
            TriggerType="1" 
            ImageFile="data/gfx/image/gui_icon_skill_000.dds" 
            AvailableRace="7" 
        >
			<Name>重击Name>
		Skill>
        <Skill
            SkillID="20003" 
            SkillEngName="Hide"
            TriggerType="2" 
            ImageFile="data/gfx/image/gui_icon_skill_001.dds"
            AvailableRace="1" 
        >
			<Name>隐身Name>
		Skill>
        <Skill
            SkillID="20004" 
            SkillEngName="Ikari" 
            TriggerType="3" 
            ImageFile="data/gfx/image/gui_icon_skill_002.dds" 
            AvailableRace="1" 
        >
			<Name>怒之翼Name>
		Skill>
        <Skill
            SkillID="20005" 
            SkillEngName="Revenge" 
            TriggerType="5" 
            ImageFile="data/gfx/image/gui_icon_skill_003.dds" 
            AvailableRace="2" 
        >
			<Name>光之复仇Name>
		Skill>
    SkillList>
SkillInfo>

读取XML技能信息

//Skill.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _005_读取XML技能信息
{
    internal class Skill
    {
        public int Id { get; set; }
        public string Name { get; set; }

        public string EngName { get; set; }
        public int TriggerType { get; set; }
        public string ImageFile { get; set; }
        public int AvailableRace { get; set; }

        public override string ToString()
        {
            return string.Format("Id: {0}, Name: {1}, EngName: {2}, TriggerType: {3}, ImageFile: {4}, AvailableRace: {5}", Id, Name, EngName, TriggerType, ImageFile, AvailableRace);
        }

    }
}

//Program.cs

using System.Xml;

namespace _005_读取XML技能信息
{
    internal class Program
    {
        static void Main(string[] args)
        {
            List<Skill> skillList = new List<Skill>();

            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load("xml技能信息.txt");

            //XmlNode skillInfoNode = xmlDoc.FirstChild;
            //XmlNode skillListNode = skillInfoNode.FirstChild;
            XmlNode skillListNode = xmlDoc.FirstChild.FirstChild;

            XmlNodeList skillNodeLsit = skillListNode.ChildNodes;

            foreach (XmlNode skillNode in skillNodeLsit)
            {
                Skill skill = new Skill();
                skill.Name = skillNode["Name"].InnerText;
                //获取该结点属性的集合
                XmlAttributeCollection collection = skillNode.Attributes;
                //通过字符串索引器 获取一个属性对象
                skill.Id = Int32.Parse(collection["SkillID"].Value);
                skill.EngName = collection["SkillEngName"].Value;
                skill.TriggerType = Int32.Parse(collection["TriggerType"].Value);
                skill.ImageFile = collection["ImageFile"].Value;
                skill.AvailableRace = Int32.Parse(collection["AvailableRace"].Value);
                skillList.Add(skill);

            }

            foreach (Skill skill in skillList)
            {
                Console.WriteLine(skill);
            }
        }
    }
}

6、读取json文件

bejson.com json格式校验、在线编辑等

示例

[
{"id":2,"name":"天下无双","damage":123 },
{"id":3,"name":"天下无贼","damage":21 },
{"id":4,"name":"咫尺天涯","damage":900 }
]

使用Listjosn读取

//Skill.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _006_Josn读取信息
{
    internal class Skill
    {
        public int id;
        public int damage;
        public string name;

        public override string ToString()
        {
            return string.Format("Id: {0}, Damage: {1}, Name: {2}", id, damage, name);
        }

    }
}

//Program.cs

using LitJson;

namespace _006_Josn读取信息
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //使用litjson进行解析json文本
            //两种引入litjson的方法
            //1,去litjson的网站下载litjson.dll 然后添加引用 找到dll所在目录
            //2,在解决方案资源管理器右键 打开管理netget程序包,在联机里面搜索litjson  在搜索结果中选择一个 点击安装

            List<Skill> skillList = new List<Skill>();
            //我们使用jsonMapper去解析json文本
            //jsondata代表一个数组或者一个对象
            //在这里jsonData代表数组 
            JsonData jsonData = JsonMapper.ToObject(File.ReadAllText("json技能信息.txt"));
            foreach (JsonData temp in jsonData)//在这里temp代表一个对象
            {
                Skill skill = new Skill();
                JsonData idValue = temp["id"]; //通过字符串索引器可以取得键值对的值
                JsonData nameValue = temp["name"];
                JsonData damageValue = temp["damage"];
                int id = Int32.Parse(idValue.ToString());
                int damage = Int32.Parse(damageValue.ToString());
                Console.WriteLine(id+":"+nameValue.ToString()+":"+damage);
                skill.id = id;
                skill.damage = damage;
                skill.name = nameValue.ToString();
                skillList.Add(skill);
            }
            foreach (var temp in skillList)
            {
                Console.WriteLine(temp);
            }
        }
    }
}

使用泛型去解析json

using LitJson;

namespace _006_Josn读取信息
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //使用泛型去解析json
            //json里面对象的键必须跟定义的类里面的字段或者属性保持一致
            Skill[] skillArray = JsonMapper.ToObject<Skill[]>(File.ReadAllText("json技能信息.txt"));
            foreach (Skill skill in skillArray)
            {
                Console.WriteLine(skill);
            }

            List<Skill> skillList = JsonMapper.ToObject<List<Skill>>(File.ReadAllText("json技能信息.txt"));

            foreach (Skill skill in skillList)
            {
                Console.WriteLine(skill);
            }

        }
    }
}

7、读取excel文件

using System.Data;
using System.Data.OleDb;

namespace _007_读取excel操作
{
    internal class Program
    {
        static void Main(string[] args)
        {
            string fileName = "装备信息.xls";
            string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + fileName + ";" + ";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1\"";
            //创建连接到数据源的对象
            OleDbConnection connection = new OleDbConnection(connectionString);

            //打开连接
            connection.Open();

            string sql = "select * from [Sheet1$]";//这个是一个查询命令

            OleDbDataAdapter adapter = new OleDbDataAdapter(sql, connection);

            DataSet dataSet = new DataSet();//用来存放数据 用来存放DataTable

            adapter.Fill(dataSet);//表示把查询的结果(datatable)放到(填充)dataset里面

            connection.Close();//释放连接资源

            //取得数据
            DataTableCollection tableCollection = dataSet.Tables;//获取当前集合中所有的表格

            DataTable table = tableCollection[0];//因为我们只往dataset里面放置了一张表格,所以这里取得索引为0的表格就是我们刚刚查询到的表格

            //取得表格中的数据
            //取得table中所有的行
            DataRowCollection rowCollection = table.Rows;//返回了一个行的集合

            //遍历行的集合,取得每一个行的datarow对象
            foreach (DataRow row in rowCollection)
            {
                //取得row中前8列的数据 索引0-7
                for (int i = 0; i < 8; i++)
                {
                    Console.Write(row[i] + " ");
                }
                Console.WriteLine();

            }
        }
    }
}

如果提示没有System.Data.OleDb,则在netget程序包中下载。

如果报错“Microsoft.Jet.OLEDB.4.0’ provider is not registered on the local machine”,解决方法有两个:

1.安装64位office2010;2.把程序的目标平台改为x86而不是Any Cpu,因为x86的程序可以同时在32位和64位上运行,而x64的程序只能在64位的程序上运行。

你可能感兴趣的:(C#,入门与提升,c#,xml,json)