Как заархивировать несколько файлов с похожими именами файлов в C # - PullRequest
1 голос
/ 15 июня 2011

Есть ли у кого-нибудь предложения о том, как взять папку и сжать каждую группу с одинаковым именем.Это будут имена, которые не являются расширением.

Вот примерный набросок кода, который я собрал:

//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 ]

1 голос
/ 16 июня 2011

Кажется, что библиотека 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 = *.*");
}    
1 голос
/ 16 июня 2011

Если вы можете использовать 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-файл уже существует.

1 голос
/ 16 июня 2011

Существует ли выходной каталог? Если я правильно помню, не найдя каталог, также выдается FileNotFoundException, и создание файла не приведет к автоматическому созданию пути к каталогу, его нужно создать заранее.

1 голос
/ 15 июня 2011

Бьюсь об заклад, это линия:

zip.AddFile(myOtherList[x]); 

На данный момент он должен найти рассматриваемый zip-файл. Тот факт, что вы повторно используете один и тот же объект, затрудняет его отладку, поэтому я хотел бы рассмотреть возможность перехода к своей собственной подпрограмме и передачи имени подпрограммы и путей к файлам в одном файле ZIP в подпрограмму. Затем вы создаете новый zip и добавляете файлы, а не используете один и тот же zip объект.

...