news 2026/2/8 8:06:39

导出数据文件名称异常业务处理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
导出数据文件名称异常业务处理

导出数据文件功能,上线一段时间,发现无法导出文件,调试发现文件名称含有产品名称,但是产品名称有非法字符,导致导出文件失败。直接开发个工具类过滤下即可。

直接上代码:

1. 高性能文件名非法字符清理工具

FileNameSanitizer

/// <summary> /// 高性能文件名非法字符清理工具 /// 支持Windows/Linux/Mac平台的非法字符检测和清理 /// </summary> public static class FileNameSanitizer { // Windows系统非法字符 (不包括路径分隔符,因为这里只处理文件名) private static readonly char[] WindowsInvalidChars = new char[] { '"', '<', '>', '|', '*', '?', ':', '\\', '/' }; // 预编译正则表达式用于高性能匹配 private static readonly Regex InvalidCharRegex = new Regex( @"[""<>|*?:""\\/]", RegexOptions.Compiled | RegexOptions.CultureInvariant ); /// <summary> /// 清理文件名中的非法字符 /// </summary> /// <param name="fileName">原始文件名</param> /// <returns>清理后的文件名</returns> public static string SanitizeFileName(string fileName) { if (string.IsNullOrEmpty(fileName)) return fileName; // 使用StringBuilder提高性能 var sb = new StringBuilder(fileName.Length); foreach (char c in fileName) { // 检查是否为非法字符 if (Array.IndexOf(WindowsInvalidChars, c) == -1) { sb.Append(c); } // 跳过非法字符,不添加到结果中 } string sanitized = sb.ToString(); // 确保文件名不为空(如果所有字符都被移除) if (string.IsNullOrEmpty(sanitized)) sanitized = "_"; // 移除首尾空白字符 sanitized = sanitized.Trim(); // 确保文件名不以 . 结尾(这在某些系统上可能导致问题) if (sanitized.EndsWith(".")) sanitized = sanitized.TrimEnd('.'); return sanitized; } /// <summary> /// 使用正则表达式的快速清理方法 /// </summary> /// <param name="fileName">原始文件名</param> /// <returns>清理后的文件名</returns> public static string SanitizeFileNameRegex(string fileName) { if (string.IsNullOrEmpty(fileName)) return fileName; // 使用预编译的正则表达式替换非法字符 string sanitized = InvalidCharRegex.Replace(fileName, ""); // 确保文件名不为空 if (string.IsNullOrEmpty(sanitized)) sanitized = "_"; // 移除首尾空白字符 sanitized = sanitized.Trim(); // 确保文件名不以 . 结尾 if (sanitized.EndsWith(".")) sanitized = sanitized.TrimEnd('.'); return sanitized; } /// <summary> /// 检查文件名是否包含非法字符 /// </summary> /// <param name="fileName">待检查的文件名</param> /// <returns>是否包含非法字符</returns> public static bool ContainsInvalidChars(string fileName) { if (string.IsNullOrEmpty(fileName)) return false; foreach (char c in fileName) { if (Array.IndexOf(WindowsInvalidChars, c) != -1) return true; } return false; } }

2.数据导出工具类

DataExporter

/// <summary> /// 数据导出工具类 /// 提供高性能的数据导出和文件名清理功能 /// </summary> public class DataExporter { /// <summary> /// 导出数据到文件,并自动清理文件名中的非法字符 /// </summary> /// <param name="data">要导出的数据</param> /// <param name="fileName">原始文件名</param> /// <param name="directory">目标目录</param> /// <returns>实际保存的完整路径</returns> public static string ExportData(byte[] data, string fileName, string directory = "") { // 清理文件名 string cleanFileName = FileNameSanitizer.SanitizeFileName(fileName); // 构建完整路径 string fullPath = Path.Combine(directory, cleanFileName); // 确保目录存在 string dirPath = Path.GetDirectoryName(fullPath); if (!string.IsNullOrEmpty(dirPath) && !Directory.Exists(dirPath)) { Directory.CreateDirectory(dirPath); } // 写入文件 File.WriteAllBytes(fullPath, data); return fullPath; } /// <summary> /// 导出文本数据到文件 /// </summary> /// <param name="text">要导出的文本</param> /// <param name="fileName">原始文件名</param> /// <param name="encoding">文本编码</param> /// <param name="directory">目标目录</param> /// <returns>实际保存的完整路径</returns> public static string ExportText(string text, string fileName, Encoding encoding = null, string directory = "") { if (encoding == null) encoding = Encoding.UTF8; // 清理文件名 string cleanFileName = FileNameSanitizer.SanitizeFileName(fileName); // 构建完整路径 string fullPath = Path.Combine(directory, cleanFileName); // 确保目录存在 string dirPath = Path.GetDirectoryName(fullPath); if (!string.IsNullOrEmpty(dirPath) && !Directory.Exists(dirPath)) { Directory.CreateDirectory(dirPath); } // 写入文件 File.WriteAllText(fullPath, text, encoding); return fullPath; } }

3.测试

static void Main() { // 测试文件名清理 string[] testFileNames = { "test\"file.txt", "data<info>.csv", "report|summary.pdf", "my?document.docx", "file*name.exe", "normal_file.txt", "<>:\"\"\\|?* illegal chars", " spaced file ", ".hidden.", "" }; Console.WriteLine("文件名清理测试:"); foreach (string originalName in testFileNames) { string cleaned = FileNameSanitizer.SanitizeFileName(originalName); bool hasInvalid = FileNameSanitizer.ContainsInvalidChars(originalName); Console.WriteLine($"原文件名: '{originalName}' -> 清理后: '{cleaned}' (含非法字符: {hasInvalid})"); } Console.WriteLine("\n性能对比测试:"); // 性能测试 string testFileName = "performance_test_<>:\"\"|?*.txt"; int iterations = 100000; // 测试逐字符清理方法 var sw = System.Diagnostics.Stopwatch.StartNew(); for (int i = 0; i < iterations; i++) { FileNameSanitizer.SanitizeFileName(testFileName); } sw.Stop(); Console.WriteLine($"逐字符清理方法 ({iterations} 次): {sw.ElapsedMilliseconds} ms"); // 测试正则表达式清理方法 sw.Restart(); for (int i = 0; i < iterations; i++) { FileNameSanitizer.SanitizeFileNameRegex(testFileName); } sw.Stop(); Console.WriteLine($"正则表达式清理方法 ({iterations} 次): {sw.ElapsedMilliseconds} ms"); // 实际导出示例 Console.WriteLine("\n导出示例:"); try { string exportedPath = DataExporter.ExportText( "这是测试数据", "export<data>.csv", Encoding.UTF8, "output" ); Console.WriteLine($"成功导出到: {exportedPath}"); } catch (Exception ex) { Console.WriteLine($"导出失败: {ex.Message}"); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/5 11:27:51

终极指南:利用智能计数技术实现高效目标分析

面对复杂场景下目标数量统计的挑战&#xff0c;智能计数技术正成为解决密度检测和对象分析难题的关键工具。本指南将带您深入了解如何通过先进算法实现精准的目标识别与数量统计&#xff0c;让数据分析工作变得前所未有的高效和准确。 【免费下载链接】X-AnyLabeling Effortles…

作者头像 李华
网站建设 2026/2/5 10:09:06

5个技巧让Open WebUI数据可视化效果翻倍:新手也能轻松上手

5个技巧让Open WebUI数据可视化效果翻倍&#xff1a;新手也能轻松上手 【免费下载链接】open-webui Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 WebUI&#xff0c;设计用于完全离线操作&#xff0c;支持各种大型语言模型&#xff08;LLM&#xff09;运行器&#xff…

作者头像 李华
网站建设 2026/2/5 14:57:44

计算机毕业设计springboot基于JAVA的作业管理系统 基于SpringBoot+Java的在线作业发布与批阅平台 JavaWeb轻量级作业调度与成绩反馈系统

计算机毕业设计springboot基于JAVA的作业管理系统r14735cq &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。高校日常教学中&#xff0c;作业依旧是检验学生掌握程度、巩固知识点的…

作者头像 李华
网站建设 2026/2/7 23:58:27

计算机毕业设计springboot民宿信息展示与管理及可视化平台系统 基于SpringBoot的民宿数据可视化与智能运营平台 融合大数据的民宿资源聚合及多维分析系统

计算机毕业设计springboot民宿信息展示与管理及可视化平台系统b3c1b6t4 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。 民宿行业在疫情后迎来爆发式增长&#xff0c;但信息分散…

作者头像 李华
网站建设 2026/2/6 21:42:08

如何快速掌握OpenUtau:虚拟歌手音乐制作的完整指南

如何快速掌握OpenUtau&#xff1a;虚拟歌手音乐制作的完整指南 【免费下载链接】OpenUtau Open singing synthesis platform / Open source UTAU successor 项目地址: https://gitcode.com/gh_mirrors/op/OpenUtau 想要创作属于自己的虚拟歌手歌曲却不知从何开始&#x…

作者头像 李华
网站建设 2026/2/5 9:33:35

终极指南:5分钟快速掌握macOS与Android USB网络共享

在移动办公成为常态的今天&#xff0c;如何快速将Android手机的移动网络共享给Mac电脑是许多用户的迫切需求。HoRNDIS驱动程序正是为此而生的专业解决方案&#xff0c;它能通过USB数据线将Android设备变身为网络适配器&#xff0c;为macOS用户提供稳定可靠的网络连接。 【免费下…

作者头像 李华