|
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using CBR.Core.Helpers;
using SevenZip;
using System.Text.RegularExpressions;
namespace CBR.Core.Files.Conversion
{
class RARImageReader : IReaderContract
{
public bool Read(string inputFileorFolder, string tempFolder, List<byte[]> imageBytes, List<string> imageNames, ContractParameters settings, ProgressDelegate progress)
{
SevenZipExtractor temp = null;
try
{
temp = ZipHelper.Instance.GetExtractor(inputFileorFolder);
//direct extract
if (!string.IsNullOrEmpty(tempFolder))
{
DirectoryHelper.Check(tempFolder);
temp.PreserveDirectoryStructure = false;
temp.ExtractArchive(tempFolder);
if( progress!= null )
progress(string.Format("{0} files extracted...", temp.ArchiveFileData.Count));
CheckFileNames(tempFolder);
}
else //to memory
{
foreach (ArchiveFileInfo fil in temp.ArchiveFileData)
{
if (!fil.IsDirectory && FileService.Instance.ImageExtension.Contains(Path.GetExtension(fil.FileName).ToUpper()))
{
using (MemoryStream stream = new MemoryStream())
{
temp.ExtractFile(fil.FileName, stream);
imageBytes.Add(stream.GetBuffer());
imageNames.Add(Path.GetFileName(fil.FileName));
}
}
}
}
}
catch (Exception err)
{
ExceptionHelper.Manage("RARImageReader:Read", err);
if (settings != null)
settings.Result = false;
return false;
}
finally
{
ZipHelper.Instance.ReleaseExtractor(temp);
}
return true;
}
private void CheckFileNames(string tempFolder)
{
Regex MyRegex = new Regex("\\d+",
RegexOptions.IgnoreCase
| RegexOptions.Multiline
| RegexOptions.CultureInvariant
| RegexOptions.IgnorePatternWhitespace
| RegexOptions.Compiled
);
foreach( string fileName in Directory.GetFiles( tempFolder, "*.*", SearchOption.TopDirectoryOnly ) )
{
FileInfo fi = new FileInfo(fileName);
MatchCollection ms = MyRegex.Matches(fi.Name);
Match m = ms[ms.Count-1];
string destFileName = fi.Name.Substring(0, m.Index) + string.Format("{0:0000}", Convert.ToInt32(m.Value)) + fi.Extension;
destFileName = Path.Combine(fi.DirectoryName, destFileName);
fi.CopyTo( destFileName, true );
fi.Delete();
}
}
}
}
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.
WPF and MVVM fan, I practice C # in all its forms from the beginning of the NET Framework without mentioning C ++ / MFC and other software packages such as databases, ASP, WCF, Web & Windows services, Application, and now Core and UWP.
In my wasted hours, I am guilty of having fathered C.B.R. and its cousins C.B.R. for WinRT and UWP on the Windows store.
But apart from that, I am a great handyman ... the house, a rocket stove to heat the jacuzzi and the last one: a wood oven for pizza, bread, and everything that goes inside
https://guillaumewaser.wordpress.com/
https://fouretcompagnie.wordpress.com/