C# WPF读取文本内容的7种方式

news2024/11/24 22:43:03

文章目录

  • 前言
  • 一、界面展示
  • 二、使用步骤
    • 1.引入库
    • 2.界面代码
    • 3.后台代码
      • (1)打开文件
      • (2)第一种:基于FileStream,并结合它的Read方法读取指定的字节数组,最后转换成字符串进行显示。
      • (3)第二种:基于FileStream,一个字节一个字节读取,放到字节数组中,最后转换成字符串进行显示。
      • (4)第三种:基于File类,直接全部读取出来并显示。
      • (5)第四种:基于StreamReader类,一行一行读取,最后拼接并显示。
      • (6) 第五种:基于StreamReader类,一次读到结尾,最后显示
      • (7)第六种:基于StreamReader类,一行一行读取,通过EndOfStream判断是否到结尾,最后拼接并显示
      • (8)第七种:基于FileStream和 StreamReader类来实现
      • (9)打印代码
      • (10)System 扩展方法


前言

C#读取文本内容的7种方式


一、界面展示

在这里插入图片描述

二、使用步骤

1.引入库

代码如下(示例):

using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using static System.Net.Mime.MediaTypeNames;

2.界面代码

代码如下(示例):

<Window x:Class="ReadFileDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ReadFileDemo"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="100"/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Label Grid.Row="0" Grid.Column="0" Content="选择文件" VerticalAlignment="Center" HorizontalAlignment="Center"></Label>
        <TextBox Grid.Row="0" Grid.Column="1" x:Name="tbFileName" Text="C:\Users\beango.cheng\Desktop\Barcode系统.txt" VerticalContentAlignment="Center" VerticalAlignment="Center" Height="30" Margin="10 0 80 0"></TextBox>
        <Button Grid.Row="0" Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Right" Width="60" Height="30" Margin="5" Content="选择" Click="SelectButton_OnClick"></Button>
        <RichTextBox Grid.Row="1" Grid.Column="1" Grid.RowSpan="10" Name="txtRichTextBox" Margin="10 5 5 5"></RichTextBox>       
        <Button Grid.Row="1" Grid.Column="0"  Margin="10 5" Content="第一种方式" Click="ReadFileButton1_OnClick"></Button>
        <Button Grid.Row="2" Grid.Column="0"  Margin="10 5" Content="第二种方式" Click="ReadFileButton2_OnClick"></Button>
        <Button Grid.Row="3" Grid.Column="0"  Margin="10 5" Content="第三种方式" Click="ReadFileButton3_OnClick"></Button>
        <Button Grid.Row="4" Grid.Column="0"  Margin="10 5" Content="第四种方式" Click="ReadFileButton4_OnClick"></Button>
        <Button Grid.Row="5" Grid.Column="0"  Margin="10 5" Content="第五种方式" Click="ReadFileButton5_OnClick"></Button>
        <Button Grid.Row="6" Grid.Column="0"  Margin="10 5" Content="第六种方式" Click="ReadFileButton6_OnClick"></Button>
        <Button Grid.Row="7" Grid.Column="0"  Margin="10 5" Content="第七种方式" Click="ReadFileButton7_OnClick"></Button>
    </Grid>
</Window>

3.后台代码

(1)打开文件

		private void SelectButton_OnClick(object sender, RoutedEventArgs e)
        {
            this.txtRichTextBox.Document.Blocks.Clear();
            AppendTestData("选择文件", MyBrushes.PASS);

            OpenFileDialog openFileDialog = new OpenFileDialog();

            openFileDialog.Title = "选择文件";

            openFileDialog.Multiselect = false;//选择多个文件

            openFileDialog.RestoreDirectory = true;//跟踪上次打开的文件的目录

            openFileDialog.Filter = "Text files(*.txt) | *.txt";

            if (openFileDialog.ShowDialog() == true)
            {
                tbFileName.Text = openFileDialog.FileName;
            }

        }

(2)第一种:基于FileStream,并结合它的Read方法读取指定的字节数组,最后转换成字符串进行显示。

    private void ReadFileButton1_OnClick(object sender, RoutedEventArgs e)
    {
        this.txtRichTextBox.Document.Blocks.Clear();

        AppendTestData("第一种:基于FileStream,并结合它的Read方法读取指定的字节数组,最后转换成字符串进行显示。", MyBrushes.Yellow);

        FileStream fs = new FileStream(this.tbFileName.Text, FileMode.Open, FileAccess.Read);
        int n = (int)fs.Length;
        byte[] b = new byte[n];
        int r = fs.Read(b, 0, n);
        fs.Close();
        string txtFileContent = Encoding.UTF8.GetString(b, 0, n);

        AppendTestData(txtFileContent, MyBrushes.Green);
    }

(3)第二种:基于FileStream,一个字节一个字节读取,放到字节数组中,最后转换成字符串进行显示。

	private void ReadFileButton2_OnClick(object sender, RoutedEventArgs e)
    {
        this.txtRichTextBox.Document.Blocks.Clear();

        AppendTestData("第二种:基于FileStream,一个字节一个字节读取,放到字节数组中,最后转换成字符串进行显示。", MyBrushes.Yellow);

        FileStream fs = new FileStream(this.tbFileName.Text, FileMode.Open, FileAccess.Read);
        long n = fs.Length;
        byte[] b = new byte[n];
        int data, index;
        index = 0;
        data = fs.ReadByte();
        while (data != -1)
        {
            b[index++] = Convert.ToByte(data);
            data = fs.ReadByte();
        }
        fs.Close();
        string txtFileContent = Encoding.UTF8.GetString(b);

        AppendTestData(txtFileContent, MyBrushes.Green);
    }

(4)第三种:基于File类,直接全部读取出来并显示。

	private void ReadFileButton3_OnClick(object sender, RoutedEventArgs e)
	{
	    this.txtRichTextBox.Document.Blocks.Clear();
	
	    AppendTestData("第三种:基于File类,直接全部读取出来并显示。", MyBrushes.Yellow);
	
	    string txtFileContent = System.IO.File.ReadAllText(tbFileName.Text);
	
	    AppendTestData(txtFileContent, MyBrushes.Green);
	}

(5)第四种:基于StreamReader类,一行一行读取,最后拼接并显示。

 	private void ReadFileButton4_OnClick(object sender, RoutedEventArgs e)
    {
        this.txtRichTextBox.Document.Blocks.Clear();

        AppendTestData("第四种:基于StreamReader类,一行一行读取,最后拼接并显示。", MyBrushes.Yellow);

        StreamReader sr = new StreamReader(this.tbFileName.Text, Encoding.UTF8);
        string line = sr.ReadLine();
        while (line != null)
        {
            AppendTestData(line, MyBrushes.Green);
            line = sr.ReadLine();
            //if (line != null)
            //{
            //    this.rtb_Content.AppendText("\r\n");
            //}
        }
        sr.Close();
    }

(6) 第五种:基于StreamReader类,一次读到结尾,最后显示

  	private void ReadFileButton5_OnClick(object sender, RoutedEventArgs e)
    {
        this.txtRichTextBox.Document.Blocks.Clear();
        AppendTestData("第五种:基于StreamReader类,一次读到结尾,最后显示。", MyBrushes.Yellow);
        StreamReader sr = new StreamReader(this.tbFileName.Text, Encoding.UTF8);
        string txtFileContent = sr.ReadToEnd();
        sr.Close();

        AppendTestData(txtFileContent, MyBrushes.Green);
    }

(7)第六种:基于StreamReader类,一行一行读取,通过EndOfStream判断是否到结尾,最后拼接并显示

 private void ReadFileButton6_OnClick(object sender, RoutedEventArgs e)
    {
        this.txtRichTextBox.Document.Blocks.Clear();
        AppendTestData("第六种:基于StreamReader类,一行一行读取,通过EndOfStream判断是否到结尾,最后拼接并显示。", MyBrushes.Yellow);

        StreamReader sr = new StreamReader(this.tbFileName.Text, Encoding.UTF8);

        //while (!sr.EndOfStream)
        //{
        //    AppendTestData(sr.ReadLine(),MyBrushes.Green);

        //}
        string txtFileContent = string.Empty;
        while (!sr.EndOfStream)
        {
             txtFileContent += sr.ReadLine();

            if (!sr.EndOfStream)
            {
                txtFileContent += "\r\n";
            }
        }

        sr.Close();

        AppendTestData(txtFileContent, MyBrushes.Green);
    }

(8)第七种:基于FileStream和 StreamReader类来实现

 private void ReadFileButton7_OnClick(object sender, RoutedEventArgs e)
    {
        this.txtRichTextBox.Document.Blocks.Clear();
        AppendTestData("第七种:基于FileStream和 StreamReader类来实现。", MyBrushes.Yellow);
        FileStream fs = new FileStream(this.tbFileName.Text, FileMode.Open, FileAccess.Read);
        StreamReader sr = new StreamReader(fs, Encoding.UTF8);
        string txtFileContent = sr.ReadToEnd();
        fs.Close();
        sr.Close();

        AppendTestData(txtFileContent, MyBrushes.Green);
    }

(9)打印代码

	public enum MyBrushes : uint
    {
        Black = 0xFF000000,
        White = 0xFFFFFFFF,
        Red = 0xFFBF1818,
        Green = 0xFF28B028,
        Blue = 0xFF2880D8,
        Yellow = 0xFFD8B628,
        IDLE = 0x88237380,
        PASS = 0x882DB96D,
        FAIL = 0x88CB1111,
        TESTING = 0x88876918,
        RichBlue = 0xFF0098FF,
        RichGreen = 0xFF1ACB62,
        RichRed = 0xFFFB4B4B,
        RichYellow = 0xFFEE9617
    }
	private Block AppendTestData(string data,MyBrushes myBrushes)
    {
        Block block = null;

        if(this.Dispatcher.Thread == System.Threading.Thread.CurrentThread)
        {
            block = GetBlock(data, myBrushes);
            this.txtRichTextBox.Document.Blocks.Add(block);
        }
        else
        {
            this.Dispatcher.Invoke((Action)delegate
            {
                block = AppendTestData(data, myBrushes);
            });
        }

        return block;
    }

    private Block GetBlock(string data,MyBrushes myBrushes)
    {
        Inline inline = new Run(data);

        inline.Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString(myBrushes.ToBrushString()));

        return new Paragraph(inline)
        {
            LineHeight = 1.0
        };
    }

(10)System 扩展方法

namespace System
{
    public static partial class ExpandClass
    {
        public static string ToBrushString(this Enum e)
        {
            return "#" + Convert.ToUInt32(e).ToString("X2");
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/614746.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

迎战算力黄金时代,惠普Z系列工作站焕新升级

作者伍杏玲 随着今年 AIGC 浪潮席卷全球&#xff0c;AI应用的迅速增长对算力提出更多挑战。据《全球计算力指数评估报告》显示&#xff0c;未来5年&#xff0c;全球算力规模将以超过50%的速度飞速增长&#xff0c;预计到2024年&#xff0c;中国将生产出高达36ZB的数据量&#…

盲区死角「暗藏」风险隐患,哪些智能化方案或将前装「标配」

因车辆盲区死角而引发的交通事故&#xff0c;近年来呈现高发态势。上周一则《交警实测SUV视野盲区有多大&#xff0c;75个孩子藏在盲区&#xff0c;一点看不见》的视频火爆社交网络。 视频中&#xff0c;交警让幼儿园老师坐进一辆SUV警车的驾驶位并戴上眼罩&#xff0c;然后引导…

uniapp可视化操作-diygw

uniapp可视化操作:DIY可视化-拖拽设计1天搞定主流小程序环境安装 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 uniapp可视化操作:DIY可视化-拖拽设计1天搞定主流小程序环境安装前言一、DIY可视化桌面客户端安装…

Linux--ServerProgramming--(2)socket

1. 主机字节序和网络字节序 下面以32位机为前提&#xff1a;CPU累加器一次能装载至少 4 字节&#xff0c;即一个整数。字节序分为&#xff1a;1.大端字节序&#xff08;big endian&#xff09;指一个整数的高位字节&#xff08;23~32 bit &#xff09;存储在内存的低地址处&am…

Nat Biotechnol -- 生成式AI进军更高效价抗体

类似于ChatGPT的语言模型已被应用于改进针对COVID-19、埃博拉和其他病毒的抗体疗法。 代码看不懂&#xff1f;ChatGPT 帮你解释&#xff0c;详细到爆&#xff01; 单克隆抗体&#xff08;Y形&#xff09;与SARS-CoV-2病毒纤突蛋白&#xff08;红色&#xff09;上的结合位点&…

长光程气体吸收池的真空压力精密控制解决方案

摘要&#xff1a;目前用于气体吸收池真空压力控制的压力控制器存在有残留气体和无法进行高真空测量的问题&#xff0c;无法进行微量气体的光谱分析。为此&#xff0c;本文提出了动态平衡法的解决方案&#xff0c;即采用两个高速真空低漏率的电子针阀分别调节进气和出气流量&…

02_类加载子系统

目录 1、Jvm内存结构概述二、类加载器与类的加载过程1、类加载器子系统的作用2、类的加载过程 三、类加载器的分类1、启动类加载器2、扩展类加载器3、应用程序类加载器4、用户自定义加载器5、获取ClassLoader的几种方式 五、双亲委派机制1、什么是双亲委派机制2、双亲委派机制的…

Windows上SVN迁移至Linux

1.从windows导出svn文件 bat脚本 echo offsvnadmin dump E:\Repositories\3goodsoft_carbon_admin > D:/test/3goodsoft_carbon_admin.dump svnadmin dump E:\Repositories\3goodsoft_android > D:/test/3goodsoft_android.dump svnadmin dump E:\Repositories\3g…

chatgpt赋能python:Python如何在指定目录下创建文件

Python如何在指定目录下创建文件 Python是一种流行的编程语言&#xff0c;因为它易于学习、易于使用和非常灵活。其中一个常见的任务是在指定目录下创建文件&#xff0c;这在编写应用程序或脚本时经常需要。在本文中&#xff0c;我们将介绍使用Python在指定目录下创建文件的方…

第05章 数组

一 数组的概述 1.1 为什么需要数组 需求分析1&#xff1a; 需要统计某公司50个员工的工资情况&#xff0c;例如计算平均工资、找到最高工资等。用之前知识&#xff0c;首先需要声明50个变量来分别记录每位员工的工资&#xff0c;这样会很麻烦。因此我们可以将所有的数据全部…

chatgpt赋能python:Python如何取消空格

Python如何取消空格 在Python编程中&#xff0c;取消字符串中的空格是一个常见的需求。特别是在进行字符串处理和数据清洗时&#xff0c;取消空格可以方便数据的分析和处理。在本次文章中&#xff0c;我们将介绍使用Python语言如何取消字符串中的空格&#xff0c;以及一些常见…

如何将会议录音转文字?你知道如何将会议录音转文字吗?

会议录音转文字的需求在现代工作和生活中变得越来越重要。随着会议的频繁举行&#xff0c;我们常常需要记录会议内容以便后续查阅和分析。而传统的手动记录方式效率低下且容易出错。幸运的是&#xff0c;现在有许多会议录音转文字的应用程序可供选择&#xff0c;它们可以将会议…

uniPush2.0踩坑实录

首先&#xff0c;按照下面链接&#xff0c;把预备工作做完&#xff0c;基本可以实现dcloud后台网页推送&#xff1a; uniPush2.0 消息推送_没有白天的CXY的博客-CSDN博客 第二步&#xff0c;走完本流程后&#xff0c;会遇到各种坑&#xff0c;一个一个来踩&#xff1a; 第一坑…

龙芯2K1000实战开发-处理器硬件接口测试(下)

文章目录 概要整体架构流程技术名词解释技术细节小结概要 提示:这里可以添加技术概要 龙芯 2K 集成了 USB、SATA、PCIE 等高速串行接口,在板级测试时需要按照相应的 规范发出测试波形。本文档对这些接口分别介绍了发出测试波形的方法 整体架构流程 提示:这里可以添加技术…

电子企业如何快速部署一套MES生产管理系统

电子企业如何快速部署一套MES生产管理系统 引言 在数字化时代&#xff0c;电子企业的发展离不开高效的生产管理。MES生产管理系统是生产管理的核心工具&#xff0c;可以帮助电子企业提升生产效率和产品质量。本文将介绍电子企业快速部署一套MES生产管理系统的步骤和优势&…

C++算法:排序之三(堆排序)

C算法&#xff1a;排序 排序之一&#xff08;插入、冒泡、快速排序&#xff09; 排序之二&#xff08;归并、希尔、选择排序&#xff09; 排序之三&#xff08;堆排序&#xff09; 排序之四&#xff08;计数、基数、桶排序&#xff09; 文章目录 C算法&#xff1a;排序二、比较…

全排列--回溯

1题目 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2&#xff1a; 输入&#xff1a…

关于Spring中自带的@Schedule实现自动任务

SpringBoot中自带了一个能够实现定时任务的注解Schedule 如果定时任务比较简单&#xff0c;则可以使用SpringBoot中自带的Schedule&#xff0c;但是如果任务调度很复杂的话&#xff0c;就建议使用Quartz组件了。 说一下这个Schedule注解怎么用&#xff1f; 基本使用 第一步&a…

Centos8之系统升级

一、centos8系统简介 CentOS 8是一个基于Red Hat Enterprise Linux&#xff08;RHEL&#xff09;源代码构建的开源操作系统。它是一款稳定、可靠、安全的服务器操作系统&#xff0c;适合用于企业级应用和服务的部署。CentOS 8采用了最新的Linux内核和软件包管理系统&#xff0c…

chatgpt赋能python:Python如何分行——提高代码可读性和效率的必备技能

Python如何分行——提高代码可读性和效率的必备技能 什么是分行&#xff1f; 分行&#xff0c;即将一行长代码分为多行&#xff0c;使得代码更加易读、易维护、易修改。 Python作为一门高级编程语言&#xff0c;具有简洁、易读、高效的特点。但在实际编程过程中&#xff0c;…