像本机一样以编程方式压缩文件发送到压缩的 zip 文件夹

zip a file programatically like native send to compressed zip folder

我必须将压缩文件发送到外部应用程序。另一端的支持说应用程序无法读取我以编程方式创建的文件。这就是我创建文件的方式:

using System.IO;
using System.IO.Compression;

const string ZIPPATH = @".\stock.zip";
const string PACKAGEPATH = @".\stock\content";
const string APPPACKAGE = @".\stock";
const string PACKAGEFILENAME = @"content\Offers.xml";

private void CreateZipArchive()
{
    if (!Directory.Exists(PACKAGEPATH)) Directory.CreateDirectory(PACKAGEPATH);

    if (File.Exists(ZIPPATH)) File.Delete(ZIPPATH);

    ZipFile.CreateFromDirectory(APPPACKAGE, ZIPPATH);
    using (FileStream fs = new FileStream(ZIPPATH, FileMode.Open))
    using (ZipArchive archive = new ZipArchive(fs, ZipArchiveMode.Update))
    {
        ZipArchiveEntry zae = archive.CreateEntry(PACKAGEFILENAME);
        using (StreamWriter sw = new StreamWriter(zae.Open(), new UTF8Encoding(true)))
        {
           // xml writing code ...
            sw.Write("--snipped--");
        }
    }
}

文件夹 APPPACKAGE 包含一些必需的文件。创建 zip 后,我插入我创建的 xml 文件。检查创建的 zip 文件的内容 看起来 一切正常,但收件人应用程序无法读取它。我的问题是:有什么我可能遗漏的吗?

编辑: 客户几乎没有给我额外的反馈。唯一提到的是,如果存在 md5 错误,则可能会发生无法读取包的情况。我现在怀疑它可能与我创建包的顺序有关。我将尝试先创建 xml 文件,然后再创建 zip 文件

尽管 LukaszSzczygielek 指出 another possible Issue in zip file creation 我的特定问题的解决方案是先创建文件然后创建包:

using System.IO;
using System.IO.Compression;

const string ZIPPATH = @".\stock.zip";
const string PACKAGEPATH = @".\stock\content";
const string APPPACKAGE = @".\stock";
const string PACKAGEFILENAME = @"\Offers.xml";

private void CreateZipArchive()
{
    if (!Directory.Exists(PACKAGEPATH)) Directory.CreateDirectory(PACKAGEPATH);

    if (File.Exists(ZIPPATH)) File.Delete(ZIPPATH);

    string fileFullPath = PACKAGEPATH + PACKAGEFILENAME;
    using(Stream fs = new FileStream(fileFullPath, FileMode.Create, FileAccess.Write))
    using(StreamWriter sw = new StreamWriter(fs, new UTF8Encoding(true)))
    {
        // xml writing code ...
        sw.Write("--snipped--");
    }

    ZipFile.CreateFromDirectory(APPPACKAGE, ZIPPATH);
}