有人会对如何取一个文件夹并压缩每组相似名称有任何建议。这个 将是与扩展名相同的名称。
以下是我汇总的代码草案:
//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];
}
答案 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 = *.*");
}