2016-10-02 159 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; 
     } 
    } 
} 
相關問題