2016-10-02 6 views
0

私はWPF open source markdown editorで作業していますが、私は文書を保存して読み込む必要があります。ファイルとディレクトリを含むファイルを作成するには?

  • メタデータ
  • のためのXMLファイル値下げテキスト
  • 文書のHTMLビューのためのHTMLファイル用MDファイル:

    A "文書は、" 3つのファイルが含まれています。

私はこれらのファイルを保持するディレクトリごとにドキュメントを作成しますが、これはあまり便利ではありません。 1つのファイルの中にすべてのファイルをパッケージ化して、3つの別々のファイルと混同しないようにする必要があります。

私は少しの研究を行い、オフィスのドキュメントは、各ファイルが実際に複数のディレクトリとファイルを保持するパッケージである同様の構造を持つことを発見しました。このようなオフィス文書を開くには、拡張機能をZIPに変更するだけでファイルを参照できますが、外側は単一のファイルとして表示されます。

私の最初のアイデアは、すべてのファイルを1つのファイルに圧縮し、保存時に拡張子を変更することでした。実際にファイルをロードしているときに解凍してください。しかし、私はこのアプローチがあまり優雅ではないと感じました。

複数のファイルとディレクトリを1つのファイルにアーカイブし、C#で必要なファイルにアクセスするという優雅な方法はありますか?

アドバイスをいただければ幸いです。

答えて

1

あなたはファイルを圧縮することを考慮する権利があります(あなたはその車輪を再発明したくありません)。ファイルシステムへの解凍が醜いことも正しいでしょう。しかし、あなたはそうする必要はありません。 zipを作成して、自分のコードで完全にファイルを取り出してくださいwith the ZipArchive class

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; 
     } 
    } 
} 
関連する問題