WinForms 零基础进阶教程:文件操作与 CSV 处理

文章目录

    • 文件操作
      • 数据存储与文件操作
      • 文件存取的好处
      • 文件存取的方式
      • 文本文件的写入和读取
      • 文本文件的删除、复制和移动
    • 目录的操作
      • 文件属性操作
      • 文件路径
    • 对话框
      • OpenFileDialog对话框
      • SaveFileDialog对话框
      • 对话框中CheckPathExists属性的应用
    • CSV 文件读写与 DataGridView 进阶
      • DataGridView主要属性:
      • DataSource
      • 行(Row 相关属性)
      • 列(Column 相关属性)
      • CSV(Comma Separated Values 逗号分隔值)
      • CSV文件格式
      • CSV 文件格式
      • CSV 文件读写简易版本
    • 实践练习:实现登录注册功能
      • 注册功能
      • 登录功能
    • 总结

文件操作

数据存储与文件操作

在软件开发中,数据存储是核心功能之一。数据存储的方式主要分为数据库存储和文件存储。

  • 数据库存储:适合大量、且关系复杂并有序的数据存取。
  • 文件存取:适合大量、数据关系简单的数据存取,如系统的日志文件等。

文件存取的好处

  • 读取操作方便:文件存储的数据可以直接通过文件系统进行读取。
  • 存储介质灵活:文件可以存储在任何介质中,如硬盘、U盘、网络等。

文件存取的方式

  • 文本文件的写入和读取:通过流的方式进行数据的存取。
  • 二进制文件的写入和读取:适用于存储图像、音频、视频等非文本数据。

文本文件的写入和读取

private void button1_Click(object sender, EventArgs e)
{//1.创建一个文件流FileStream fs = new FileStream(@"myfile.txt", FileMode.Create);//2.创建写入器StreamWriter sw = new StreamWriter(fs);//3.以流的方式写入数据sw.Write(this.textBox1.Text.Trim());//4.关闭写入器sw.Close();//5.关闭文件流fs.Close();
}

文本文件的删除、复制和移动

文本文件的删除、复制和移动是文件操作中的常见需求。例如,在软件的在线升级或下载文件时,通常会先将文件保存到临时文件夹中,确认无误后再进行相应的操作。

//删除文件
//删除文件private void button4_Click(object sender, EventArgs e){File.Delete(this.textBox2.Text);}//复制文件private void button5_Click(object sender, EventArgs e){//首先判断路径文件是否存在if (File.Exists(this.textBox2.Text)){//Ctrl+CFile.Copy(this.textBox2.Text, this.textBox3.Text);}}//移动文件private void button6_Click(object sender, EventArgs e){//Ctrl + XFile.Move(this.textBox2.Text, this.textBox3.Text);}

目录的操作

目录操作包括创建、删除、列出目录内容等。

//显示指定目录下所有的文件//显示指定目录下所有的文件private void button7_Click(object sender, EventArgs e){string [] files=   Directory.GetFiles(@"E:\0408_文件操作\01_目录和文件的操作");//this.textBox1.Text = "";this.textBox1.Clear();foreach (string file in files) {this.textBox1.Text+= file+"\r\n";}}//显示指定目录下的所有子目录private void button8_Click(object sender, EventArgs e){//目录下的子目录//string[] dirs= Directory.GetDirectories(@"E:\0408_文件操作\01_目录和文件的操作"); this.textBox1.Text = "";//this.textBox1.Clear();//foreach (string dir in dirs) {//    this.textBox1.Text += dir + "\r\n";//}//目录下的所有子目录(包括子目录的目录)//递归: 函数自己调用自己(要有终止条件,没有终止条件就是死循环)this.textBox1.Clear();GetAllsubDit(@"E:\0408_文件操作\01_目录和文件的操作");}private void GetAllsubDit(string path){string[] dirs = Directory.GetDirectories(path);foreach (string dir in dirs){//判断当前目录是否还有子目录,如果还有子目录,需要再次进行函数的调用//注意这里的Path不是参数path,而是Path类(路径类)if (Path.GetDirectoryName(dir).Length>0){GetAllsubDit(dir);}this.textBox1.Text += dir + "\r\n";}}//在指定目录下创建一个子目录private void button9_Click(object sender, EventArgs e){Directory.CreateDirectory(@"吴凡");}//删除指定目录下的所有的子目录和文件private void button10_Click(object sender, EventArgs e){//删除 只能删除空目录//Directory.Delete(@"吴凡");//使用DirectoryInfo的实例对象调用Delete方法并设置参数为true,可以删除非空目录DirectoryInfo dir =  new DirectoryInfo(@"吴凡");dir.Delete(true);}

文件属性操作

通过File类和FileInfo类可以操作文件的属性,如设置文件为只读或隐藏。
FileInfo使用|表示设置多个属性
例如 fi.Attributes=FileAttributes.Archive | FileAttributes.ReadOnly

			//只读  ReadOnly  和 隐藏 Hidden//获取文件的属性Console.WriteLine(File.GetAttributes(@"C:\OneDriveTemp"));//设置文件的属性File.SetAttributes(@"C:\吴凡", FileAttributes.ReadOnly);FileInfo fi = new FileInfo(@"C:\吴凡");// Console.WriteLine(fi.Attributes.ToString());//设置fi.Attributes = FileAttributes.ReadOnly;fi.Attributes = FileAttributes.Archive;//使用 | 设置多个属性//只读属性和系统属性,删除的时候会拒绝访问fi.Attributes = FileAttributes.Archive | FileAttributes.ReadOnly;Console.WriteLine(fi.Attributes.ToString());

文件路径

文件路径的操作方法主要在Path类中实现,同时也可以使用Environment类获取环境变量相关的路径信息。
相对路径:不完整的路径,相对于当前项目的bin\Debug文件夹
绝对路径:完整的路径,从盘符开始

string dirPath = @"C:\Users\12015\Desktop\C#工业软件开发文档";string filePath = @"C:\Users\12015\Desktop\C#工业软件开发文档\打开项目\1.png";//获取当前路径Console.WriteLine(Environment.CurrentDirectory);Console.WriteLine("----------------------");//获取文件后缀Console.WriteLine(Path.GetExtension(filePath));//获取文件或者文件夹的名字Console.WriteLine(Path.GetFileName(dirPath));Console.WriteLine(Path.GetFileName(filePath));//获取绝对路径Console.WriteLine(Path.GetFullPath(dirPath));Console.WriteLine(Path.GetFullPath(filePath));Console.WriteLine(Path.GetFullPath(@"1.txt"));//更改文件后缀(改扩展名并不影响实际文件系统上的文件类型或内容)Console.WriteLine(Path.ChangeExtension(filePath,"jpg"));//生成路径Console.WriteLine(Path.Combine(new string[] { @"C:\", "Users", "12015" }));//获取根路径Console.WriteLine(Path.GetPathRoot(filePath));//随机生成文件或者文件名Console.WriteLine(Path.GetRandomFileName());//----------------------了解-----------------//获取文件名中的无效字符Console.WriteLine(Path.GetInvalidFileNameChars());//获取路径中的无效字符Console.WriteLine(Path.GetInvalidPathChars());//获取当前系统临时文件夹的路径Console.WriteLine(Path.GetTempPath());Console.WriteLine(Path.GetTempFileName());//..............

对话框

文件对话框是与用户交互的重要组件,常用于打开或保存文件。
常用属性表:

属性名功能说明
InitialDirectory对话框的初始目录
Filter文件筛选器,按"显示名称|类型"格式编写 例如,“文本文件(.txt)|.txt|所有文件(.)||.
FileName选取的文件的路径
Title将显示在对话框标题栏中的字符
RestoreDirectory指示对话框在关闭前是否还原当前目录。
CheckPathExists在对话框返回之前,检查指定路径是否存在

OpenFileDialog对话框

//打开文件对话框openFileDialog1.InitialDirectory = @"E:\";openFileDialog1.Filter = "文本文件|*.txt";openFileDialog1.Title = "选择txt文件";if (this.openFileDialog1.ShowDialog()==DialogResult.OK){//openFileDialog1.FileName;FileStream fs = new FileStream(openFileDialog1.FileName, FileMode.Open);StreamReader sr = new StreamReader(fs, Encoding.UTF8);this.textBox1.Text = sr.ReadToEnd();sr.Close();fs.Close();}

SaveFileDialog对话框

			saveFileDialog1.InitialDirectory = @"E:\";saveFileDialog1.Filter = "文本文件|*.txt";saveFileDialog1.Title = "另存为txt文件";if (this.saveFileDialog1.ShowDialog() == DialogResult.OK){FileStream fs = new FileStream(saveFileDialog1.FileName, FileMode.Create);StreamWriter sw = new StreamWriter(fs);sw.Write(this.textBox1.Text.Trim());sw.Close();fs.Close();}

对话框中CheckPathExists属性的应用

CheckPathExists 属性通常出现在与文件选择相关的对话框组件中,如 Windows Forms 中的 OpenFileDialog 或 SaveFileDialog。这个属性用于控制当用户在对话框中指定一个不存在的文件或目录路径时,对话框是否应该显示警告。启用此属性可以增强用户的交互体验,防止他们在尝试打开或保存文件时因路径无效而导致操作失败

示例

对于 OpenFileDialog:

using System;
using System.Windows.Forms;public partial class YourForm : Form
{public YourForm(){InitializeComponent();}private void btnOpenFile_Click(object sender, EventArgs e){using (OpenFileDialog openFileDialog = new OpenFileDialog()){// 设置 CheckPathExists 属性openFileDialog.CheckPathExists = true;// 其他对话框设置,如 Filter、Title 等openFileDialog.Filter = "Text Files (*.txt)|*.txt|All Files (*.*)|*.*";openFileDialog.Title = "Open Text File";if (openFileDialog.ShowDialog(this) == DialogResult.OK){string filePath = openFileDialog.FileName;// 在这里处理选中的文件Console.WriteLine($"Selected file: {filePath}");}}}
}

对于 SaveFileDialog:

using System;
using System.Windows.Forms;public partial class YourForm : Form
{public YourForm(){InitializeComponent();}private void btnSaveFile_Click(object sender, EventArgs e){using (SaveFileDialog saveFileDialog = new SaveFileDialog()){// 设置 CheckPathExists 属性saveFileDialog.CheckPathExists = true;// 其他对话框设置,如 Filter、Title、OverwritePrompt 等saveFileDialog.Filter = "Text Files (*.txt)|*.txt|All Files (*.*)|*.*";saveFileDialog.Title = "Save Text File";saveFileDialog.OverwritePrompt = true;if (saveFileDialog.ShowDialog(this) == DialogResult.OK){string filePath = saveFileDialog.FileName;// 在这里处理保存文件的操作Console.WriteLine($"Saving file to: {filePath}");// 实际保存文件的代码...}}}
}

如果希望允许用户指定不存在的路径而不过滤这种行为,只需将 CheckPathExists 设为 false 即可。

CSV 文件读写与 DataGridView 进阶

CSV(Comma Separated Values 逗号分隔值)文件是一种简单的文件格式,广泛用于存储表格数据。CSV 文件中的数据通常由行和列组成,每行数据代表表格中的一行,每列数据由逗号或其他分隔符分隔。

DataGridView主要属性:

DataSource

DataSource 属性用于设置 DataGridView 控件的数据源。常用的数据源类型有:

  • DataTable:从数据库查询得到的数据表/读取的文件。
  • List<T>:泛型集合,其中 T 是数据模型的类型。

行(Row 相关属性)

  • DataGridViewRow: 表示 DataGridView 控件中的一行。
  • DataGridViewRowCollection: 表示 DataGridView 控件中所有行的集合。
  • Rows: 通过此属性可以访问或操作行集合中的行。

列(Column 相关属性)

  • DataGridViewColumn: 表示 DataGridView 控件中的一列。
  • DataGridViewColumnCollection: 表示控件中所有列的集合。
  • Columns: 通过此属性可以访问或操作列集合中的列。

CSV(Comma Separated Values 逗号分隔值)

是一种文件格式(如.txt、.doc等),也可理解 .csv 文件就是一种特殊格式的纯文本文件。即是一组字符序列,字符之间已英文字符的逗号或制表符(Tab)分隔。

在 windows 系统环境上 .csv 文件打开方式有多种,如记事本、excel、Notepad++ 等,只要是文本编辑器都能正确打开。

CSV文件格式

CSV文件格式旨在存储表格数据,该数据通常包含行和列。每一行数据代表表格中的一行,每一列代表表格中的一列。CSV文件中每个数据字段之间都使用逗号分隔。每一行以换行符结束。如:

CSV 文件格式

姓名,年龄,性别
小明,20, 男
小红,18, 女
小华,19, 女

private void button1_Click(object sender, EventArgs e){if (openFileDialog1.ShowDialog()==DialogResult.OK){FileStream fs = new FileStream(openFileDialog1.FileName, FileMode.Open);StreamReader sr = new StreamReader(fs,Encoding.Default);DataTable dataTable = new DataTable();string data;//将读取到的一行数据存储到里面string[] lines; bool isFirst=true;//字符串==>DataTable==>DataSourcewhile ((data=sr.ReadLine())!=null){lines = data.Split(',');//将data里面的数据以,分割存储lines数组中if (isFirst){//判断是否是第一次读,如果是第一次读,就是读取每一列的第一个数据for (int i = 0; i < lines.Length; i++){dataTable.Columns.Add(lines[i]);}isFirst = false;}else{//如果不是第一次读取,就新增一行DataRow dataRow=  dataTable.NewRow();for (int i = 0; i < lines.Length; i++){dataRow[i] = lines[i];}dataTable.Rows.Add(dataRow);}}if (dataTable.Rows.Count==0){MessageBox.Show("没有数据");}else{dataGridView1.ColumnCount=dataTable.Columns.Count;for (int i = 0; i < dataTable.Columns.Count; i++){dataGridView1.Columns[i].HeaderText = dataTable.Columns[i].ColumnName;}for (int i = 0; i < dataTable.Rows.Count; i++){dataGridView1.Rows.Add(dataTable.Rows[i].ItemArray);}}sr.Close();fs.Close();}}private void button2_Click(object sender, EventArgs e){//DataSource==>DataTable==>字符串DataTable dataTable = new DataTable();for (int i = 0; i < dataGridView1.Columns.Count; i++){dataTable.Columns.Add(dataGridView1.Columns[i].HeaderText);}for (int i = 0; i < dataGridView1.Rows.Count; i++){DataRow dr=   dataTable.NewRow();for (int j = 0; j < dataGridView1.Columns.Count; j++){//将datagridView组件中某一个单元格的值传给dataTabledr[j] = dataGridView1[j, i].Value;}dataTable.Rows.Add(dr);}saveFileDialog1.Filter = "CSV files (*.csv)|*.csv";if (saveFileDialog1.ShowDialog()==DialogResult.OK){FileStream fs = new FileStream(saveFileDialog1.FileName, FileMode.Create);StreamWriter sw = new StreamWriter(fs,Encoding.Default);string data = null;for (int i = 0; i < dataTable.Columns.Count; i++){data += dataTable.Columns[i].ColumnName.ToString();if (i<dataTable.Columns.Count-1){data += ",";}}sw.WriteLine(data);data = null;for (int i = 0; i < dataTable.Rows.Count; i++){for (int j = 0; j < dataTable.Columns.Count; j++){data += dataTable.Rows[i][j].ToString();if (j < dataTable.Columns.Count - 1){data += ",";}}sw.WriteLine(data);data = null;}sw.Close();fs.Close();}}

CSV 文件读写简易版本

//读取CSV文件
StreamReader sr = new StreamReader(@"data.csv");
string line;
while ((line = sr.ReadLine()) != null)
{string[] values = line.Split(',');// 处理每一行的数据
}//写入CSV文件
StreamWriter sw = new StreamWriter(@"data.csv", true, Encoding.Default);
StringBuilder sb = new StringBuilder();
sb.Append("aa").Append(",").Append("bb").Append(",").Append("cc");
sw.WriteLine(sb);
sw.Close();

实践练习:实现登录注册功能

注册功能

注册功能需要创建一个新的文本文件,文件名以用户名命名,并在文件中存储用户的密码信息。

//注册功能
private void registerButton_Click(object sender, EventArgs e)
{string username = this.textBoxUsername.Text;string password = this.textBoxPassword.Text;string filePath = Path.Combine(UsersDirectory, username + ".txt");File.WriteAllText(filePath, password);
}

登录功能

登录功能需要验证用户输入的用户名和密码是否与存储的文件中的信息匹配。

//登录功能
private void loginButton_Click(object sender, EventArgs e)
{string username = this.textBoxUsername.Text;string password = this.textBoxPassword.Text;string filePath = Path.Combine(UsersDirectory, username + ".txt");if (File.Exists(filePath) && File.ReadAllText(filePath) == password){// 登录成功}else{// 登录失败}
}

在实现这些功能时,需要注意安全性问题,避免明文存储密码等敏感信息。可以通过加密等手段来增强安全性。

在这里插入图片描述

总结

以上是WinForms中文件操作和CSV处理的基础内容。掌握这些文件操作的使用方法对于WinForms开发者来说是非常重要的。

如果觉得文章还不错,可以点赞、收藏和转发,以支持作者继续创作更多教程。 另外本专栏将会持续更新,作者专栏中有已经更新完毕的C#基础教程!!!

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

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

相关文章

Python基于Django的微博热搜、微博舆论可视化系统

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

Redis限流插件

Redis限流插件: 1:搭建层级结构 同时对 redis.log 授权 chmod 777 redis.log2:确认 redis 版本 3:下载redis配置文件 redis.conf https://redis.io/docs/management/config/ 4:上传/redis/conf作为原始 redis.conf 5:在/redis_6390/conf下编辑redis.conf docker run -it \ --…

51单片机上面的IIC协议

1、什么是IIC协议 2、模拟IIC协议 51单片机上面是没有与IIC协议相关的寄存器的&#xff08;没有相关的硬件&#xff09;&#xff0c;不像串口可以配置对应的寄存器达到目的&#xff08;比如修改波特率9600 or 115200&#xff09;&#xff0c;要配置IIC只能够根据用户手册里面的…

​面试经典150题——LRU 缓存

​ 1. 题目描述 2. 题目分析与解析 首先讲解一下LRU LRU 是“Least Recently Used”的缩写&#xff0c;LRU 算法的基本思想是跟踪最近最少使用的数据&#xff0c;并在缓存已满且需要存储新数据时优先驱逐该数据。 LRU 算法通常的工作原理的简化解释&#xff1a; 当访问或使…

vue.config.js跨域问题解决

讲解视频 问题背景 目标地址&#xff1a; 而当前项目启动是http&#xff0c;协议名不同&#xff0c;所以跨域了 解决步骤和解答 1. 新建vue.config.js文件 2. 添加如下代码&#xff1a; 一般目标路径target写 域名 就可以了 但其实&#xff0c;写路径也可以&#xff0c;…

查看 Linux 接入的 USB 设备速率是 USB2 还是 USB3

查看接入 usb 设备的速率 使用以下命令查看接入的 USB 设备速率&#xff08;每一行最后的 xxM 字样&#xff09;。插入设备前查看一次&#xff0c;插入设备后查看一次&#xff0c;对比即可定位到刚插入的设备是哪一条。 lsusb -t命令输出如下图 对照 USB 速率表 对照 USB 速…

EasyRecovery数据恢复软件2024试用版下载安装包

EasyRecovery支持的文件格式非常广泛&#xff0c;几乎涵盖了用户日常所需的所有文件类型。具体来说&#xff0c;它支持恢复的办公文档类型包括Microsoft Word、Excel、PPT、MS office、Adobe PDF、Access等。此外&#xff0c;对于音频文件&#xff0c;EasyRecovery同样支持丰富…

初识three.js创建第一个threejs3D页面

说到3D&#xff0c;想必大家都能想到three.js&#xff0c;它是由WebGL封装出来的&#xff0c;接下来&#xff0c;我手把手教大家创建一个简单的3D页面 话尽在代码中&#xff0c;哈哈 大家可以复制代码玩一下 <!DOCTYPE html> <html lang"en"><head&…

【嵌入式 - 输出驱动电路Open Drain (开漏)和Push-Pull (推挽)】

定义 Open drain 和 push-pull 是两种常见的输出驱动电路。它们在数字电子电路中用于控制信号的输出。让我逐一解释它们&#xff1a; 1. Open Drain (开漏): Open drain 输出端通常连接到地 (GND) 或者一个高电阻 (pull-up) 上。当输出信号为逻辑高电平时&#xff0c;输出端…

【位运算】Leetcode 丢失的数字

题目解析 268. 丢失的数字 本题的意思就是数组的长度为n&#xff0c;在[0,n]区间中寻找缺失的一个数字 算法讲解 直观思路&#xff1a;排序 Hash&#xff0c;顺序查找缺失的数字 优化&#xff1a;使用异或&#xff0c;首先将[0,n]之间所有数字异或在一起&#xff0c;然后将…

链表创建的陷阱与细节

链表是线性表的一种&#xff0c;它在逻辑结构上是连续的&#xff0c;在物理结构上是非连续的。 也就是说链表在物理空间上是独立的&#xff0c;可能是东一块西一块的。如下顺序表和链表在内存空间上的对比&#xff1a; 而链表的每一块空间是如何产生联系实现在逻辑结构上是连续…

移动应用安全合规动态:网信办、金管局发文强调数据安全;3月个人信息违规抽查结果出炉!(第五期)

一、监管部门动向&#xff1a;国家互联网信息办公室公布《促进和规范数据跨境流动规定》; 工信部发布《关于网络安全保险典型服务方案目录的公示》 二、安全新闻&#xff1a;恶意软件警报&#xff01;黑客利用软件即服务攻击印度安卓用户&#xff1b;Cerberus银行恶意软件的虚…

第十四届蓝桥杯题解:平方差 ,更小的数,买瓜,网络稳定性(货车运输)

目录 平方差 更小的数 买瓜 网络稳定性&#xff08;货车运输&#xff09; 货车运输 平方差 这道题就是数论的题&#xff0c;不难想到一个数m可以拆成(a-b)(ab)&#xff0c;其实(a-b)和(ab)就是m的一对因子&#xff0c;不妨设为x和y。 则有&#xff1a; abx; a-by; x*ym; 联…

JVM—jps、jstat、jinfo、jmap、jstack的使用

JVM—jps、jstat、jinfo、jmap、jstack的使用 jps jps全称&#xff1a;Java Virtual Machine Process Status Tool 可以查看Java进程&#xff0c;相当于Linux下的ps命令&#xff0c;只不过它只列出Java进程。 jps:列出Jav程序ID和Main函数名称 jps -q:只输出进程ID jps -m …

MATLAB4:数值计算

文章目录 一、实验目的二、实验内容三、仿真结果四、实践中遇到的问题及解决方法 一、实验目的 1. 熟悉根据已知数据进行回归法曲线拟合。   2. 熟悉根据已知数据进行多项式曲线拟合。   3. 熟悉根据已知数据利用指定方法进行数据插值&#xff08;临近插值、线性插值、立方…

小程序视频如何下载到电脑上

小程序视频如何下载到电脑上&#xff0c;很简单 1.利用Fiddler和Charles这些专业的抓包工具 2.利用录屏 3.利用专门抓取资源的工具(集成了抓取下载&#xff0c;而且对资源下载很友好) 工具我已经打包好了 下载高手链接&#xff1a;https://pan.baidu.com/s/1qJ81sNBzzzU0w…

Linux的学习之路:6、Linux编译器-gcc/g++使用

摘要 本文主要是说一些gcc的使用&#xff0c;g和gcc使用一样就没有特殊讲述。 目录 摘要 一、背景知识 二、gcc如何完成 1、预处理(进行宏替换) 2、编译&#xff08;生成汇编&#xff09; 3、汇编&#xff08;生成机器可识别代码 4、链接&#xff08;生成可执行文件或…

【我的代码生成器】生成React页面类

有了数据表的结构信息&#xff0c;就能生成React 的页面类&#xff0c;快捷方便。 生成界面如下&#xff1a; 生成的React FrmUser.js页面如下&#xff1a; 只需再写里面的操作逻辑代码。

银河麒麟之PaddleOCR模型部署

一、PaddleOCR简介 PaddleOCR是一个基于飞桨框架开发的开源OCR工具&#xff0c;提供了一系列强大的文本识别功能。PaddleOCR支持多种文本识别任务&#xff0c;包括文字检测、文字识别、文本方向检测等。它具有高效、准确的特点&#xff0c;适用于多种场景下的文本识别需求&…

IDP之Backstage - 环境搭建

0. 目录 1. 前言2. 环境准备&#xff08;Windows10下&#xff09;2.1 安装nvm2.2 git和docker安装 3. 创建模板项目3.1 典型错误: fails on the yarn install step3.2 再次启动3.3 验证 4. 相关 1. 前言 本不想写这篇&#xff0c;因为看着官网文档写着挺简单的&#xff0c;但实…