2013-01-24 216 views
2

时创建零件Uri我使用下面的代码压缩文件。我发现当被压缩的路径中的文件夹包含散列(#)时,CreatePartUri(uri)会抛出异常:当路径包含#

零件URI不能包含片段组件。

由于我无法改变文件夹名称,我该如何转义路径中的#符号才能正确创建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); 
     } 
    } 
} 
+0

['HttpUtility.UrlEncode'](http://msdn.microsoft.com/en-us/library/system .web.httputility.urlencode.aspx)? – Oded

+0

@Oded使用UrlEncode可以避开异常,但会导致CreateRelationship引发“无效的URI:无法解析主机名”。 – HaemEternal

回答

2

System.IO.Packaging程序不允许 “#” 在名字