Что такое корневой каталог или как я могу установить каталог в dotnetzip
Вопрос
Где DotNetZip получает его корневой каталог для сохранения. Все примеры сохранения не показывают каталог.
Моя цель - резать папку и подпапки. В каждой папке я хочу застегивать все файлы в одну ZIP и удалить исходные файлы.
private void CopyFolder(string srcPath, string dstPath)
{
if (!Directory.Exists(dstPath))
Directory.CreateDirectory(dstPath);
string[] files = Directory.GetFiles(srcPath);
string msg;
string zipFileName;
using (ZipFile z = new ZipFile(Path.Combine(srcPath,String.Format("Archive{0:yyyyMMdd}.zip", DateTime.Now))))
{
z.ReadProgress += new EventHandler<ReadProgressEventArgs>(z_ReadProgress);
foreach (string file in files)
{
FileInfo fi = new FileInfo(file);
AddLog(String.Format("Adding {0}", file));
z.AddFile(file);
}
//z.Save(Path.Combine(srcPath, String.Format("Archive{0:yyyyMMdd}.zip", DateTime.Now)));
z.Save();
if (deleteSource)
{
foreach (string file in files)
{
File.Delete(file);
}
}
zipFileName = z.Name;
}
if (!compressOnly)
File.Copy(Path.Combine(srcPath,zipFileName), Path.Combine(dstPath, Path.GetFileName(zipFileName)));
string[] folders = Directory.GetDirectories(sourcePath);
foreach (string folder in folders)
{
string name = Path.GetFileName(folder);
string dest = Path.Combine(dstPath, name);
Console.WriteLine(ln);
log.Add(ln);
msg = String.Format("{3}{4}Start Copy: {0}{4}Directory: {1}{4}To: {2}", DateTime.Now.ToString("G"), name, dest, ln, Environment.NewLine);
AddLog(msg);
if (recurseFolders)
CopyFolder(folder, dest);
msg = String.Format("Copied Directory: {0}{4}To: {1}\nAt: {2}{3}", folder, dest, DateTime.Now.ToString("G"), Environment.NewLine);
AddLog(msg);
}
}
Решение
Это путь относительно Текущий рабочий каталог, или абсолютный путь. Это в основном стандартная процедура для путей.
Редактировать: Путь, который вы сохраняете, не имеет ничего общего с каталогами внутри ZIP. Либо:
using(ZipFile f = new ZipFile("zip_dir/foo.zip"))
{
f.AddFile("foo.txt");
f.Save();
}
или
using(ZipFile f = new ZipFile())
{
f.AddFile("foo.txt");
f.Save("zip_dir/foo.zip");
}
Имеет правильность, а именно создать ZIP-файл на ./zip_dir/foo.zip, содержащий один файл foo.txt. Конечно, вы можете создавать подкаталоги в ZIP, но это отдельная проблема.
Другие советы
Немного поздно и, возможно, мы говорим о двух разных версиях, но это все равно может помочь другим.
Вы можете указать, где файлы хранятся в архиве, используя второй аргумент для AddFile.@"\"
означает, что все файлы будут храниться в корне.
z.AddFile(file,@"\");
Конструктор, который вы используете ZipFile z = new ZipFile(...)
Занимает путь, который является местоположением zip-файл сохраняется.