2015-01-03 21:26:13 +00:00
using System ;
using System.Text ;
using System.Collections.Generic ;
using System.IO ;
using System.IO.Compression ;
using System.Threading ;
using Microsoft.Win32 ;
using System.Windows.Forms ;
namespace Saviour_Backup_System
{
class compression
{
private static List < Thread > threads = new List < Thread > ( ) ;
private volatile static string Gdirectory ;
private volatile static string GfileName ;
2015-01-06 17:54:30 +00:00
public static void Compress ( string directory , string outputFile , DriveInfo drive ) {
2015-01-06 12:42:21 +00:00
GfileName = outputFile ; Gdirectory = directory ; //store as globals
2015-01-03 21:26:13 +00:00
compressToZip ( ) ;
2015-01-04 14:34:52 +00:00
if ( has7Zip ( ) ) {
2015-01-03 21:26:13 +00:00
DialogResult result = MessageBox . Show ( "7-Zip has been detected on your computer\nWould you like to use this instead?" , "Use 7-Zip?" , MessageBoxButtons . YesNo , MessageBoxIcon . Question ) ;
if ( result = = DialogResult . Yes ) {
threads . Add ( new Thread ( new ThreadStart ( compression7Zip ) ) ) ;
threads [ threads . Count ] . Start ( ) ;
return ;
}
2015-01-04 14:34:52 +00:00
} else {
//7z.exe interface code goes here!
2015-01-03 21:26:13 +00:00
}
2015-01-06 17:54:30 +00:00
MessageBox . Show ( "Compression for drive '" + drive . Name + "' has completed." , "Compression Completed" , MessageBoxButtons . OK , MessageBoxIcon . Information ) ;
2015-01-03 21:26:13 +00:00
}
private static void compression7Zip ( ) { //need to write this!
2015-01-06 12:42:21 +00:00
string fileToCompress = Gdirectory + GfileName + ".zip" ;
string outputFile = Gdirectory . Replace ( "\\Temp" , GfileName + ".SB" ) ;
MessageBox . Show ( "Compression of your drive has begun. Be aware this can take a lot of time to run" , "Compression Notification" , MessageBoxButtons . OK , MessageBoxIcon . Information ) ;
CompressFileLZMA ( fileToCompress , outputFile ) ;
2015-01-03 21:26:13 +00:00
}
private static void compressToZip ( ) {
2015-01-06 12:42:21 +00:00
ZipFile . CreateFromDirectory ( Gdirectory , Gdirectory + GfileName + ".zip" ) ; //create the zip file inside the temp directory still.
2015-01-03 21:26:13 +00:00
}
private static void CompressFileLZMA ( string inFile , string outFile )
{
SevenZip . Compression . LZMA . Encoder coder = new SevenZip . Compression . LZMA . Encoder ( ) ;
FileStream input = new FileStream ( inFile , FileMode . Open ) ;
FileStream output = new FileStream ( outFile , FileMode . Create ) ;
// Write the encoder properties
coder . WriteCoderProperties ( output ) ;
// Write the decompressed file size.
output . Write ( BitConverter . GetBytes ( input . Length ) , 0 , 8 ) ;
// Encode the file.
coder . Code ( input , output , input . Length , - 1 , null ) ;
output . Flush ( ) ;
output . Close ( ) ;
}
private static void DecompressFileLZMA ( string inFile , string outFile )
{
SevenZip . Compression . LZMA . Decoder coder = new SevenZip . Compression . LZMA . Decoder ( ) ;
FileStream input = new FileStream ( inFile , FileMode . Open ) ;
FileStream output = new FileStream ( outFile , FileMode . Create ) ;
// Read the decoder properties
byte [ ] properties = new byte [ 5 ] ;
input . Read ( properties , 0 , 5 ) ;
// Read in the decompress file size.
byte [ ] fileLengthBytes = new byte [ 8 ] ;
input . Read ( fileLengthBytes , 0 , 8 ) ;
long fileLength = BitConverter . ToInt64 ( fileLengthBytes , 0 ) ;
coder . SetDecoderProperties ( properties ) ;
coder . Code ( input , output , input . Length , fileLength , null ) ;
output . Flush ( ) ;
output . Close ( ) ;
}
private static bool has7Zip ( ) {
string path = ( string ) Registry . GetValue ( "HKEY_LOCAL_MACHINE\\SOFTWARE\\7-Zip" , "Path" , "NULL" ) ;
if ( path = = "NULL" ) { return false ; }
return File . Exists ( path + "7z.exe" ) ;
}
}
}