diff --git a/src/Files.App/Data/Models/CompressArchiveModel.cs b/src/Files.App/Data/Models/CompressArchiveModel.cs index 8e4ff0ac45f6..cd2a6856e5f2 100644 --- a/src/Files.App/Data/Models/CompressArchiveModel.cs +++ b/src/Files.App/Data/Models/CompressArchiveModel.cs @@ -175,7 +175,35 @@ public async Task RunCreationAsync() foreach (string directory in directories) { - await compressor.CompressDirectoryAsync(directory, ArchivePath, Password); + try + { + await compressor.CompressDirectoryAsync(directory, ArchivePath, Password); + } + catch (SevenZipInvalidFileNamesException) + { + // The directory has no files, so we need to create entries manually + var fileDictionary = new Dictionary(); + AddEntry(fileDictionary, directory, ""); + + compressor.CompressFileDictionary(fileDictionary, ArchivePath, Password); + + static void AddEntry(IDictionary fileDictionary, string directory, string entryPrefix) + { + DirectoryInfo directoryInfo = new DirectoryInfo(directory); + + DirectoryInfo[] directories = directoryInfo.GetDirectories(); + if (directories.Length == 0) + { + fileDictionary.Add(entryPrefix + directoryInfo.Name, null); + } + else + { + entryPrefix += directoryInfo.Name + Path.DirectorySeparatorChar; + foreach (DirectoryInfo directoryInfo2 in directories) + AddEntry(fileDictionary, directoryInfo2.FullName, entryPrefix); + } + } + } compressor.CompressionMode = CompressionMode.Append; }