Skip to content
This repository was archived by the owner on Apr 9, 2024. It is now read-only.

Exception when calling CompressDirectory with searchPattern that returns empty file collection #203

@kborowinski

Description

@kborowinski

@squid-box SevenZipSharp throws an exception when calling CompressDirectory with flag IncludeEmptyDirectories set to false and an searchPattern that returns empty file collection:

Repro with PowerShell:

Add-Type -AssemblyName .\SevenZipSharp.dll
$c = [SevenZip.SevenZipCompressor]::new()
$c.IncludeEmptyDirectories = $false
mkdir test
cd test
mkdir test2
cd test2
echo test > test.ini
cd /
$c.CompressDirectory('C:\test', 'C:\test.7z', $null, '*.config', $true)
MethodInvocationException: Exception calling "CompressDirectory" with "5" argument(s): "Index was out of range. Must be non-negative and less than the size of the collection. (Parameter 'index')"

Error details:

PSMessageDetails      :
Exception             : System.Management.Automation.MethodInvocationException: Exception calling "CompressDirectory" with "5" argument(s): "Index was out of range. Must be non-negative
                        and less than the size of the collection. (Parameter 'index')"
                         ---> System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection. (Parameter 'index')
                           at SevenZip.SevenZipBase.ThrowException(CallbackBase handler, Exception[] e)
                           at SevenZip.SevenZipCompressor.CompressFilesEncrypted(Stream archiveStream, Int32 commonRootLength, String password, String[] fileFullNames)
                           at SevenZip.SevenZipCompressor.CompressDirectory(String directory, Stream archiveStream, String password, String searchPattern, Boolean recursion)
                           at SevenZip.SevenZipCompressor.CompressDirectory(String directory, String archiveName, String password, String searchPattern, Boolean recursion)
                           at CallSite.Target(Closure, CallSite, Object, String, String, Object, String, Boolean)
                           --- End of inner exception stack trace ---
                           at System.Management.Automation.ExceptionHandlingOps.ConvertToMethodInvocationException(Exception exception, Type typeToThrow, String methodName, Int32
                        numArgs, MemberInfo memberInfo)
                           at CallSite.Target(Closure, CallSite, Object, String, String, Object, String, Boolean)
                           at System.Dynamic.UpdateDelegates.UpdateAndExecute6[T0,T1,T2,T3,T4,T5,TRet](CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5)
                           at System.Management.Automation.Interpreter.DynamicInstruction`7.Run(InterpretedFrame frame)
                           at System.Management.Automation.Interpreter.EnterTryCatchFinallyInstruction.Run(InterpretedFrame frame)
TargetObject          :
CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
FullyQualifiedErrorId : ArgumentOutOfRangeException
ErrorDetails          :
InvocationInfo        : System.Management.Automation.InvocationInfo
ScriptStackTrace      : at <ScriptBlock>, <No file>: line 1
PipelineIterationInfo : {}

Explanation:

  1. CompressDirectory method calls CompressFilesEncrypted with an empty files collection, since no files with*.config extension where found in the directory
  2. CompressFilesEncrypted calls ProduceFileInfoArray with empty fileFullNames collection
  3. And that causes exception in ProduceFileInfoArray on line 581 when getting the commonRoot substring, since it's trying to index empty files array

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions