Cross-Platform Programming with wxWidgets
Just Make It Cross-Platform
Subscribe to Feed
  • Home
  • Projects
  • Links

Быстрый способ упаковки содержимого папки в ZIP-архив

wxWidgets Add comments |

В wxWidgets есть такая отличная штука, как wxDirTraverser.
Что это и с чем его едят? Официальная документация говорит нам вот что:

wxDirTraverser is an abstract interface which must be implemented by objects passed to wxDir::Traverse() function.
Как по мне, довольно странное описание %), ничего толкового мы из него не узнаем. Тогда идем смотреть описание wxDir::Traverse():
Enumerate all files and directories under the given directory recursively calling the element of the provided wxDirTraverser object for each of them.
Уже лучше, оказывается, объект wxDirTraverser вызывается для каждого найденного объекта в указанном каталоге. Поиск выполняется рекурсивно для всех подкаталогов.
Итак, чем нам может помочь эта информация. Из документации видно, что у класса wxDirTraverser есть методы, которые вызываются для каждого файла или подкаталога (соответственно OnFile() и OnDir()), в которые передается путь найденного файла или каталога. Это значит что, получая имя каждого файла, мы можем сразу же добавить этот файл в архив без необходимости получения списка всех файлов и подкаталогов в массив (как мы бы сделали при использовании wxDir::GetAllFiles()).
Как это реализовано, смотрим ниже:

Dir Travaerser:

#ifndef _WX_DIR_TRAVERSER_ZIP_H
#define _WX_DIR_TRAVERSER_ZIP_H

#include <wx/wx.h>
#include <wx/dir.h>
#include <wx/zipstrm.h>
#include <wx/filename.h>
#include <wx/wfstream.h>

class wxDirTraverserZIP : public wxDirTraverser
{
public:
	wxDirTraverserZIP(wxZipOutputStream & stream, const wxString & baseDir)
		: m_Stream(stream), m_BaseDir(baseDir) { }

	virtual wxDirTraverseResult OnFile(const wxString& filename)
	{
		do
		{
			wxFileName newFileName(filename);
			newFileName.MakeRelativeTo(m_BaseDir);
			if(!m_Stream.PutNextEntry(newFileName.GetFullPath()))
			{
				break;
			}
			wxFileInputStream in(filename);
			if(!in.IsOk())
			{
				break;
			}
			m_Stream.Write(in);
			return wxDIR_CONTINUE;
		}
		while(false);
		return wxDIR_STOP;
	}

	virtual wxDirTraverseResult OnDir(const wxString& dirname)
	{
		return wxDIR_CONTINUE;
	}

private:
	wxZipOutputStream & m_Stream;
	wxString m_BaseDir;
};

#endif

Usage:

bool PackFolder(const wxString & srcFolderName, const wxString & zipFileName)
{
	do
	{
		wxFFileOutputStream out(zipFileName);
		if(!out.IsOk()) break;
		wxCSConv conv(wxT("cp-866"));
		wxZipOutputStream zip(out, 9, conv);
		if(!zip.IsOk()) break;
		wxDirTraverserZIP traverser(zip, srcFolderName);
		wxDir srcDir(srcFolderName);
		if(srcDir.Traverse(traverser, wxEmptyString) == (size_t)-1) break;
		return true;
	}
	while(false);
	return false;
}
...
// Pack the folder
if(!PackFolder(wxT("c:\\test"), wxT("c:\\some.zip")))
{
//Handle error here
}

March 4th, 2008 |

Tags: wxWidgets, wxZipOutputStream, Статьи

Related Posts

  • Перевод книги Julian’а Smart’а – Глава XIV – Файлы и потоки
  • Getting Acquainted with Document-View architecture – Part II – Simple Text Editor
  • Creating Nice Reports with wxWidgets ZIP API
  • Сделайте мне красиво – Часть I – Знакомство с wxAUI
  • Собираем сторонние компоненты wxWidgets в Code::Blocks

2 Responses to “Быстрый способ упаковки содержимого папки в ZIP-архив”

  1. Gerald
    January 3rd, 2010 at 23:01:21

    Sorry I can’t read most of the writing on this website, but I’d very much like to use the DirTraverserZIP class you’ve written in a GPL project. Is that ok?

    Thanks for your good work!

    Cheers,
    Gerald


  2. T-Rex
    January 5th, 2010 at 00:01:54

    Yes, this is ok. It is free for both commercial and non-commercial use.


Leave a Reply

  • This blog is about…

    Библиотека Книги Статьи Articles Code::Blocks Components Controls Database DatabaseLayer Document/View Eclipse Localization NetBeans Networking News Printing Reports SQLite Tutorilas Video Visual Studio wxAUI wxButton wxDev-CPP wxGrid wxHelpController wxJavaScript wxJSON wxLocale wxLog wxPaintDC wxPropertyGrid wxRuby wxSQLite3 wxThread wxValidator wxWidgets wxWinCE wxZipInputStream wxZipOutputStream XML
  • Showcase

    Visit wxToolBox Homepage

    Buy wxToolBox (with source code)

  • Archives

    • November 2009
    • September 2009
    • August 2009
    • May 2009
    • April 2009
    • March 2009
    • February 2009
    • January 2009
    • December 2008
    • September 2008
    • August 2008
    • July 2008
    • June 2008
    • May 2008
    • April 2008
    • March 2008
    • February 2008
    • January 2008
    • December 2007
    • June 2007
    • May 2007
    • January 2007
  • Recent Comments

    • T-Rex on Сделайте мне красиво – Часть II – wxAUI в Multi-View приложений
    • Vanya on Сделайте мне красиво – Часть II – wxAUI в Multi-View приложений
    • Sash on wxWidgets-2.8 and Code::Blocks (Windows)
    • T-Rex on Быстрый способ упаковки содержимого папки в ZIP-архив
    • Gerald on Быстрый способ упаковки содержимого папки в ZIP-архив
  • Buttons

    Locations of visitors to this page

    Rambler's Top100
    Рейтинг@Mail.ru

Copyright © 2010 Cross-Platform Programming with wxWidgets All Rights Reserved
RSS Log in