Skip to content

Commit

Permalink
Add support for extraction without retaining the directory structure
Browse files Browse the repository at this point in the history
Close issue #34
  • Loading branch information
rikyoz committed May 9, 2020
1 parent 8f82e52 commit 8ed8d8c
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 10 deletions.
5 changes: 5 additions & 0 deletions include/bitarchiveopener.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,13 @@ namespace bit7z {
*/
const BitInFormat& extractionFormat() const;

bool retainDirectories() const;

void setRetainDirectories( bool retain );

protected:
const BitInFormat& mFormat;
bool mRetainDirectories;

BitArchiveOpener( const Bit7zLibrary& lib,
const BitInFormat& format,
Expand Down
4 changes: 3 additions & 1 deletion include/fileextractcallback.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@ namespace bit7z {
FileExtractCallback( const BitArchiveHandler& handler,
const BitInputArchive& inputArchive,
fs::path inFilePath,
fs::path directoryPath );
fs::path directoryPath,
bool retainDirectories );

~FileExtractCallback() override = default;

Expand All @@ -48,6 +49,7 @@ namespace bit7z {
fs::path mInFilePath; // Input file path
fs::path mDirectoryPath; // Output directory
fs::path mDiskFilePath; // full path to file on disk
bool mRetainDirectories;

struct CProcessedFileInfo {
FILETIME MTime;
Expand Down
16 changes: 14 additions & 2 deletions src/bitarchiveopener.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ using namespace bit7z;
CONSTEXPR auto kCannotExtractFolderToBuffer = "Cannot extract a folder to a buffer";

BitArchiveOpener::BitArchiveOpener( const Bit7zLibrary& lib, const BitInFormat& format, const tstring& password )
: BitArchiveHandler( lib, password ), mFormat( format ) {}
: BitArchiveHandler( lib, password ), mFormat( format ), mRetainDirectories( true ) {}

const BitInFormat& BitArchiveOpener::format() const {
return mFormat;
Expand All @@ -47,7 +47,11 @@ void BitArchiveOpener::extractToFileSystem( const BitInputArchive& in_archive,
const tstring& in_file,
const tstring& out_dir,
const vector< uint32_t >& indices ) const {
CMyComPtr< ExtractCallback > extract_callback = new FileExtractCallback( *this, in_archive, in_file, out_dir );
CMyComPtr< ExtractCallback > extract_callback = new FileExtractCallback( *this,
in_archive,
in_file,
out_dir,
mRetainDirectories );
in_archive.extract( indices, extract_callback );
}

Expand Down Expand Up @@ -101,3 +105,11 @@ void BitArchiveOpener::extractToBufferMap( const BitInputArchive& in_archive,
in_archive.extract( files_indices, extract_callback );

}

bool BitArchiveOpener::retainDirectories() const {
return mRetainDirectories;
}

void BitArchiveOpener::setRetainDirectories( bool retain ) {
mRetainDirectories = retain;
}
2 changes: 1 addition & 1 deletion src/bitextractor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,6 @@ void BitExtractor::extract( const tstring& in_file, map< tstring, vector< byte_t
void BitExtractor::test( const tstring& in_file ) const {
BitInputArchive in_archive( *this, in_file );

CMyComPtr< ExtractCallback > extract_callback = new FileExtractCallback( *this, in_archive, in_file, L"" );
CMyComPtr< ExtractCallback > extract_callback = new FileExtractCallback( *this, in_archive, in_file, L"", true );
in_archive.test( extract_callback );
}
17 changes: 11 additions & 6 deletions src/fileextractcallback.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,12 @@ using namespace bit7z;
FileExtractCallback::FileExtractCallback( const BitArchiveHandler& handler,
const BitInputArchive& inputArchive,
fs::path inFilePath,
fs::path directoryPath )
fs::path directoryPath,
bool retainDirectories )
: ExtractCallback( handler, inputArchive ),
mInFilePath( std::move( inFilePath ) ),
mDirectoryPath( std::move( directoryPath ) ),
mRetainDirectories( retainDirectories ),
mProcessedFileInfo() {}

//TODO: clean and optimize!
Expand All @@ -62,6 +64,9 @@ STDMETHODIMP FileExtractCallback::GetStream( UInt32 index,
filePath = !mInFilePath.empty() ? mInFilePath.stem() : fs::path( kEmptyFileAlias );
} else if ( prop.isString() ) {
filePath = fs::path( prop.getString() );
if ( !mRetainDirectories ) {
filePath = filePath.filename();
}
} else {
return E_FAIL;
}
Expand Down Expand Up @@ -108,10 +113,7 @@ STDMETHODIMP FileExtractCallback::GetStream( UInt32 index,

mDiskFilePath = mDirectoryPath / filePath;

if ( mProcessedFileInfo.isDir ) {
error_code ec;
fs::create_directories( mDiskFilePath, ec );
} else {
if ( !mProcessedFileInfo.isDir ) { // File
if ( mHandler.fileCallback() ) {
mHandler.fileCallback()( mDiskFilePath.filename() );
}
Expand All @@ -132,9 +134,12 @@ STDMETHODIMP FileExtractCallback::GetStream( UInt32 index,

mFileOutStream = outStreamLoc;
*outStream = outStreamLoc.Detach();
} else if ( mRetainDirectories ) { // Directory, and we must retain it
error_code ec;
fs::create_directories( mDiskFilePath, ec );
}

return S_OK;
return S_OK;
} catch ( const BitException& ) {
return E_OUTOFMEMORY;
}
Expand Down

0 comments on commit 8ed8d8c

Please sign in to comment.