.NET控制台程序多文件打包成Zip遇DirectoryNotFoundException错误求助
问题描述
尝试用.NET控制台程序将多个文件打包为单个Zip文件,代码如下:
using System; using System.Collections.Generic; using System.IO; using System.IO.Compression; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConvertMultipleFilesIntoZip { internal class Program { static void Main(string[] args) { //string SourcePath1 = @\"d:\\SRS_9.4.7.25_1033\"; string SourcePath2 = @\"d:\\sanju2.nuspec\"; string SourcePath1 = @\"d:\\sanju1.nuspec\"; string DestinationPath = @\"d:\\Result9.zip\"; if (File.Exists(DestinationPath)) { File.Delete(DestinationPath); } string[] Files = { SourcePath1, SourcePath2 }; foreach (string variableName in Files) { ZipFile.CreateFromDirectory(variableName, DestinationPath); } Console.WriteLine(DestinationPath); } } }
运行后抛出错误:
Unhandled Exception: System.IO.DirectoryNotFoundException: Could not find a part of the path 'd:\sanju1.nuspec'.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileSystemEnumerableIterator1.CommonInit() at System.IO.FileSystemEnumerableIterator1..ctor(String path, String originalUserPath, String searchPattern, SearchOption searchOption, SearchResultHandler1 resultHandler, Boolean checkHost) at System.IO.DirectoryInfo.EnumerateFileSystemInfos(String searchPattern, SearchOption searchOption) at System.IO.Compression.ZipFile.DoCreateFromDirectory(String sourceDirectoryName, String destinationArchiveFileName, Nullable1 compressionLevel, Boolean includeBaseDirectory, Encoding entryNameEncoding)
at System.IO.Compression.ZipFile.CreateFromDirectory(String sourceDirectoryName, String destinationArchiveFileName)
at ConvertMultipleFilesIntoZip.Program.Main(String[] args) in C:\Users\sanjeev_kushvaha\source\repos\ConvertMultipleFilesIntoZip\ConvertMultipleFilesIntoZip\Program.cs:line 27
解决方案
错误原因
ZipFile.CreateFromDirectory方法要求第一个参数传入目录路径,但你传入的是单个文件路径,方法会将文件路径当作目录查找,因此抛出DirectoryNotFoundException。同时,循环调用该方法会每次覆盖生成的Zip文件,最终仅保留最后一个文件的压缩结果。
修正代码
要打包多个单个文件,需使用ZipArchive类逐个添加文件到Zip包:
using System; using System.IO; using System.IO.Compression; namespace ConvertMultipleFilesIntoZip { internal class Program { static void Main(string[] args) { string sourcePath1 = @"d:\sanju1.nuspec"; string sourcePath2 = @"d:\sanju2.nuspec"; string destinationPath = @"d:\Result9.zip"; // 删除已存在的目标Zip文件 if (File.Exists(destinationPath)) { File.Delete(destinationPath); } // 定义要打包的文件列表 string[] filesToZip = { sourcePath1, sourcePath2 }; // 创建ZipArchive并添加文件 using (FileStream zipFileStream = new FileStream(destinationPath, FileMode.Create)) { using (ZipArchive archive = new ZipArchive(zipFileStream, ZipArchiveMode.Create)) { foreach (string filePath in filesToZip) { // 检查文件是否存在 if (!File.Exists(filePath)) { Console.WriteLine($"警告:文件 {filePath} 不存在,已跳过"); continue; } // 添加文件到Zip,保留原文件名 archive.CreateEntryFromFile(filePath, Path.GetFileName(filePath)); } } } Console.WriteLine($"Zip文件已生成:{destinationPath}"); } } }
代码说明
- 文件存在性检查:添加源文件存在验证,避免因文件缺失引发报错。
- 使用ZipArchive:通过
CreateEntryFromFile方法将单个文件添加到Zip包,支持灵活添加多文件。 - 保留原文件名:用
Path.GetFileName(filePath)获取文件名,确保Zip内文件名称与源文件一致。
内容的提问来源于stack exchange,提问作者Sanjeev singh kushvaha

