压缩文件夹后,所有zip条目都会更改编码

时间:2016-03-02 09:16:20

标签: c# windows encoding zip asp.net-core

我们使用ASP.NET核心并拥有以下代码:

public static void Compress(string sourceDirectoryName, string destinationArchiveFileName)
{
    var directoryName = Path.GetFileName(sourceDirectoryName);
    var remotePath = sourceDirectoryName.Split(new[] { directoryName }, StringSplitOptions.RemoveEmptyEntries).First();

    using (var zipStream = new MemoryStream())
    {
        using (var zip = new ZipArchive(zipStream, ZipArchiveMode.Create, true, Encoding.UTF8))
        {
            zip.CreateEntry(string.Concat(directoryName, directorySlash));

            foreach (var path in Directory.EnumerateFileSystemEntries(sourceDirectoryName, "*", SearchOption.AllDirectories))
            {
                if (!Directory.Exists(path))
                    zip.CreateEntryFromFile(path, path.RemoveSubString(remotePath).ReplacePathSeparatorOnSlash());
                else
                    zip.CreateEntry(string.Concat(path.RemoveSubString(remotePath).ReplacePathSeparatorOnSlash(), directorySlash));
            }
        }

        using (var outputZip = new FileStream(destinationArchiveFileName, FileMode.Create))
        {
            zipStream.Seek(0, SeekOrigin.Begin);
            zipStream.CopyTo(outputZip);
        }
    }
}

如果我们使用Windows资源管理器打开此存档,在压缩包含俄语符号的sourceDirectoryName之后,我们会看到以下内容:

enter image description here 并且标有绿色的名称是正确的,标有红色的名称的名称编码已更改。

如果我们使用以下代码:

ZipFile.CreateFromDirectory(sourceDirectoryName, destinationArchiveFileName);

我们遇到同样的问题。如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

我找到了答案。我必须使用编码866:

using (var zip = new ZipArchive(zipStream, ZipArchiveMode.Create, true, Encoding.GetEncoding(866)))
{
    ...
}