如何创建包含文件和目录的文件?

时间:2016-10-02 10:57:13

标签: c# wpf file package

我正在研究WPF open source markdown editor,我正处于需要保存和加载文档的位置。

“文档”包含3个文件:

  • 元数据的XML文件
  • 降价文字的MD文件
  • 文档HTML视图的HTML文件。

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

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

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

有没有优雅的方法将多个文件和目录存档到一个文件中并访问它们我需要它们在C#中?

任何建议都将受到赞赏。

2 个答案:

答案 0 :(得分:1)

你是正确的考虑压缩文件(你不想重新发明那个轮子),你也是正确的解压缩到文件系统是丑陋的。但你不必;您可以使用自己的代码with the ZipArchive class创建zip并从中完全拉出文件。

答案 1 :(得分:0)

如果有人想知道我如何应用Ed Plunkett的答案,请输入以下代码:

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;
        }
    }
}