c# - 当路径包含 # 时创建部分 URI

标签 c# c#-4.0 zip uri

我正在使用下面的代码压缩文件。我发现当压缩路径中的文件夹包含哈希值 (#) 时,CreatePartUri(uri) 会引发异常:

Part URI cannot contain a Fragment component.

由于我无法更改文件夹名称,如何转义路径中的 # 符号以便正确创建 Uri?

using System;
using System.IO;
using System.IO.Packaging;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string targetFilePath = "C:\\TEMP.ZIP";
            try
            {
                if (File.Exists(targetFilePath))
                {
                    File.Delete(targetFilePath);
                }
                string packageRelationshipType = 
                       @"http://schemas.openxmlformats.org/" + 
                       @"package/2007/relationships/htmx/root-html";

               CompressionOption compressionOption = CompressionOption.Maximum;

                using (Package package = Package.Open(targetFilePath,
                                                      FileMode.OpenOrCreate))
                {
                    string fileName = @"\#TestFolder\TestFile.txt";
                    string filePathOnServer = @"C:\" + fileName;

                    Uri uri = new Uri(fileName, UriKind.Relative);
                    Uri partUriDocument = PackUriHelper.CreatePartUri(uri);

                    PackagePart packagePartDocument = 
                                  package.CreatePart(partUriDocument, 
                                 System.Net.Mime.MediaTypeNames.Text.RichText,
                                 compressionOption);

                    using (FileStream fileStream = new FileStream
                                                      (filePathOnServer, 
                                                       FileMode.Open, 
                                                       FileAccess.Read))
                    {
                       CopyStream(fileStream, packagePartDocument.GetStream());
                    }

                    package.CreateRelationship(packagePartDocument.Uri, 
                                               TargetMode.Internal, 
                                               packageRelationshipType);
                }
            }
            catch (Exception e)
            {
                string exceptionText = e.ToString();
            }
        }
        private static void CopyStream(Stream source, Stream target)
        {
            const int bufSize = 0x1000;
            byte[] buf = new byte[bufSize];
            int bytesRead = 0;

            while ((bytesRead = source.Read(buf, 0, bufSize)) > 0)
                target.Write(buf, 0, bytesRead);
        }
    }
}

最佳答案

System.IO.Packaging 不允许名称中包含“#”

关于c# - 当路径包含 # 时创建部分 URI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14499481/

相关文章:

javascript - 查找用户的位置并将其显示在单个回发的弹出窗口中

Android 应用程序在提取 zip 文件时没有响应

linux - 如何递归解压缩嵌套的 ZIP 文件?

c# - JIT 编译器与离线编译器

asp.net-mvc-3 - ASP.NET MVC3 EditorFor in Form 用于具有固定长度数组的模型

c#-4.0 - 在 C# 的 if 运算符中使用 like 运算符

java - 使用 java.util.zip.ZipOutputStream 时 zip 文件中的目录

c# - WCF 与 ASP.NET Web API

c# - 如何验证 SMTP 服务器

c# - 让 DataContractSerializer 以两种不同的方式序列化同一个类?