压缩文件夹后所有 zip 条目更改编码
After zipping folder all zip entries change encoding
我们使用 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);
}
}
}
压缩包含俄罗斯符号的 sourceDirectoryName 后,如果我们使用 windows 资源管理器打开此存档,我们会看到以下内容:
其中绿色标记的名称正确,红色标记的名称更改了名称编码。
如果我们使用下面的代码:
ZipFile.CreateFromDirectory(sourceDirectoryName, destinationArchiveFileName);
我们有同样的问题。如何解决这个问题?
我找到答案了。我必须使用编码 866:
using (var zip = new ZipArchive(zipStream, ZipArchiveMode.Create, true, Encoding.GetEncoding(866)))
{
...
}
我们使用 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);
}
}
}
压缩包含俄罗斯符号的 sourceDirectoryName 后,如果我们使用 windows 资源管理器打开此存档,我们会看到以下内容:
如果我们使用下面的代码:
ZipFile.CreateFromDirectory(sourceDirectoryName, destinationArchiveFileName);
我们有同样的问题。如何解决这个问题?
我找到答案了。我必须使用编码 866:
using (var zip = new ZipArchive(zipStream, ZipArchiveMode.Create, true, Encoding.GetEncoding(866)))
{
...
}