adamhathcock / sharpcompress

SharpCompress is a fully managed C# library to deal with many compression types and formats.
MIT License
2.27k stars 480 forks source link

System.NotSupportedException: 'Specified method is not supported.' On reader.MoveToNextEntry() while decompresing 7z #734

Closed GamingCity closed 1 year ago

GamingCity commented 1 year ago

Ive been getting this exception when i try to extract a 7zip file, it always start extracting files and get to the same point and throws the exception.

using (var archive = ArchiveFactory.Open("D:\test.7z")) { var reader = archive.ExtractAllEntries(); reader.EntryExtractionProgress += Reader_EntryExtractionProgress; while (reader.MoveToNextEntry()) <--Exception here { if (!reader.Entry.IsDirectory) reader.WriteEntryToDirectory("D:\temp", new ExtractionOptions() { ExtractFullPath = true, Overwrite = true }); } } void Reader_EntryExtractionProgress(object? sender, ReaderExtractionEventArgs e) { Console.WriteLine($"{e.Item.Key}: {e.ReaderProgress.PercentageRead} % read, {e.ReaderProgress.PercentageReadExact} % extracted"); }

Im using .net 6.0 on a simple console app. image

It seems to complain that it cant call reflection from this context, yet i dont understand why it manages to extract half the file before having this problem.

WriteAllToDirectory() also gives this exception.

Erior commented 1 year ago

Can be DeltaFilter #726, do you have the test file somewhere or can you build from this repo and test/report the CMethodId id value when it fails?

Shivansps commented 1 year ago

(sorry i posted the issue from the wrong account) Yeah this is the file, its extensionless but it is a 7z. https://cf.fsnebula.org/storage/38/aa/9cb349c96e4fc0d9e3b88d681642764af71cdf9476a7af6281caafdffafd

Erior commented 1 year ago

If you open it in 7z you can see that some entries are using Method Delta:X LZMA, The support for this was added recently and has not yet been released.

GamingCity commented 1 year ago

ok if this is fixed on main then ill close this for now.

GamingCity commented 1 year ago

OK, using master instead of the nuget package allowed to decompress a lot more files, but im still finding some of them fail to decompress... Like this one: https://cf.fsnebula.org/storage/7c/ba/0af317e290e891db84e4674bff95ded7ac5a10785292b59bca26381878d1

It seems that there is a Delta:1 and a Delta:2 but i dont think thats the issue as it seems to extract those files or most of those files just fine.

OK this is thwing the exception at deltafilter.cs, _distance is 0

public DeltaFilter(bool isEncoder, Stream baseStream, byte[] info) : base(isEncoder, baseStream, 1) { _distance = info[0]; _history = new byte[DISTANCE_MAX]; _position = 0;

  if (_distance < DISTANCE_MIN)
  {
      throw new NotSupportedException();
  }

}

Erior commented 1 year ago

Using the link, it actually fails on a file that 7zip says does not use the delta method, I will see if there are other conditions than the ID for the filter detection

Erior commented 1 year ago

and I was wrong, but it looks to be a noop setup, not applying the filter seems to be the right way, I'll look into it some more later

Erior commented 1 year ago

From my testing it looks like the check should be removed #735

Erior commented 1 year ago

@GamingCity please try master again, the changes has been merged.

GamingCity commented 1 year ago

Seems to be working fine now, thanks.

adamhathcock commented 1 year ago

Thanks both!