*
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
#include "IZipFileContentProvider.h"
|
||||
namespace LifeCore
|
||||
{
|
||||
static const String zipPathSplitter(_text("/"));
|
||||
|
||||
IZipFileContentProvider::IZipFileContentProvider(const String& zipFile)
|
||||
{
|
||||
IZipFolder* folder = new IZipFolder();
|
||||
g_rootFolder = zipFile;
|
||||
folder->Provider = this;
|
||||
folder->Name = GetFileNameWithoutExtention(zipFile);
|
||||
|
||||
folder->EntryName = _text("");
|
||||
|
||||
g_fs = new IFileSystem(folder);
|
||||
|
||||
g_sourceFile = unzOpen(zipFile.c_str());
|
||||
|
||||
unzGetGlobalInfo(g_sourceFile,&globalInfo);
|
||||
g_fs->GetRootFolder();
|
||||
BuildTree();
|
||||
unzClose(g_sourceFile);
|
||||
}
|
||||
|
||||
void IZipFileContentProvider::BuildTree()
|
||||
{
|
||||
unzGoToFirstFile(g_sourceFile);
|
||||
|
||||
for (unsigned int i = 0; i < globalInfo.number_entry; i++)
|
||||
{
|
||||
tchar fileName[256+1] = {0};
|
||||
unz_file_info fileInfo;
|
||||
|
||||
unzGetCurrentFileInfo(g_sourceFile,&fileInfo,fileName,256,NULL,0,NULL, 0);
|
||||
|
||||
if (fileInfo.size_filename >0 && fileName[fileInfo.size_filename-1] == '/')
|
||||
{
|
||||
/* string path = entry.Name;
|
||||
path = path.Replace('/', '\\');
|
||||
IZipFolder folder = BuildDirectory(path);*/
|
||||
}
|
||||
else//is file
|
||||
{
|
||||
String sd = String(fileName);
|
||||
String p = GetZipPathWithoutFilename(sd);
|
||||
IZipFolder* folder;
|
||||
g_fs->GetFolder(p, (IFolder**)&folder);
|
||||
|
||||
IZipFile* file = new IZipFile();
|
||||
file->FileName = GetFileName(sd, zipPathSplitter);
|
||||
file->Provider = this;
|
||||
file->Size = fileInfo.uncompressed_size;
|
||||
file->EntryName = sd;
|
||||
folder->AddFile(file);
|
||||
}
|
||||
unzCloseCurrentFile(g_sourceFile);
|
||||
unzGoToNextFile(g_sourceFile);
|
||||
}
|
||||
|
||||
//print folder tree
|
||||
String tab(_text("\t"));
|
||||
int cnt = g_fs->GetRootFolder()->folderCount;
|
||||
for(int i = 0; i < cnt; i++)
|
||||
{
|
||||
IFolder* fld = g_fs->GetRootFolder()->GetFolder(i);
|
||||
PRINT(_text("%s\n"), fld->Name.c_str());
|
||||
PRINT(_text("Files count: %i\n"), fld->fileCount);
|
||||
}
|
||||
}
|
||||
|
||||
String IZipFileContentProvider::GetZipPathWithoutFilename(const String& path)
|
||||
{
|
||||
int offset = path.find_last_of(_text("/"));
|
||||
if(offset>=0)
|
||||
{
|
||||
return path.substr(0, offset);
|
||||
}
|
||||
else
|
||||
{
|
||||
return _text("/");
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user