2016-10-02 158 views
0

我正在WPF open source markdown editor上工作,我处于需要保存和加载文档的地步。如何创建一个包含文件和目录的文件?

“文档” 包含3个文件:

  • 元数据
  • 的降价文本
  • 一个HTML文件,对文件的HTML视图中的MD文件中的XML文件。

在这个测试点上,我为每个文档创建一个目录来保存这些文件,但这不是很方便。我需要将所有这些文件打包到单个文件中,以便用户不会与3个单独的文件混淆。

我做了一些研究,发现办公文档有一个类似的结构,其中每个文件实际上是一个包含多个目录和文件的包。要打开这样的办公文档,您只需将扩展名更改为ZIP,即可浏览这些文件,但在外部它看起来像是单个文件。

我最初的想法是将所有文件压缩到单个文件,保存时更改扩展名。当我实际加载文件时将其解压缩。但我觉得这种方法不是很优雅。

是否有任何优雅的方式来存档多个文件和目录到一个单一的文件和访问他们我需要他们在C#中?

任何意见,将不胜感激。

回答

1

你是正确的考虑压缩文件(你不想重新发明那个文件夹),而且你对文件系统的解压缩也很糟糕。但是你不需要;您可以在您自己的代码with the ZipArchive class中完全创建zip文件并将其拉出。

0

如果你想知道我如何应用埃德宾吉答案,这里是代码:

var saveDialog = new SaveFileDialog 
{ 
    CreatePrompt = true, 
    OverwritePrompt = true, 
    Filter = "Project Markdown File | *.pmd" 
}; 

var result = saveDialog.ShowDialog(); 

if (result != null) 
{ 
    if (result == true) 
    { 
     if (!Directory.Exists(saveDialog.FileName + "_temp")) 
     { 
      var parentFolder = Directory.CreateDirectory(saveDialog.FileName + "_temp").FullName; 

      var mp = new MarkdownParser(); 
      // Generate HTML 
      var html = mp.Parse(document.Markdown.Markdown); 

      var markdownFilePath = parentFolder + "\\" + saveDialog.SafeFileName + ".md"; 
      var htmlFilePath = parentFolder + "\\" + saveDialog.SafeFileName + ".html"; 
      var metadataFilePath = parentFolder + "\\" + saveDialog.SafeFileName + ".xml"; 
      // Generate MD file 
      using (var sw = new StreamWriter(markdownFilePath)) 
      { 
       sw.Write(document.Markdown.Markdown); 
      } 
      // Generate HTML file 
      using (var sw = new StreamWriter(htmlFilePath)) 
      { 
       sw.Write(html); 
      } 
      // Generate XML file 
      document.Metadata.FileName = saveDialog.SafeFileName; 
      var gxs = new GenericXmlSerializer<DocumentMetadata>(); 
      gxs.Serialize(document.Metadata, metadataFilePath); 
      // Generate style 
      var cssFilePath = AppDomain.CurrentDomain.BaseDirectory + "Styles\\github-markdown.css"; 
      if (!Directory.Exists(parentFolder + "\\Styles")) 
      { 
       Directory.CreateDirectory(parentFolder + "\\Styles"); 
      } 

      if (!File.Exists(parentFolder + "\\Styles\\github-markdown.css")) 
      { 
       File.Copy(cssFilePath, parentFolder + "\\Styles\\github-markdown.css"); 
      } 
      // Generate the package 
      ZipFile.CreateFromDirectory(parentFolder, saveDialog.FileName); 
      // Update the view 
      var saveResult = new SaveResult 
      { 
       FileName = saveDialog.SafeFileName, 
       Source = htmlFilePath.ToUri(), 
       TempFile = saveDialog.FileName + "_temp" 
      }; 
      return saveResult; 
     } 
    } 
} 
相关问题