本文整理汇总了C++中IArchive::GetFile方法的典型用法代码示例。如果您正苦于以下问题:C++ IArchive::GetFile方法的具体用法?C++ IArchive::GetFile怎么用?C++ IArchive::GetFile使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类IArchive
的用法示例。
在下文中一共展示了IArchive::GetFile方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: extract
bool CFileSystem::extract(const std::string& filename, const std::string& dstdir)
{
#ifdef ARCHIVE_SUPPORT
LOG_INFO("Extracting %s to %s", filename.c_str(), dstdir.c_str());
const int len = filename.length();
IArchive* archive;
if ((len>4) && (filename.compare(len-3, 3,".7z") == 0 ) ) {
archive = new CSevenZipArchive(filename);
} else {
archive = new CZipArchive(filename);
}
const unsigned int num = archive->NumFiles();
for (unsigned int i=0; i<num; i++) {
std::vector<unsigned char> buf;
std::string name;
int size, mode;
archive->FileInfo(i,name, size, mode);
if (!archive->GetFile(i, buf)) {
LOG_ERROR("Error extracting %s from %s", name.c_str(), filename.c_str());
delete archive;
return false;
}
#ifdef WIN32
for(unsigned int i=0; i<name.length(); i++) { //replace / with \ on win32
if (name[i] == '/')
name[i]=PATH_DELIMITER;
}
#endif
std::string tmp = dstdir + PATH_DELIMITER;
tmp += name.c_str(); //FIXME: concating UTF-16
createSubdirs(tmp);
if (fileSystem->fileExists(tmp)) {
LOG_ERROR("File already exists: %s", tmp.c_str());
continue;
}
LOG_INFO("extracting (%s)", tmp.c_str());
FILE* f=fopen(tmp.c_str(), "wb+");
if (f == NULL) {
LOG_ERROR("Error creating %s", tmp.c_str());
delete archive;
return false;
}
int res=1;
if (!buf.empty())
res = fwrite(&buf[0], buf.size(), 1,f);
#ifndef WIN32
fchmod(fileno(f), mode);
#endif
if (res<=0) {
const int err=ferror(f);
LOG_ERROR("fwrite(%s): %d %s",name.c_str(), err, strerror(err));
fclose(f);
delete archive;
return false;
}
fclose(f);
}
delete archive;
LOG_INFO("done");
return true;
#else
LOG_ERROR("no archive support!");
return false;
#endif
}