我的路径是UTF-16字符串。他们中的大多数只使用ASCII集,因此像test
这样的文件名将存储为
T \x00 E \x00 S \x00 T \x00
我使用Encoding.Unicode.GetString(bytes)
来读取字符串并且它工作正常(当我将它们打印到控制台或表单控件时它按照我的预期显示),但是当我想要实际创建一个给定的文件时使用以下代码
BinaryWriter outFile = new BinaryWriter(File.OpenWrite(path));
我得到了一个例外
Unhandled Exception: System.ArgumentException: Illegal characters in path.
at System.IO.Path.CheckInvalidPathChars(String path)
at System.IO.Path.GetFileName(String path)
这可能是因为那里有空字符(可能它在内部存储原始字节数组),但我不知道如何处理它。并非所有字符串都是ASCII,而且有些字符使用两个字节。
更新:
证明非法字节只是填充到字符串的空字节。但是,我不能简单地删除所有尾随空字节,但我也不知道字符串的长度。如何从字符串中去除空字节,其中每个字符以n个字节存储?
答案 0 :(得分:2)
From the MSDN on `Path.GetInvalidPathChars'
完整的无效字符集可能因文件系统而异。对于 例如,在基于Windows的桌面平台上,路径字符无效 可能包括ASCII / Unicode字符1到31,以及引用 (“),小于(<),大于(>),管道(|),退格(\ b),null (\ 0)和制表符(\ t)。
您可以使用Path.GetInvalidPathChars
作为过滤器。将输入字符串复制到输出字符串,同时过滤与Path.CheckInvalidPathChars
中的字符匹配的任何字符。
这是我做的一个例子:
string input = @"This <path> ""contains"" |some| ~invalid~ characters";
var invalidChars = Path.GetInvalidPathChars();
string output = input.Aggregate(new StringBuilder(), (sb, c) => invalidChars.Contains(c) ? sb : sb.Append(c), sb => sb.ToString());
// output contains: This path contains some ~invalid~ characters
请注意,大多数符号都会被滤除,但波浪号不是,因为它们是有效的路径字符。
答案 1 :(得分:1)
您最有可能收到此错误,因为如果您拨打Path.GetInvalidPathChars()
,您的路径中包含一个可用的无效字符。
其中一些字符为"
,<
,|
和>
。
因为您已使用Encoding.Unicode.GetString
解码了字符串,所以此问题与任何UNICODE编码问题无关。
这是一些简单(但不是非常有效)的代码,用下划线替换路径中的无效字符:
var stringBuilder = path
.Select(c => Path.GetInvalidPathChars().Contains(c) ? '_' : c)
.Aggregate(new StringBuilder(), (a, c) => a.Append(c));
path = stringBuilder.ToString();