如何在C#中压缩具有类似文件名的多个文件

时间:2011-06-15 19:38:47

标签: c# file process zip

有人会对如何取一个文件夹并压缩每组相似名称有任何建议。这个 将是与扩展名相同的名称。

以下是我汇总的代码草案:

//When it gets to the 3rd file it for some reason throws an exception
//System.IO.FileNotFoundException: Could not find file 'c:\Temp\zipped\fileb.zip'.
//The funny thing is that I would figure it is trying to write this new filename why look for it
//This uses the Ionic.Zip.dll library 
string InputDir="C:\\Temp\\";
string OutputDir="C:\\Temp\\zipped\\";
string prevFilename="";
ZipFile zip = new ZipFile();

Directory.SetCurrentDirectory(InputDir);//Will change this later
for (int x=0; x < myOtherList.Count;x++)
{
    string fullfilename = myOtherList[x];
    string[] fileDOTextension = fullfilename.Split('.');

    if ((fileDOTextension[0]!=prevFilename)&&(x!=0))
    {
        zip.Save(OutputDir+prevFilename+".zip");
        zip.RemoveSelectedEntries("name = *.*");
    }

    zip.AddFile(myOtherList[x]);
    prevFilename=fileDOTextension[0];
}

4 个答案:

答案 0 :(得分:1)

我打赌这就是这条线:

zip.AddFile(myOtherList[x]); 

此时,它必须找到有问题的zip文件。你重复使用完全相同的对象这一事实使得调试变得更加困难,所以我会考虑进入它自己的例程,并将zip的名称和文件路径输入到单个zip文件中以压缩到例程。然后,您创建一个新的zip并添加文件,而不是重用相同的zip对象。

答案 1 :(得分:1)

如果您可以使用Linq(即Framework 3.5或更高版本),您可以执行以下操作

这使用Linq按fileName对文件进行分组(不带扩展名)。一旦采用这种格式,就可以更容易地迭代它们。

string InputDir="C:\\Temp\\";
string OutputDir="C:\\Temp\\zipped\\";

Directory.SetCurrentDirectory(InputDir);//Will change this later
DirectoryInfo di = new DirectoryInfo(InputDir);
var filenames = di.GetFiles().ToList();

var zipFiles = 
    (
    from r in filenames 
    group r by System.IO.Path.GetFileNameWithoutExtension(r.Name) into results
    select new { results.Key , Filenames = (from r in results select r.FullName) } 
    );


foreach(var r in zipFiles)
{
    string zipFileName = System.IO.Path.Combine(OutputDir , r.Key + ".zip");
    Console.WriteLine("Creating Zip file " + zipFileName);

    ZipFile zip = new ZipFile();

    foreach(var filename in r.Filenames)
    {
        Console.WriteLine("     Adding File " + filename);
        zip.AddFile(filename);
    }
    zip.Save(zipFileName);
}

没有测试过这个,我也不知道Ionic如何处理zip文件已经存在的情况。

答案 2 :(得分:1)

输出目录是否存在?如果我没记错的话,找不到目录也会抛出FileNotFoundException并且创建文件不会自动创建目录路径,需要事先创建它。

答案 3 :(得分:1)

似乎Ionic.Zip.dll库无法正确处理。不确定我是否使用了合适的术语。在尝试了这么多其他想法后,我想自己如何以不同的方式创建唯一列表。我的解决方案是使用LINQ,因为我找不到SharpDevelop而是使用旧代码:

//Create a new list to store filenames (minus extension)   
List<String> myOtherList =  new List<String>();

foreach (String strCol in listBox1.Items) 
    myOtherList.Add(strCol.Split('.')[0]);

//Create a new list to store UNIQUE filenames (minus extension)
List<string> uniques = new List<string>();

foreach (string item in myOtherList)
    if (!uniques.Contains(item)) uniques.Add(item);

//Set some static values for the test     
string InputDir="C:\\Temp\\";
string OutputDir="C:\\Temp\\zipped\\";

Directory.SetCurrentDirectory(InputDir);

//Create a new object instances for each new zip file
for (int x=0; x < uniques.Count;x++)
{
    ZipFile zip = new ZipFile();

    zip.AddSelectedFiles(uniques[x]+".*");
    zip.Save(OutputDir+uniques[x]+".zip");//uses OutputDir+
    zip.RemoveSelectedEntries("name = *.*");
}