2011-06-15 4 views
1

У кого-нибудь есть предложения о том, как взять папку и заархивировать каждую группу подобного имени. Это будут именами, которые не являются расширением.Как зашифровать несколько файлов с похожими именами файлов в C#

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

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

FileNotFoundException является FileNotFoundException. Повторно проверьте, откуда генерируется исключение. Используйте отладчик, чтобы помочь. –

+0

Ваш раскол может работать неточно. Что, если имя файла имеет период в нем, например system.data.dll? Чтобы получить имя файла без расширения, вы должны использовать Path.GetFilenameWithoutExtension (filename) –

+0

Он выдает исключение в строке: -> zip.Save (OutputDir + prevFilename + ". Zip") , что не имеет смысла, потому что почему он ищет файл, который он пытается создать. Он должен искать только элементы, добавленные в очередь. Поскольку имя файла разделено чисто. Хмм до сих пор я использовал эту технику несколько раз, и похоже, что это чистые расколы. Я все еще думаю, что dll делает поиск по какой-то причине до сохранения. Не уверен ... – Michael

ответ

1

Я пари именно эта строка:

zip.AddFile(myOtherList[x]); 

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

+0

Это не кажется, что у него проблемы с этой линией. Он может найти файл для добавления. Просто он создает исключение при создании второго zip-файла. – Michael

+0

Извините, я не ответил на вторую часть вашего комментария. Мне придется подумать немного, чтобы понять, как делать то, что вы говорите. – Michael

1

Если вы можете использовать Linq (т.е. Framework 3.5 или более поздней версии), вы могли бы сделать что-то вроде следующего

Это использует Linq, чтобы сгруппировать файлы по имени файла (без расширения). Как только в этом формате, это облегчает итерацию через них.

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); 
} 

не проверял это, а также я не знаю, как Ионные обрабатывает случай, когда почтовый файл уже существует.

+0

У меня только SharpDevelop в тот момент, который я не думаю, что могу заставить LINQ работать на нем. Но спасибо за помощь! – Michael

1

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

+0

Да, выходной каталог уже создан. Он создавал первый файл плавно. – Michael

+0

Мне интересно, имеет ли он какое-то отношение к повторной инициализации объекта Zip, чтобы очистить все от него, чтобы начать с новых значений методу добавления. Все еще царапаю голову. – Michael

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 = *.*"); 
}  
Смежные вопросы