路径包含#时创建零件Uri

时间:2013-01-24 10:47:34

标签: c# c#-4.0 zip uri

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

  

部分URI不能包含Fragment组件。

由于我无法更改文件夹名称,如何在路径中转义#符号以便正确创建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);
        }
    }
}

2 个答案:

答案 0 :(得分:2)

System.IO.Packaging在名称

中不允许使用“#”

答案 1 :(得分:0)

正如Rockstart所说,Uri中不允许使用“#” 创建Uri删除#个字符之前,请使用此权限:

builder.append(link.attr("\n")).append(link.text());