c# - 创建文件夹时路径中的非法字符
问题描述
我有一个基于 CSV 文件批量创建目录的程序。它通过循环运行,但随后遇到“路径中的无效字符” .
StreamWriter sw = new StreamWriter(targetdir + "log.txt");
try
{
string[] items = File.ReadAllLines(csv);
foreach (string item in items)
{
Directory.CreateDirectory(targetdir + item);
sw.WriteLine(item + " OK!");
}
MessageBox.Show("Done");
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
sw.Close();
我不知道从哪里开始。我觉得我必须添加一个“如果其他”,但我不知道该放什么。提前致谢。
解决方案
您需要在代码中进行的主要更改是停止将创建目标文件夹的变量连接在一起并开始使用Path.Combine方法。在您的特定情况下,您可以使用GetInvalidFileNameChars列出不允许成为路径或文件名一部分的字符,然后检查当前项目是否包含这些字符中的任何一个。
但还有其他重要的改变要做。
首先,StreamWriter 是一个一次性对象,因此您应该始终在using 语句中创建它,以便在您使用它或即使发生异常异常时正确清理其内部资源。
其次,最好使用File.ReadLines而不是使用 ReadAllLines 加载内存中的所有行
char[] invalidChars = Path.GetInvalidFileNameChars();
string logFile = Path.Combine(targetdir, "log.txt");
try
{
using(StreamWriter sw = new StreamWriter(logFile))
{
foreach (string item in File.ReadLines(csv))
{
if(item.Any(x => invalidChars.Contains(x)))
sw.WriteLine(item + " BAD");
else
{
Directory.CreateDirectory(Path.Combine(targetdir,item));
sw.WriteLine(item + " OK!");
}
}
}
MessageBox.Show("Done");
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
最后,我想强调一下,在这种情况下,使用GetInvalidFileNameChars而不是GetInvalidPathChars很重要,因为我们在这里检查文件夹的名称。此名称具有用于文件的相同规则。
GetInvalidPathChars 省略了一些在路径字符串中有效的字符,例如\或? 和 *。因此,例如 GetInvalidPathChars 没有任何问题,例如C:\Windows\System32\*.dll
当此字符串包含不可用于文件名或单个文件夹名称的字符时。
推荐阅读
- node.js - 在 mongodb 的嵌套文档中查询
- html - 从表单中返回值时,我收到错误请求浏览器(或代理)发送了此服务器无法理解的请求
- javascript - 如何使用延迟运算符在 Angular 或 rxjs 中延迟 1 分钟后的方法调用
- python - 如何删除这样的错误(无法使用此索引类型执行 __mod__:索引)?
- java - Spring Boot 执行器 - Java 端点
- python - Python使用另一个列表对字典列表进行排序
- c# - 在 WPF C# 应用程序中使用 Xceed DateTimePicker 时,为什么在使用 OneWay 绑定时值只更新一次?
- r - 使用 R:如何将两个数字与与选项(数字 = n)相关的浮点问题进行比较,以及数字是如何引入的?
- powershell - 使用 PowerShell 比较文件夹和子文件夹
- swift - swift 将文本覆盖到另一个变量中