2

我正在使用下面的代码压缩文件。我发现当被压缩路径中的文件夹包含哈希 (#) 时,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);
        }
    }
}
4

2 回答 2

2

System.IO.Packaging 不允许在名称中使用“#”

于 2013-10-04T06:12:20.493 回答
0

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

fileName = Regex.Replace(fileName, "#", "");
于 2019-04-15T16:22:33.403 回答