0

0

C#基于内容的文件路由 C#如何根据文件类型或内容将其分发到不同目录

星降

星降

发布时间:2026-02-08 10:06:25

|

571人浏览过

|

来源于php中文网

原创

应通过读取文件头魔数判断类型,而非依赖扩展名;跨卷移动需先复制后删除;并发创建目录须用幂等的Directory.CreateDirectory;XML/JSON路由前需轻量解析预检。

c#基于内容的文件路由 c#如何根据文件类型或内容将其分发到不同目录

怎么用 C# 判断文件类型而不是只看扩展名

Path.GetExtension() 分发文件极不可靠——用户随便改个 .txt 为 .jpg,你的路由就崩了。真实场景里必须检查文件内容(魔数 / signature)。C# 没有内置“识别所有文件类型”的函数,得自己读头几十字节比对。

实操建议:

  • 对常见格式(PDF、PNG、JPEG、ZIP、XML、JSON)建立魔数表,比如 PDF 固定以 %PDF- 开头(注意带百分号),PNG 是 \x89PNG\r\n\x1a\n
  • FileStream 打开文件,Read 前 32 字节足矣,别全读——大文件下性能差还浪费内存
  • 注意编码:二进制比对必须用 byte[],别转成字符串再比较,UTF-8 解码可能破坏原始字节
  • 遇到无签名的纯文本(.csv、.log、.conf),可 fallback 到 Path.GetExtension() + 白名单校验,但要加日志告警

File.Move() 在跨卷时失败怎么办

直接调用 File.Move() 分发文件,如果目标目录在另一磁盘(比如 D:\routes\pdf 和 E:\inbox),会抛 IOException:“The source and destination path must have the same root.”

这不是 bug,是 Windows API 限制:MoveFileEx 要求同卷。绕过方法只有“复制 + 删除”,但得手动处理原子性与异常回滚。

实操建议:

  • 先用 Path.GetPathRoot(source)Path.GetPathRoot(destination) 判断是否同卷
  • 不同卷时,用 File.Copy(source, dest, true) + File.Delete(source),但必须包裹在 try/catch 中;若 Delete 失败,要记录残留文件路径供人工清理
  • 别用 File.Replace()——它只适用于同卷且需保留旧版本备份,和路由无关
  • 考虑加个重试逻辑(最多 2 次),网络映射盘偶尔因瞬时断连失败

并发处理多个文件时如何避免目录冲突

多线程或 Task 并行处理一批文件时,Directory.CreateDirectory() 可能被多次调用,导致 IOException:“Cannot create a file when that file already exists.”

这不是竞态条件,而是 CreateDirectory 自身不保证幂等——它只在目录不存在时创建,存在则抛异常(.NET 5+ 已修复为静默忽略,但旧版仍需兼容)。

快剪辑
快剪辑

国内⼀体化视频⽣产平台

下载

实操建议:

  • 统一用 Directory.CreateDirectory(targetDir) —— 它返回 DirectoryInfo,且从 .NET Core 3.0 起已保证幂等(旧框架如 .NET Framework 4.7.2 需自行 try/catch Directory.Exists
  • 不要自己写 if (!Directory.Exists()) Directory.Create(),竞态窗口依然存在
  • 目标路径含动态部分(如按日期分目录 ./pdf/2024-06-15/)时,确保父目录(./pdf/)提前建好,减少并发点
  • 日志中记录实际创建成功的目录,方便排查“为什么某天目录没生成”

怎么安全地把 XML 或 JSON 文件路由到结构化处理管道

单纯按扩展名分发 .xml 或 .json 文件很危险:文件可能是空的、编码错误、或根本不是合法格式(比如 XML 文件开头缺 ,JSON 含 BOM 或注释)。直接扔给 XDocument.Load()JsonSerializer.Deserialize() 会崩溃。

路由层不该承担解析责任,但必须做轻量级预检,否则错误会漏到下游,难以定位源头。

实操建议:

  • XML:读前 256 字节,用 XmlReader.Create(stream, new XmlReaderSettings { DtdProcessing = DtdProcessing.Ignore }) 尝试 Read() 一次,捕获 XmlException 即判定无效
  • JSON:用 JsonDocument.Parse(jsonBytes, new JsonDocumentOptions { AllowTrailingCommas = true, CommentHandling = JsonCommentHandling.Skip }),不依赖第三方库也能快速验证
  • 预检失败的文件,统一移到 ./quarantine/invalid/ 并附带错误信息文件(如 report.txt 写明“JSON parse failed at offset 1024”)
  • 别在路由逻辑里做字段级校验(比如“必须含 invoiceId 字段”)——那是业务处理器的事,路由只管“是不是能打开”

魔数判断和跨卷移动是硬门槛,很多人卡在这两步就退回用扩展名硬分。其实只要守住“先读头、再判断卷、最后建目录”这个顺序,95% 的文件路由场景都能稳住。剩下那 5%,通常是加密文件或自定义二进制格式——得和上游约好签名规则,不能靠猜。

相关文章

路由优化大师
路由优化大师

路由优化大师是一款及简单的路由器设置管理软件,其主要功能是一键设置优化路由、屏广告、防蹭网、路由器全面检测及高级设置等,有需要的小伙伴快来保存下载体验吧!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

431

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

542

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

314

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

79

2025.09.10

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

798

2023.08.22

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1918

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2099

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1104

2024.11.28

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

39

2026.02.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.9万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号