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 に答える