C#读取文件夹和文件列表:全面指南

C#读取文件夹和文件列表:全面指南

在 C# 开发中,经常需要获取文件夹中的文件列表或子文件夹结构,例如文件管理器、批量处理工具、备份程序等场景。本文将详细介绍 C# 中读取文件夹和文件列表的各种方法,包括基础操作、递归遍历、过滤搜索、高级属性获取等,帮助开发者根据实际需求选择最合适的实现方式。

一、基础方法:使用 Directory 类的静态方法

System.IO.Directory类提供了一系列静态方法,可快速获取文件夹和文件列表,适合简单场景使用。

1. 获取指定目录下的所有文件

using System;
using System.IO;class Program
{static void Main(){string path = @"C:MyFolder";try{// 获取指定目录下的所有文件(仅当前目录)string[] files = Directory.GetFiles(path);Console.WriteLine($"目录 {path} 中的文件:");foreach (string file in files){Console.WriteLine(file);}// 获取指定目录下的特定类型文件string[] txtFiles = Directory.GetFiles(path, "*.txt");Console.WriteLine($"n目录 {path} 中的txt文件:");foreach (string file in txtFiles){Console.WriteLine(file);}// 获取指定目录及子目录中的所有文件string[] allFiles = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories);Console.WriteLine($"n目录 {path} 及其子目录中的所有文件:");foreach (string file in allFiles){Console.WriteLine(file);}}catch (DirectoryNotFoundException){Console.WriteLine("指定的目录不存在");}catch (UnauthorizedAccessException){Console.WriteLine("没有访问该目录的权限");}catch (PathTooLongException){Console.WriteLine("路径过长");}catch (Exception ex){Console.WriteLine($"发生错误: {ex.Message}");}}
}

2. 获取指定目录下的所有子文件夹

// 获取指定目录下的所有子文件夹(仅当前目录)
string[] directories = Directory.GetDirectories(path);Console.WriteLine($"目录 {path} 中的子文件夹:");
foreach (string dir in directories)
{Console.WriteLine(dir);
}// 获取指定目录及所有子目录中的子文件夹
string[] allDirectories = Directory.GetDirectories(path, "*", SearchOption.AllDirectories);
Console.WriteLine($"n目录 {path} 及其子目录中的所有文件夹:");foreach (string dir in allDirectories)
{Console.WriteLine(dir);
}

Directory 类方法特点

  • 提供静态方法,无需创建实例,调用简单
  • GetFiles()GetDirectories()方法一次性返回所有结果
  • 第三个参数SearchOption指定搜索范围:
    • SearchOption.TopDirectoryOnly:仅当前目录(默认)
    • SearchOption.AllDirectories:当前目录及所有子目录

二、面向对象方法:使用 DirectoryInfo 类

DirectoryInfo类提供了面向对象的方式来操作目录,适合需要多次使用目录信息的场景,避免重复解析路径。

1. 基本使用方法

using System;
using System.IO;class Program
{static void Main(){string path = @"C:MyFolder";DirectoryInfo dirInfo = new DirectoryInfo(path);try{// 检查目录是否存在if (!dirInfo.Exists){Console.WriteLine("目录不存在");return;}// 获取当前目录下的所有文件FileInfo[] files = dirInfo.GetFiles();Console.WriteLine($"目录 {path} 中的文件:");foreach (FileInfo file in files){Console.WriteLine($"{file.Name} (大小: {file.Length} 字节)");}// 获取当前目录下的所有子文件夹DirectoryInfo[] subDirs = dirInfo.GetDirectories();Console.WriteLine($"n目录 {path} 中的子文件夹:");foreach (DirectoryInfo subDir in subDirs){Console.WriteLine($"{subDir.Name} (创建时间: {subDir.CreationTime})");}// 获取特定类型文件(包括子目录)FileInfo[] txtFiles = dirInfo.GetFiles("*.txt", SearchOption.AllDirectories);Console.WriteLine($"n目录 {path} 及其子目录中的txt文件:");foreach (FileInfo file in txtFiles){Console.WriteLine($"{file.FullName} (修改时间: {file.LastWriteTime})");}}catch (UnauthorizedAccessException){Console.WriteLine("没有访问该目录的权限");}catch (Exception ex){Console.WriteLine($"发生错误: {ex.Message}");}}
}

DirectoryInfo 与 Directory 的区别

  • Directory是静态类,DirectoryInfo是实例类
  • DirectoryInfo的方法返回FileInfoDirectoryInfo对象,包含更多文件 / 目录属性
  • 对于多次操作同一目录,DirectoryInfo性能更好(只需解析一次路径)
  • DirectoryInfo提供更多实例属性:NameFullNameCreationTimeLastAccessTime

三、枚举方法:延迟加载提高性能

.NET 4.0 及以上版本提供了EnumerateFiles()EnumerateDirectories()方法,采用延迟加载(Lazy Loading)方式返回结果,适合处理包含大量文件的目录。

using System;
using System.IO;class Program
{static void Main(){string path = @"C:MyFolder";try{// 枚举方式获取文件(延迟加载)Console.WriteLine($"枚举目录 {path} 中的所有文件:");int fileCount = 0;foreach (string file in Directory.EnumerateFiles(path, "*.*", SearchOption.AllDirectories)){Console.WriteLine(file);fileCount++;// 演示:仅显示前10个文件if (fileCount >= 10){Console.WriteLine("... 更多文件 ...");break;}}// 使用DirectoryInfo的枚举方法DirectoryInfo dirInfo = new DirectoryInfo(path);Console.WriteLine($"n枚举目录 {path} 中的所有子文件夹:");int dirCount = 0;foreach (DirectoryInfo dir in dirInfo.EnumerateDirectories("*", SearchOption.AllDirectories)){Console.WriteLine(dir.FullName);dirCount++;// 演示:仅显示前5个子文件夹if (dirCount >= 5){Console.WriteLine("... 更多文件夹 ...");break;}}}catch (Exception ex){Console.WriteLine($"发生错误: {ex.Message}");}}
}

枚举方法的优势

  • 无需一次性加载所有结果到内存,适合处理大量文件
  • 可以在遍历过程中提前终止(如示例中的 break)
  • 内存占用低,性能更好
  • 支持流式处理,适合大型目录

四、递归获取所有文件和文件夹

在某些场景下,需要自定义递归逻辑来获取文件和文件夹列表,特别是需要在遍历过程中添加自定义过滤条件时。

1. 递归获取所有文件

using System;
using System.IO;
using System.Collections.Generic;class FileLister
{// 递归获取所有文件static List<string> GetAllFiles(string path){List<string> files = new List<string>();try{// 添加当前目录的文件files.AddRange(Directory.GetFiles(path));// 递归处理子目录string[] subDirs = Directory.GetDirectories(path);foreach (string dir in subDirs){files.AddRange(GetAllFiles(dir));}}catch (UnauthorizedAccessException){Console.WriteLine($"无法访问目录: {path},已跳过");}catch (PathTooLongException){Console.WriteLine($"路径过长: {path},已跳过");}catch (IOException ex){Console.WriteLine($"IO错误: {path} - {ex.Message},已跳过");}return files;}static void Main(){string rootPath = @"C:MyFolder";Console.WriteLine($"开始递归获取 {rootPath} 下的所有文件...");List<string> allFiles = GetAllFiles(rootPath);Console.WriteLine($"n共找到 {allFiles.Count} 个文件:");foreach (string file in allFiles){Console.WriteLine(file);}}
}

2. 递归获取目录结构(树形展示)

using System;
using System.IO;class DirectoryTree
{// 递归显示目录结构static void ShowDirectoryTree(string path, string indent = ""){try{// 获取当前目录的子目录string[] subDirs = Directory.GetDirectories(path);foreach (string dir in subDirs){// 获取目录名称string dirName = Path.GetFileName(dir);// 显示目录Console.WriteLine($"{indent}├─ {dirName}");// 递归显示子目录,增加缩进ShowDirectoryTree(dir, indent + "│  ");}// 显示当前目录的文件string[] files = Directory.GetFiles(path);for (int i = 0; i < files.Length; i++){string fileName = Path.GetFileName(files[i]);// 最后一个文件使用不同的连接线string line = (i == files.Length - 1 && subDirs.Length == 0)? $"{indent}└─ {fileName}": $"{indent}├─ {fileName}";Console.WriteLine(line);}}catch (UnauthorizedAccessException){Console.WriteLine($"{indent}├─ 无法访问的目录(权限不足)");}catch (Exception ex){Console.WriteLine($"{indent}├─ 错误: {ex.Message}");}}static void Main(){string rootPath = @"C:MyFolder";Console.WriteLine($"目录结构: {rootPath}");ShowDirectoryTree(rootPath);}
}

自定义递归的优势

  • 可以在递归过程中添加复杂的过滤逻辑
  • 可以实现特殊的错误处理策略(如跳过无权限的目录)
  • 可以构建自定义的数据结构保存文件信息
  • 可以实现进度报告或中断机制

五、过滤与搜索技巧

实际开发中,经常需要根据特定条件过滤文件或文件夹,以下是一些常用的过滤方法。

1. 使用搜索模式

// 搜索模式示例
string path = @"C:MyFolder";// 所有文本文件
var txtFiles = Directory.GetFiles(path, "*.txt");// 所有图片文件(多种扩展名)
var imageFiles1 = Directory.GetFiles(path, "*.jpg").Concat(Directory.GetFiles(path, "*.jpeg")).Concat(Directory.GetFiles(path, "*.png")).Concat(Directory.GetFiles(path, "*.gif"));// 名称以"report"开头的Excel文件
var reportFiles = Directory.GetFiles(path, "report*.xlsx", SearchOption.AllDirectories);

2. 使用 LINQ 过滤文件

using System;
using System.IO;
using System.Linq;class FileFilter
{static void Main(){string path = @"C:MyFolder";// 使用LINQ过滤文件var largeFiles = new DirectoryInfo(path).GetFiles("*.*", SearchOption.AllDirectories).Where(f => f.Length > 1024 * 1024) // 大于1MB的文件.Where(f => f.LastWriteTime > DateTime.Now.AddDays(-30)) // 30天内修改过.OrderByDescending(f => f.Length) // 按大小降序排列.Take(10); // 取前10个Console.WriteLine("10个最大的30天内修改过的文件:");foreach (var file in largeFiles){Console.WriteLine($"{file.FullName} - {file.Length / 1024} KB - {file.LastWriteTime}");}// 过滤特定属性的文件夹var recentDirs = new DirectoryInfo(path).GetDirectories().Where(d => d.CreationTime > DateTime.Now.AddMonths(-1)) // 1个月内创建的.OrderBy(d => d.Name); // 按名称排序Console.WriteLine("n1个月内创建的文件夹:");foreach (var dir in recentDirs){Console.WriteLine($"{dir.Name} - 创建于: {dir.CreationTime}");}}
}

3. 高级过滤:自定义方法

using System;
using System.IO;
using System.Linq;class AdvancedFilter
{// 自定义过滤方法:检查文件是否是C#源代码且包含特定字符串static bool IsCsFileWithKeyword(FileInfo file, string keyword){if (file.Extension != ".cs")return false;try{string content = File.ReadAllText(file.FullName);return content.Contains(keyword);}catch{return false;}}static void Main(){string path = @"C:MyProject";string searchKeyword = "async";var resultFiles = new DirectoryInfo(path).EnumerateFiles("*.*", SearchOption.AllDirectories).Where(f => IsCsFileWithKeyword(f, searchKeyword));Console.WriteLine($"包含 '{searchKeyword}' 的C#文件:");foreach (var file in resultFiles){Console.WriteLine(file.FullName);}}
}

六、获取文件和文件夹的详细属性

除了路径和名称外,有时还需要获取文件和文件夹的详细属性,如大小、创建时间、属性等。

using System;
using System.IO;
using System.Linq;class FileProperties
{static void Main(){string path = @"C:MyFolder";if (!Directory.Exists(path)){Console.WriteLine("目录不存在");return;}// 获取文件夹属性DirectoryInfo dirInfo = new DirectoryInfo(path);Console.WriteLine("文件夹属性:");Console.WriteLine($"完整路径: {dirInfo.FullName}");Console.WriteLine($"名称: {dirInfo.Name}");Console.WriteLine($"父目录: {dirInfo.Parent?.FullName}");Console.WriteLine($"创建时间: {dirInfo.CreationTime}");Console.WriteLine($"最后访问时间: {dirInfo.LastAccessTime}");Console.WriteLine($"属性: {dirInfo.Attributes}");// 获取文件详细属性FileInfo[] files = dirInfo.GetFiles().OrderByDescending(f => f.Length).Take(5).ToArray();Console.WriteLine("n前5个最大的文件属性:");foreach (FileInfo file in files){Console.WriteLine($"n文件: {file.Name}");Console.WriteLine($"完整路径: {file.FullName}");Console.WriteLine($"大小: {file.Length} 字节");Console.WriteLine($"创建时间: {file.CreationTime}");Console.WriteLine($"最后修改时间: {file.LastWriteTime}");Console.WriteLine($"最后访问时间: {file.LastAccessTime}");Console.WriteLine($"属性: {file.Attributes}");Console.WriteLine($"扩展名: {file.Extension}");Console.WriteLine($"是否只读: {file.IsReadOnly}");}}
}

常用文件属性说明

  • Attributes:文件属性组合(ReadOnly、Hidden、System、Directory 等)
  • Length:文件大小(字节)
  • CreationTime:创建时间
  • LastWriteTime:最后修改时间
  • LastAccessTime:最后访问时间
  • IsReadOnly:是否只读

七、异步获取文件列表

在 UI 应用程序或需要非阻塞操作的场景中,异步获取文件列表可以避免界面卡顿。

using System;
using System.IO;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Linq;class AsyncFileLister
{// 异步获取所有文件static async Task<List<FileInfo>> GetAllFilesAsync(string path){List<FileInfo> files = new List<FileInfo>();DirectoryInfo dirInfo = new DirectoryInfo(path);if (!dirInfo.Exists)return files;// 异步获取当前目录文件FileInfo[] currentFiles = dirInfo.GetFiles();files.AddRange(currentFiles);// 获取子目录并异步处理DirectoryInfo[] subDirs = dirInfo.GetDirectories();foreach (DirectoryInfo subDir in subDirs){// 递归调用并等待结果List<FileInfo> subDirFiles = await GetAllFilesAsync(subDir.FullName);files.AddRange(subDirFiles);}return await Task.FromResult(files);}static async Task Main(){string path = @"C:MyFolder";Console.WriteLine("开始异步获取文件列表...");// 记录开始时间DateTime startTime = DateTime.Now;// 异步获取文件列表List<FileInfo> allFiles = await GetAllFilesAsync(path);// 计算耗时TimeSpan elapsed = DateTime.Now - startTime;Console.WriteLine($"异步获取完成,耗时 {elapsed.TotalSeconds} 秒");Console.WriteLine($"共找到 {allFiles.Count} 个文件");// 显示最大的5个文件var largestFiles = allFiles.OrderByDescending(f => f.Length).Take(5);Console.WriteLine("n最大的5个文件:");foreach (var file in largestFiles){Console.WriteLine($"{file.FullName} - {file.Length / 1024 / 1024} MB");}}
}

八、处理特殊目录

C# 可以访问各种特殊目录,如系统目录、用户目录、临时目录等,这些目录的获取方式略有不同。

using System;
using System.IO;
using System.Environment;class SpecialDirectories
{static void Main(){// 获取系统特殊目录Dictionary<string, string> specialDirs = new Dictionary<string, string>{{ "系统目录", Environment.SystemDirectory },{ "临时目录", Path.GetTempPath() },{ "用户目录", Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) },{ "文档目录", Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) },{ "桌面目录", Environment.GetFolderPath(Environment.SpecialFolder.Desktop) },{ "程序文件", Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) },{ "应用数据", Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) }};// 显示特殊目录并列出其中的文件foreach (var dir in specialDirs){Console.WriteLine($"n{dir.Key}: {dir.Value}");if (Directory.Exists(dir.Value)){try{string[] files = Directory.GetFiles(dir.Value, "*.*", SearchOption.TopDirectoryOnly);Console.WriteLine($"包含 {files.Length} 个文件");// 显示前5个文件for (int i = 0; i < Math.Min(5, files.Length); i++){Console.WriteLine($"  {Path.GetFileName(files[i])}");}if (files.Length > 5){Console.WriteLine("  ... 更多文件 ...");}}catch (Exception ex){Console.WriteLine($"  无法访问: {ex.Message}");}}else{Console.WriteLine("  目录不存在");}}}
}

九、注意事项与最佳实践

1. 异常处理

文件系统操作可能会遇到各种异常,必须进行适当的处理:

// 完善的异常处理示例
try
{string[] files = Directory.GetFiles("C:/UnknownFolder");
}
catch (DirectoryNotFoundException)
{// 目录不存在
}
catch (UnauthorizedAccessException)
{// 权限不足
}
catch (PathTooLongException)
{// 路径过长(超过260字符)
}
catch (IOException)
{// IO错误(如设备未就绪)
}
catch (Security.SecurityException)
{// 安全权限不足
}
catch (ArgumentException)
{// 路径参数无效
}

2. 性能优化

  • 处理大量文件时,优先使用EnumerateFiles()而非GetFiles()
  • 避免在循环中重复创建DirectoryInfoFileInfo实例
  • 如需多次使用文件信息,使用FileInfoDirectoryInfo缓存信息
  • 递归遍历大型目录时,考虑使用并行处理(Parallel.ForEach)
// 并行处理提高性能
string rootPath = @"C:LargeFolder";
var dirInfo = new DirectoryInfo(rootPath);
Parallel.ForEach(dirInfo.EnumerateDirectories(), subDir =>
{try{var files = subDir.EnumerateFiles("*.log");Console.WriteLine($"在 {subDir.Name} 中找到 {files.Count()} 个日志文件");}catch (Exception ex){Console.WriteLine($"处理 {subDir.Name} 时出错: {ex.Message}");}
});

3. 跨平台注意事项

.NET Core/.NET 5 + 的跨平台环境中,需要注意:

  • 路径分隔符:使用Path.DirectorySeparatorChar而非硬编码 ‘’ 或 ‘/’
  • 路径长度:Linux/macOS 对路径长度限制较宽松
  • 大小写敏感性:Linux/macOS 文件系统区分大小写
  • 特殊目录:不同操作系统的特殊目录位置不同
// 跨平台路径处理
string crossPlatformPath = Path.Combine("data", "logs", "app.log");
Console.WriteLine($"跨平台路径: {crossPlatformPath}");
Console.WriteLine($"目录分隔符: {Path.DirectorySeparatorChar}");

十、总结

C# 提供了多种方式来读取文件夹和文件列表,选择合适的方法取决于具体需求:

方法特点适用场景
Directory静态方法简单直接,无需创建实例简单操作,一次性使用
DirectoryInfo实例方法面向对象,可缓存信息多次操作同一目录,需要详细属性
枚举方法(Enumerate*延迟加载,内存占用低大量文件,流式处理
自定义递归高度可控,可添加自定义逻辑复杂过滤,特殊遍历需求
异步方法非阻塞,不冻结 UI桌面应用,需要响应性

无论使用哪种方法,都应注意异常处理、性能优化和跨平台兼容性。掌握这些技术可以帮助开发者高效地实现文件管理功能,处理各种复杂的文件系统场景。

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

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

相关文章

从小白到进阶:解锁linux与c语言高级编程知识点嵌入式开发的任督二脉(1)

【硬核揭秘】Linux与C高级编程&#xff1a;从入门到精通&#xff0c;你的全栈之路&#xff01;第一部分&#xff1a;初识Linux与环境搭建&#xff0c;玩转软件包管理——嵌入式开发的第一道“坎”嘿&#xff0c;各位C语言的“卷王”们&#xff01;你可能已经习惯了在Windows或m…

.net开源库SignalR

.NET开源库SignalR&#xff1a;打造实时Web应用的利器 在当今的Web开发领域&#xff0c;实时性已经成为了许多应用的核心需求。无论是实时聊天、实时数据监控还是实时游戏&#xff0c;都需要服务器能够及时地将数据推送给客户端。而.NET开源库SignalR&#xff0c;正是满足这一…

SQL Server不同场景批量插入数据的方式详解

INSERT INTO...VALUES多行语法 该方法适用于单次插入少量数据(通常<1000行),语法简洁直观。示例: INSERT INTO Employees (EmployeeID, Name, Department) VALUES (101, Zhang San, IT),(102, Li Si, HR),(103, Wang Wu, Finance)优点:语法简单易理解,适合开发测试环…

Day08-Flask 或 Django 简介:构建 Web 应用程序

Flask 或 Django 简介&#xff1a;构建 Web 应用程序 网络开发领域提供了丰富的工具和框架&#xff0c;而 Python 作为一门多功能的语言&#xff0c;在构建健壮且可扩展的 Web 应用方面脱颖而出。本课程将作为你使用 Python 进行 Web 开发的入门指南&#xff0c;特别聚焦于两个…

k8s多集群管理中的联邦和舰队如何理解?

在 Kubernetes 多集群管理中&#xff0c;联邦&#xff08;Federation&#xff09;和舰队&#xff08;Fleet&#xff09;是两种不同的方法&#xff0c;用于管理和协调多个 Kubernetes 集群。下面是对这两种方法的详细解释&#xff1a; 联邦&#xff08;Federation&#xff09; K…

Docker部署MySQL镜像

1.拉取镜像 # 拉取指定版本的MySQL镜像 docker pull mysql:8.02.创建挂载目录 # 自己创建好如下三个文件夹 路径任意 [rootiZuf6aigs7rxe6f6oifq7vZ mysql]# ll 总用量 12 drwxr-xr-x 2 root root 4096 7月 7 10:25 config drwxr-xr-x 2 root root 4096 6月 26 16:43 data d…

【网络】Linux 内核优化实战 - net.ipv4.ip_local_reserved_ports

目录一、参数作用二、默认值与格式三、典型应用场景四、配置方法五、注意事项六、查看当前配置在Linux系统的TCP/IP网络配置中&#xff0c;net.ipv4.ip_local_reserved_ports 是一个关键内核参数&#xff0c;用于指定禁止系统自动分配的本地端口范围。这些端口会被“预留”出来…

期待在 VR 森林体验模拟中实现与森林的 “虚拟复现”​

VR 森林体验模拟&#xff0c;无疑是科技与自然领域一次极具开创性意义的奇妙碰撞。它借助前沿的虚拟现实技术&#xff0c;以别出心裁、独树一帜的方式&#xff0c;为我们精心打造并带来了一场前所未有的森林探索奇幻之旅 。​在教育领域&#xff0c;于中小学的自然科学课堂上&a…

Qt:QLabel、LCD Number、QProgressBar、QCalendarWidget

目录 一、QLabel 1.属性 2.设置文本格式 3.设置图片 4.设置文本对齐方式 5.设置自动换行 6.设置缩进 7.设置边距 8.设置伙伴关系 二、LCD Number 1.属性 2.Qt仅允许主线程修改界面 三、QProgressBar 属性 四、QCalendarWidget 属性 一、QLabel 同样的&#x…

打造可靠的云基础架构:Azure 区域与可用性区域

随着企业业务的全球化扩展和数字化转型&#xff0c;可靠性已成为企业在选择云平台时的重要考量因素。Azure 作为全球领先的云计算服务提供商&#xff0c;通过区域&#xff08;Regions&#xff09;和可用性区域&#xff08;Availability Zones&#xff09;为企业构建高可用性、高…

订单初版—1.分布式订单系统的简要设计文档

大纲1.订单系统核心业务流程2.Spring Cloud Alibaba在订单业务中的落地方案3.面向分布式全链路故障设计的高可靠架构方案4.分布式订单系统的技术栈与代码规范1.订单系统核心业务流程(1)生成订单时序图(2)支付订单流程图(3)取消订单流程图这里主要介绍生单和退款两个核心链路&am…

【HarmonyOS】富文本编辑器RichEditor详解

【HarmonyOS】富文本编辑器RichEditor详解 一、前言 在信息化高速发展的今天&#xff0c;普通的文本容器&#xff0c;已经不能够承载用户丰富的表达欲。富文本展示已经是移动开发中&#xff0c;必备要解决的问题&#xff0c;在鸿蒙中&#xff0c;通过在系统层提供RichEditor控件…

【MySQL进阶】在一台机器上运行多个MySQL实例

目录 1.使用MySQL Installer安装MySQL实例 1.1.去官网下载MySQL Installer 1.2.停止mysql服务 1.3.为不同的版本指定不同的安装目录 2.配置不同版本的选项文件 2.1.修改数据目录 2.2.修改基本目录 2.3.修改端口号 2.4.设置⽇志⽬录 2.5.配置临时目录 2.6.修改绑定地…

verilog中timescale指令的使用

1.timescale指令格式timescale <时间单位> / <时间精度>时间单位&#xff1a;它确定了仿真中时间值的基本单位。比如 1ns 就意味着时间值是以纳秒为单位来计量的。 时间精度&#xff1a;该参数决定了时间值能够表示的最小分辨率。例如 1ps 表示时间可以精确到皮秒级…

08_Excel 导入 - 用户信息批量导入

08_Excel 导入 - 用户信息批量导入 1. VO 类 java复制编辑Data AllArgsConstructor NoArgsConstructor public class UserInfoBatch4ExcelReq {ExcelProperty(value "用户姓名")Schema(description "用户姓名")private String userName;ExcelProperty(va…

【深度学习新浪潮】什么是世界模型?

世界模型(World Model)是人工智能领域中一类通过构建环境的抽象表示来理解和预测外部世界的系统。它通过整合多模态数据(如视觉、语言、传感器信号)形成对环境的动态认知,并支持智能体在复杂场景中进行决策与规划。以下从核心概念、解决的问题、关键研究、技术路线、现状与…

React + Express 传输加密以及不可逆加密

一、传输加密这里用 对称加密模式 ASE实现。React 前端const CryptoJS require("crypto-js");// 示例1&#xff1a;ECB模式&#xff08;无需IV&#xff09; const encryptECB (plainText, key) > {return CryptoJS.AES.encrypt(plainText, key, {mode: CryptoJS…

浏览器(Chrome /Edge)高效使用 - 内部命令/快捷键/启动参数

今天在CSDN上传文件,提交总是提示续传失败,重试了五六次才想到获取是科学上网的问题,这个时候其实只要重启浏览器即可,但如果手动关闭浏览器再次打开,浏览器不会恢复之前的多开窗口(会恢复最后一个窗口内多开的标签页,但不会恢复其他窗口)。想了想记得 Chrome 流行的时…

【PTA数据结构 | C语言版】连续子序列最大和

本专栏持续输出数据结构题目集&#xff0c;欢迎订阅。 文章目录 题目代码 题目 给定 n 个整数组成的序列 { a1 ,a2 ,⋯,an }&#xff0c;“连续子序列”被定义为 { ai ,ai1 ,⋯,aj }&#xff0c;其中 1≤i≤j≤n。“连续子序列最大和”则被定义为所有连续子序列元素的和中最大…

Vrrp配置和原理

Vrrp配置和原理 文章目录Vrrp配置和原理概述物理与逻辑拓扑重点vrid虚拟路由器虚拟IP地址及虚拟MAC地址超时时间计算-MASTER_DOWNvip 管理员手动指定方法Master路由器Backup路由器PriorityVRRP报文格式VRRP状态机从Backup到masterVRRP协议状态二.优先级一样比较接口IPVRRP优先级…