private static void Decompress(List <string> sparseList, string outputPath) { FileStream output; try { output = File.Open(outputPath, FileMode.Create, FileAccess.ReadWrite, FileShare.None); output.SetLength(0); } catch (IOException) { Console.WriteLine("Cannot open " + outputPath); return; } catch (UnauthorizedAccessException) { Console.WriteLine("Cannot open {0} - Access Denied", outputPath); return; } Console.WriteLine("Output: {0}", outputPath); foreach (string sparsePath in sparseList) { FileStream input; try { input = File.Open(sparsePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); } catch (IOException) { Console.WriteLine("Cannot open " + sparsePath); return; } catch (UnauthorizedAccessException) { Console.WriteLine("Cannot open {0} - Access Denied", sparsePath); return; } Console.WriteLine("Processing: {0}", sparsePath); try { SparseDecompressionHelper.DecompressSparse(input, output); } catch (ArgumentException) { Console.WriteLine("Invalid Sparse Image Format"); return; } } output.Close(); }
private static void PrintSparseImageStatistics(string path) { FileStream stream; try { stream = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); } catch (IOException) { Console.WriteLine("Cannot open " + path); return; } catch (UnauthorizedAccessException) { Console.WriteLine("Cannot open {0} - Access Denied", path); return; } SparseHeader sparseHeader = SparseHeader.Read(stream); if (sparseHeader == null) { Console.WriteLine("Invalid Sparse Image Format"); return; } Console.WriteLine("Total Blocks: " + sparseHeader.TotalBlocks); Console.WriteLine("Total Chunks: " + sparseHeader.TotalChunks); long outputSize = 0; for (uint index = 0; index < sparseHeader.TotalChunks; index++) { ChunkHeader chunkHeader = ChunkHeader.Read(stream); Console.Write("Chunk type: {0}, size: {1}, total size: {2}", chunkHeader.ChunkType.ToString(), chunkHeader.ChunkSize, chunkHeader.TotalSize); int dataLength = (int)(chunkHeader.ChunkSize * sparseHeader.BlockSize); switch (chunkHeader.ChunkType) { case ChunkType.Raw: { SparseDecompressionHelper.ReadBytes(stream, dataLength); Console.WriteLine(); outputSize += dataLength; break; } case ChunkType.Fill: { byte[] fillBytes = SparseDecompressionHelper.ReadBytes(stream, 4); uint fill = LittleEndianConverter.ToUInt32(fillBytes, 0); Console.WriteLine(", value: 0x{0}", fill.ToString("X8")); outputSize += dataLength; break; } case ChunkType.DontCare: { Console.WriteLine(); break; } case ChunkType.CRC: { byte[] crcBytes = SparseDecompressionHelper.ReadBytes(stream, 4); uint crc = LittleEndianConverter.ToUInt32(crcBytes, 0); Console.WriteLine(", value: 0x{0}", crc.ToString("X8")); break; } default: { Console.WriteLine(); Console.WriteLine("Error: Invalid Chunk Type"); return; } } } stream.Close(); Console.WriteLine("Output size: {0}", outputSize); }