C# URI中的特殊字符

C# URI中的特殊字符,c#,zip,uri,C#,Zip,Uri,我有一个zip文件,我正试图读取其中的内容,在我需要读取名为[Content\u Types].xml的文件之前,它一直运行良好。当我尝试创建一个新的URI时,它会尝试将括号转换为url友好的内容,这会导致文件名不匹配 我正在使用System.IO.Packaging.Packaging读取zip文件,在尝试使用Package.GetPart()读取部分文件包时,需要一个URI 如何创建一个URI,使括号保持不变,以便从包中读取文件 为了澄清我在这里要做的事情,officeopenxml文件(.

我有一个zip文件,我正试图读取其中的内容,在我需要读取名为
[Content\u Types].xml的文件之前,它一直运行良好。当我尝试创建一个新的URI时,它会尝试将括号转换为url友好的内容,这会导致文件名不匹配

我正在使用
System.IO.Packaging.Packaging
读取zip文件,在尝试使用
Package.GetPart()读取部分文件包时,需要一个URI

如何创建一个URI,使括号保持不变,以便从包中读取文件


为了澄清我在这里要做的事情,officeopenxml文件(.docx、.xlsx、.pptx等)实际上是具有不同扩展名的zip文件。如果将这些扩展名之一的文件重命名为.zip,则可以看到Office文件结构的内容。每个Office Open XML文件的根目录中都包含一个名为
[Content\u Types]的文件。XML
我需要修改该特定文件。

有一个重载URI构造函数,它接受布尔dontEscape,这将防止方括号被转义。

根据重新阅读更新的问题进行编辑:
所以从谷歌上看,它看起来像[内容类型].xml是一个将zip文件转换为“zip包”的文件。巧合的是,
System.IO.Packaging.Package
仅适用于zip包(而不是常规的zip文件)。它也只写zip包(总是包括[Content\u Types].xml)。我不认为您可以通过
System.IO.Packaging.Packaging
,直接从[Content\u Types].xml获取设计上的信息。

有一个重载URI构造函数,它接受布尔顿特斯卡普,这应该可以防止括号被转义。

根据重新阅读更新的问题进行编辑: 所以从谷歌上看,它看起来像[内容类型].xml是一个将zip文件转换为“zip包”的文件。巧合的是,
System.IO.Packaging.Package
仅适用于zip包(而不是常规的zip文件)。它也只写zip包(总是包括[Content\u Types].xml)。我不认为你可以通过
System.IO.Packaging.Packaging
直接访问[Content\u Types].xml,这是设计的。

这是不可能的

根据,诸如
[
]
等字符属于“不明智”类别,因为已知网关和其他传输代理会修改它们

无论如何,在这个问题上有一点更明确:

由Internet协议文本地址标识的主机,版本6
[RFC3513]或更高版本通过包含IP文本来区分
在方括号内(“[”和“]”)这是唯一一个
URI语法中允许使用方括号字符。

因此,使用方括号的唯一方法是,如果所依赖的代码未能满足RFC规范,则使用方括号

我可能会尝试使用
package.GetParts()
方法迭代这些部件并输出它们的URI。很有意思的一点是,看看你的特殊文件会返回什么。

这是不可能的

根据,诸如
[
]
等字符属于“不明智”类别,因为已知网关和其他传输代理会修改它们

无论如何,在这个问题上有一点更明确:

由Internet协议文本地址标识的主机,版本6
[RFC3513]或更高版本通过包含IP文本来区分
在方括号内(“[”和“]”)这是唯一一个
URI语法中允许使用方括号字符。

因此,使用方括号的唯一方法是,如果所依赖的代码未能满足RFC规范,则使用方括号


我可能会尝试使用
package.GetParts()
方法迭代这些部件并输出它们的URI。查看您的特殊文件返回的内容会很有趣。

Hmm,我尝试的每一个变体都会以UriFormatException结束-无效URI:无法确定URI的格式。我尝试过使用斜杠,但没有斜杠,前面的@。该问题中使用的方法已被弃用。@HotN-我能够在URI没有用括号打开的情况下使用它-例如,
@“C:\[Content\u Types].xml”
workedHmm,我尝试的每个变体最终都会出现一个UriFormatException-无效URI:无法确定URI的格式。我用斜杠试过,没有斜杠,前面的@。这个问题中使用的方法不推荐。@HotN-我能够在URI没有用括号打开的情况下使用它-例如,
@“C:\[Content\u Types].xml”
workedI我刚刚试过,结果集合中没有包含我需要的一个文件,尽管我能在包裹里清楚地看到。当然。@HotN:那里面满是令人敬畏的酱汁。在这一点上,我要说选择一个不同的zip文件解析器。我认为负责包装类的MS“程序员”应该被带回去,并用球棒殴打。没有理由在这件事上强行使用URI。真是太棒了。我应该早点放弃,然后去第三方。DotNetZip做了一点让人头痛的事。我只是尝试了一下,结果集合中没有包含我需要的一个文件,尽管我可以在包中清楚地看到它。当然。@HotN:那里面满是令人敬畏的酱汁。在这一点上,我要说选择一个不同的zip文件解析器。我认为负责包装类的MS“程序员”应该被带回去,并用球棒殴打。没有理由在这件事上强行使用URI。真是太棒了。我应该早点放弃,然后去第三方。DotNetZip只花了一小部分的时间就成功了。使用普通的ZIP组件会更有意义。使用普通的ZIP组件会更有意义。