From ae5110d32ae6ad7daf579d068e48bf67e72a3b3a Mon Sep 17 00:00:00 2001 From: David Sungaila Date: Sat, 7 Dec 2024 03:54:11 +0100 Subject: [PATCH] Update Unity project --- .../Plugins/ICSharpCode.SharpZipLib.dll | Bin 0 -> 253952 bytes .../Plugins/ICSharpCode.SharpZipLib.dll.meta | 2 + .../Plugins/ICSharpCode.SharpZipLib.xml | 11330 ++++++++++++++++ .../Plugins/ICSharpCode.SharpZipLib.xml.meta | 7 + Misc/UnityPackage/Plugins/PDFtoZPL.dll | Bin 40856 -> 40824 bytes .../System.Threading.Tasks.Extensions.dll | Bin 0 -> 33008 bytes ...System.Threading.Tasks.Extensions.dll.meta | 2 + .../System.Threading.Tasks.Extensions.xml | 166 + ...System.Threading.Tasks.Extensions.xml.meta | 7 + Misc/UnityPackage/package.json | 8 +- 10 files changed, 11518 insertions(+), 4 deletions(-) create mode 100644 Misc/UnityPackage/Plugins/ICSharpCode.SharpZipLib.dll create mode 100644 Misc/UnityPackage/Plugins/ICSharpCode.SharpZipLib.dll.meta create mode 100644 Misc/UnityPackage/Plugins/ICSharpCode.SharpZipLib.xml create mode 100644 Misc/UnityPackage/Plugins/ICSharpCode.SharpZipLib.xml.meta create mode 100644 Misc/UnityPackage/Plugins/System.Threading.Tasks.Extensions.dll create mode 100644 Misc/UnityPackage/Plugins/System.Threading.Tasks.Extensions.dll.meta create mode 100644 Misc/UnityPackage/Plugins/System.Threading.Tasks.Extensions.xml create mode 100644 Misc/UnityPackage/Plugins/System.Threading.Tasks.Extensions.xml.meta diff --git a/Misc/UnityPackage/Plugins/ICSharpCode.SharpZipLib.dll b/Misc/UnityPackage/Plugins/ICSharpCode.SharpZipLib.dll new file mode 100644 index 0000000000000000000000000000000000000000..1048fcd2451da7b5dae68a873b7d19e1e35837a6 GIT binary patch literal 253952 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


0f%W8q|#us(@UaPMt6KMoE(pLil^&{h^ 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�mzu^KXJc)Z_N3b=F=qfE`nal0!7b)j^ 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 T(!OKw|2j?j-!1v;qrm?Q@pE)* literal 0 HcmV?d00001 diff --git a/Misc/UnityPackage/Plugins/ICSharpCode.SharpZipLib.dll.meta b/Misc/UnityPackage/Plugins/ICSharpCode.SharpZipLib.dll.meta new file mode 100644 index 0000000..9ca4fd4 --- /dev/null +++ b/Misc/UnityPackage/Plugins/ICSharpCode.SharpZipLib.dll.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a2d4749411d36e44cae5c406d9d21436 \ No newline at end of file diff --git a/Misc/UnityPackage/Plugins/ICSharpCode.SharpZipLib.xml b/Misc/UnityPackage/Plugins/ICSharpCode.SharpZipLib.xml new file mode 100644 index 0000000..807c2fb --- /dev/null +++ b/Misc/UnityPackage/Plugins/ICSharpCode.SharpZipLib.xml @@ -0,0 +1,11330 @@ + + + + ICSharpCode.SharpZipLib + + + + + An example class to demonstrate compression and decompression of BZip2 streams. + + + + + Decompress the input writing + uncompressed data to the output stream + + The readable stream containing data to decompress. + The output stream to receive the decompressed data. + Both streams are closed on completion if true. + + + + Compress the input stream sending + result data to output stream + + The readable stream to compress. + The output stream to receive the compressed data. + Both streams are closed on completion if true. + Block size acts as compression level (1 to 9) with 1 giving + the lowest compression and 9 the highest. + + + + Defines internal values for both compression and decompression + + + + + Random numbers used to randomise repetitive blocks + + + + + When multiplied by compression parameter (1-9) gives the block size for compression + 9 gives the best compression but uses the most memory. + + + + + Backend constant + + + + + Backend constant + + + + + Backend constant + + + + + Backend constant + + + + + Backend constant + + + + + Backend constant + + + + + Backend constant + + + + + Backend constant + + + + + Backend constant + + + + + BZip2Exception represents exceptions specific to BZip2 classes and code. + + + + + Initialise a new instance of . + + + + + Initialise a new instance of with its message string. + + A that describes the error. + + + + Initialise a new instance of . + + A that describes the error. + The that caused this exception. + + + + Initializes a new instance of the BZip2Exception class with serialized data. + + + The System.Runtime.Serialization.SerializationInfo that holds the serialized + object data about the exception being thrown. + + + The System.Runtime.Serialization.StreamingContext that contains contextual information + about the source or destination. + + + + + An input stream that decompresses files in the BZip2 format + + + + + Construct instance for reading from stream + + Data source + + + + Get/set flag indicating ownership of underlying stream. + When the flag is true will close the underlying stream also. + + + + + Gets a value indicating if the stream supports reading + + + + + Gets a value indicating whether the current stream supports seeking. + + + + + Gets a value indicating whether the current stream supports writing. + This property always returns false + + + + + Gets the length in bytes of the stream. + + + + + Gets the current position of the stream. + Setting the position is not supported and will throw a NotSupportException. + + Any attempt to set the position. + + + + Flushes the stream. + + + + + Set the streams position. This operation is not supported and will throw a NotSupportedException + + A byte offset relative to the parameter. + A value of type indicating the reference point used to obtain the new position. + The new position of the stream. + Any access + + + + Sets the length of this stream to the given value. + This operation is not supported and will throw a NotSupportedExceptionortedException + + The new length for the stream. + Any access + + + + Writes a block of bytes to this stream using data from a buffer. + This operation is not supported and will throw a NotSupportedException + + The buffer to source data from. + The offset to start obtaining data from. + The number of bytes of data to write. + Any access + + + + Writes a byte to the current position in the file stream. + This operation is not supported and will throw a NotSupportedException + + The value to write. + Any access + + + + Read a sequence of bytes and advances the read position by one byte. + + Array of bytes to store values in + Offset in array to begin storing data + The maximum number of bytes to read + The total number of bytes read into the buffer. This might be less + than the number of bytes requested if that number of bytes are not + currently available or zero if the end of the stream is reached. + + + + + Closes the stream, releasing any associated resources. + + + + + Read a byte from stream advancing position + + byte read or -1 on end of stream + + + + An output stream that compresses into the BZip2 format + including file header chars into another stream. + + + + + Construct a default output stream with maximum block size + + The stream to write BZip data onto. + + + + Initialise a new instance of the + for the specified stream, using the given blocksize. + + The stream to write compressed data to. + The block size to use. + + Valid block sizes are in the range 1..9, with 1 giving + the lowest compression and 9 the highest. + + + + + Ensures that resources are freed and other cleanup operations + are performed when the garbage collector reclaims the BZip2OutputStream. + + + + + Gets or sets a flag indicating ownership of underlying stream. + When the flag is true will close the underlying stream also. + + The default value is true. + + + + Gets a value indicating whether the current stream supports reading + + + + + Gets a value indicating whether the current stream supports seeking + + + + + Gets a value indicating whether the current stream supports writing + + + + + Gets the length in bytes of the stream + + + + + Gets or sets the current position of this stream. + + + + + Sets the current position of this stream to the given value. + + The point relative to the offset from which to being seeking. + The reference point from which to begin seeking. + The new position in the stream. + + + + Sets the length of this stream to the given value. + + The new stream length. + + + + Read a byte from the stream advancing the position. + + The byte read cast to an int; -1 if end of stream. + + + + Read a block of bytes + + The buffer to read into. + The offset in the buffer to start storing data at. + The maximum number of bytes to read. + The total number of bytes read. This might be less than the number of bytes + requested if that number of bytes are not currently available, or zero + if the end of the stream is reached. + + + + Write a block of bytes to the stream + + The buffer containing data to write. + The offset of the first byte to write. + The number of bytes to write. + + + + Write a byte to the stream. + + The byte to write to the stream. + + + + Get the number of bytes written to output. + + + + + Get the number of bytes written to the output. + + + + + Releases the unmanaged resources used by the and optionally releases the managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Flush output buffers + + + + + Computes Adler32 checksum for a stream of data. An Adler32 + checksum is not as reliable as a CRC32 checksum, but a lot faster to + compute. + + The specification for Adler32 may be found in RFC 1950. + ZLIB Compressed Data Format Specification version 3.3) + + + From that document: + + "ADLER32 (Adler-32 checksum) + This contains a checksum value of the uncompressed data + (excluding any dictionary data) computed according to Adler-32 + algorithm. This algorithm is a 32-bit extension and improvement + of the Fletcher algorithm, used in the ITU-T X.224 / ISO 8073 + standard. + + Adler-32 is composed of two sums accumulated per byte: s1 is + the sum of all bytes, s2 is the sum of all s1 values. Both sums + are done modulo 65521. s1 is initialized to 1, s2 to zero. The + Adler-32 checksum is stored as s2*65536 + s1 in most- + significant-byte first (network) order." + + "8.2. The Adler-32 algorithm + + The Adler-32 algorithm is much faster than the CRC32 algorithm yet + still provides an extremely low probability of undetected errors. + + The modulo on unsigned long accumulators can be delayed for 5552 + bytes, so the modulo operation time is negligible. If the bytes + are a, b, c, the second sum is 3a + 2b + c + 3, and so is position + and order sensitive, unlike the first sum, which is just a + checksum. That 65521 is prime is important to avoid a possible + large class of two-byte errors that leave the check unchanged. + (The Fletcher checksum uses 255, which is not prime and which also + makes the Fletcher check insensitive to single byte changes 0 - + 255.) + + The sum s1 is initialized to 1 instead of zero to make the length + of the sequence part of s2, so that the length does not have to be + checked separately. (Any sequence of zeroes has a Fletcher + checksum of zero.)" + + + + + + + largest prime smaller than 65536 + + + + + The CRC data checksum so far. + + + + + Initialise a default instance of + + + + + Resets the Adler32 data checksum as if no update was ever called. + + + + + Returns the Adler32 data checksum computed so far. + + + + + Updates the checksum with the byte b. + + + The data value to add. The high byte of the int is ignored. + + + + + Updates the Adler32 data checksum with the bytes taken from + a block of data. + + Contains the data to update the checksum with. + + + + Update Adler32 data checksum based on a portion of a block of data + + + The chunk of data to add + + + + + CRC-32 with unreversed data and reversed output + + + Generate a table for a byte-wise 32-bit CRC calculation on the polynomial: + x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x^1+x^0. + + Polynomials over GF(2) are represented in binary, one bit per coefficient, + with the lowest powers in the most significant bit. Then adding polynomials + is just exclusive-or, and multiplying a polynomial by x is a right shift by + one. If we call the above polynomial p, and represent a byte as the + polynomial q, also with the lowest power in the most significant bit (so the + byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, + where a mod b means the remainder after dividing a by b. + + This calculation is done using the shift-register method of multiplying and + taking the remainder. The register is initialized to zero, and for each + incoming bit, x^32 is added mod p to the register if the bit is a one (where + x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by + x (which is shifting right by one and adding x^32 mod p if the bit shifted + out is a one). We start with the highest power (least significant bit) of + q and repeat for all eight bits of q. + + This implementation uses sixteen lookup tables stored in one linear array + to implement the slicing-by-16 algorithm, a variant of the slicing-by-8 + algorithm described in this Intel white paper: + + https://web.archive.org/web/20120722193753/http://download.intel.com/technology/comms/perfnet/download/slicing-by-8.pdf + + The first lookup table is simply the CRC of all possible eight bit values. + Each successive lookup table is derived from the original table generated + by Sarwate's algorithm. Slicing a 16-bit input and XORing the outputs + together will produce the same output as a byte-by-byte CRC loop with + fewer arithmetic and bit manipulation operations, at the cost of increased + memory consumed by the lookup tables. (Slicing-by-16 requires a 16KB table, + which is still small enough to fit in most processors' L1 cache.) + + + + + The CRC data checksum so far. + + + + + Initialise a default instance of + + + + + Resets the CRC data checksum as if no update was ever called. + + + + + Returns the CRC data checksum computed so far. + + Reversed Out = true + + + + Updates the checksum with the int bval. + + + the byte is taken as the lower 8 bits of bval + + Reversed Data = false + + + + Updates the CRC data checksum with the bytes taken from + a block of data. + + Contains the data to update the CRC with. + + + + Update CRC data checksum based on a portion of a block of data + + + The chunk of data to add + + + + + Internal helper function for updating a block of data using slicing. + + The array containing the data to add + Range start for (inclusive) + The number of bytes to checksum starting from + + + + A non-inlined function for updating data that doesn't fit in a 16-byte + block. We don't expect to enter this function most of the time, and when + we do we're not here for long, so disabling inlining here improves + performance overall. + + The array containing the data to add + Range start for (inclusive) + Range end for (exclusive) + + + + CRC-32 with reversed data and unreversed output + + + Generate a table for a byte-wise 32-bit CRC calculation on the polynomial: + x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x^1+x^0. + + Polynomials over GF(2) are represented in binary, one bit per coefficient, + with the lowest powers in the most significant bit. Then adding polynomials + is just exclusive-or, and multiplying a polynomial by x is a right shift by + one. If we call the above polynomial p, and represent a byte as the + polynomial q, also with the lowest power in the most significant bit (so the + byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, + where a mod b means the remainder after dividing a by b. + + This calculation is done using the shift-register method of multiplying and + taking the remainder. The register is initialized to zero, and for each + incoming bit, x^32 is added mod p to the register if the bit is a one (where + x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by + x (which is shifting right by one and adding x^32 mod p if the bit shifted + out is a one). We start with the highest power (least significant bit) of + q and repeat for all eight bits of q. + + This implementation uses sixteen lookup tables stored in one linear array + to implement the slicing-by-16 algorithm, a variant of the slicing-by-8 + algorithm described in this Intel white paper: + + https://web.archive.org/web/20120722193753/http://download.intel.com/technology/comms/perfnet/download/slicing-by-8.pdf + + The first lookup table is simply the CRC of all possible eight bit values. + Each successive lookup table is derived from the original table generated + by Sarwate's algorithm. Slicing a 16-bit input and XORing the outputs + together will produce the same output as a byte-by-byte CRC loop with + fewer arithmetic and bit manipulation operations, at the cost of increased + memory consumed by the lookup tables. (Slicing-by-16 requires a 16KB table, + which is still small enough to fit in most processors' L1 cache.) + + + + + The CRC data checksum so far. + + + + + Initialise a default instance of + + + + + Resets the CRC data checksum as if no update was ever called. + + + + + Returns the CRC data checksum computed so far. + + Reversed Out = false + + + + Updates the checksum with the int bval. + + + the byte is taken as the lower 8 bits of bval + + Reversed Data = true + + + + Updates the CRC data checksum with the bytes taken from + a block of data. + + Contains the data to update the CRC with. + + + + Update CRC data checksum based on a portion of a block of data + + + The chunk of data to add + + + + + Internal helper function for updating a block of data using slicing. + + The array containing the data to add + Range start for (inclusive) + The number of bytes to checksum starting from + + + + A non-inlined function for updating data that doesn't fit in a 16-byte + block. We don't expect to enter this function most of the time, and when + we do we're not here for long, so disabling inlining here improves + performance overall. + + The array containing the data to add + Range start for (inclusive) + Range end for (exclusive) + + + + The number of slicing lookup tables to generate. + + + + + Generates multiple CRC lookup tables for a given polynomial, stored + in a linear array of uints. The first block (i.e. the first 256 + elements) is the same as the byte-by-byte CRC lookup table. + + The generating CRC polynomial + Whether the polynomial is in reversed bit order + A linear array of 256 * elements + + This table could also be generated as a rectangular array, but the + JIT compiler generates slower code than if we use a linear array. + Known issue, see: https://github.com/dotnet/runtime/issues/30275 + + + + + Mixes the first four bytes of input with + using normal ordering before calling . + + Array of data to checksum + Offset to start reading from + The table to use for slicing-by-16 lookup + Checksum state before this update call + A new unfinalized checksum value + + + Assumes input[offset]..input[offset + 15] are valid array indexes. + For performance reasons, this must be checked by the caller. + + + + + Mixes the first four bytes of input with + using reflected ordering before calling . + + Array of data to checksum + Offset to start reading from + The table to use for slicing-by-16 lookup + Checksum state before this update call + A new unfinalized checksum value + + + Assumes input[offset]..input[offset + 15] are valid array indexes. + For performance reasons, this must be checked by the caller. + + + + + A shared method for updating an unfinalized CRC checksum using slicing-by-16. + + Array of data to checksum + Offset to start reading from + The table to use for slicing-by-16 lookup + First byte of input after mixing with the old CRC + Second byte of input after mixing with the old CRC + Third byte of input after mixing with the old CRC + Fourth byte of input after mixing with the old CRC + A new unfinalized checksum value + + + Even though the first four bytes of input are fed in as arguments, + should be the same value passed to this + function's caller (either or + ). This method will get inlined + into both functions, so using the same offset produces faster code. + + + Because most processors running C# have some kind of instruction-level + parallelism, the order of XOR operations can affect performance. This + ordering assumes that the assembly code generated by the just-in-time + compiler will emit a bunch of arithmetic operations for checking array + bounds. Then it opportunistically XORs a1 and a2 to keep the processor + busy while those other parts of the pipeline handle the range check + calculations. + + + + + + Interface to compute a data checksum used by checked input/output streams. + A data checksum can be updated by one byte or with a byte array. After each + update the value of the current checksum can be returned by calling + getValue. The complete checksum object can also be reset + so it can be used again with new data. + + + + + Resets the data checksum as if no update was ever called. + + + + + Returns the data checksum computed so far. + + + + + Adds one byte to the data checksum. + + + the data value to add. The high byte of the int is ignored. + + + + + Updates the data checksum with the bytes taken from the array. + + + buffer an array of bytes + + + + + Adds the byte array to the data checksum. + + + The chunk of data to add + + + + Read an unsigned short in little endian byte order. + + + Read an int in little endian byte order. + + + Read a long in little endian byte order. + + + Write an unsigned short in little endian byte order. + + + + + + Write a ushort in little endian byte order. + + + + + + Write an int in little endian byte order. + + + + + + Write a uint in little endian byte order. + + + + + + Write a long in little endian byte order. + + + + + + Write a ulong in little endian byte order. + + + + + + + A MemoryPool that will return a Memory which is exactly the length asked for using the bufferSize parameter. + This is in contrast to the default ArrayMemoryPool which will return a Memory of equal size to the underlying + array which at least as long as the minBufferSize parameter. + Note: The underlying array may be larger than the slice of Memory + + + + + + Event arguments for scanning. + + + + + Initialise a new instance of + + The file or directory name. + + + + The file or directory name for this event. + + + + + Get set a value indicating if scanning should continue or not. + + + + + Event arguments during processing of a single file or directory. + + + + + Initialise a new instance of + + The file or directory name if known. + The number of bytes processed so far + The total number of bytes to process, 0 if not known + + + + The name for this event if known. + + + + + Get set a value indicating whether scanning should continue or not. + + + + + Get a percentage representing how much of the has been processed + + 0.0 to 100.0 percent; 0 if target is not known. + + + + The number of bytes processed so far + + + + + The number of bytes to process. + + Target may be 0 or negative if the value isnt known. + + + + Event arguments for directories. + + + + + Initialize an instance of . + + The name for this directory. + Flag value indicating if any matching files are contained in this directory. + + + + Get a value indicating if the directory contains any matching files or not. + + + + + Arguments passed when scan failures are detected. + + + + + Initialise a new instance of + + The name to apply. + The exception to use. + + + + The applicable name. + + + + + The applicable exception. + + + + + Get / set a value indicating whether scanning should continue. + + + + + Delegate invoked before starting to process a file. + + The source of the event + The event arguments. + + + + Delegate invoked during processing of a file or directory + + The source of the event + The event arguments. + + + + Delegate invoked when a file has been completely processed. + + The source of the event + The event arguments. + + + + Delegate invoked when a directory failure is detected. + + The source of the event + The event arguments. + + + + Delegate invoked when a file failure is detected. + + The source of the event + The event arguments. + + + + FileSystemScanner provides facilities scanning of files and directories. + + + + + Initialise a new instance of + + The file filter to apply when scanning. + + + + Initialise a new instance of + + The file filter to apply. + The directory filter to apply. + + + + Initialise a new instance of + + The file filter to apply. + + + + Initialise a new instance of + + The file filter to apply. + The directory filter to apply. + + + + Delegate to invoke when a directory is processed. + + + + + Delegate to invoke when a file is processed. + + + + + Delegate to invoke when processing for a file has finished. + + + + + Delegate to invoke when a directory failure is detected. + + + + + Delegate to invoke when a file failure is detected. + + + + + Raise the DirectoryFailure event. + + The directory name. + The exception detected. + + + + Raise the FileFailure event. + + The file name. + The exception detected. + + + + Raise the ProcessFile event. + + The file name. + + + + Raise the complete file event + + The file name + + + + Raise the ProcessDirectory event. + + The directory name. + Flag indicating if the directory has matching files. + + + + Scan a directory. + + The base directory to scan. + True to recurse subdirectories, false to scan a single directory. + + + + The file filter currently in use. + + + + + The directory filter currently in use. + + + + + Flag indicating if scanning should continue running. + + + + + INameTransform defines how file system names are transformed for use with archives, or vice versa. + + + + + Given a file name determine the transformed value. + + The name to transform. + The transformed file name. + + + + Given a directory name determine the transformed value. + + The name to transform. + The transformed directory name + + + + InvalidNameException is thrown for invalid names such as directory traversal paths and names with invalid characters + + + + + Initializes a new instance of the InvalidNameException class with a default error message. + + + + + Initializes a new instance of the InvalidNameException class with a specified error message. + + A message describing the exception. + + + + Initializes a new instance of the InvalidNameException class with a specified + error message and a reference to the inner exception that is the cause of this exception. + + A message describing the exception. + The inner exception + + + + Initializes a new instance of the InvalidNameException class with serialized data. + + + The System.Runtime.Serialization.SerializationInfo that holds the serialized + object data about the exception being thrown. + + + The System.Runtime.Serialization.StreamingContext that contains contextual information + about the source or destination. + + + + + Scanning filters support filtering of names. + + + + + Test a name to see if it 'matches' the filter. + + The name to test. + Returns true if the name matches the filter, false if it does not match. + + + + NameFilter is a string matching class which allows for both positive and negative + matching. + A filter is a sequence of independant regular expressions separated by semi-colons ';'. + To include a semi-colon it may be quoted as in \;. Each expression can be prefixed by a plus '+' sign or + a minus '-' sign to denote the expression is intended to include or exclude names. + If neither a plus or minus sign is found include is the default. + A given name is tested for inclusion before checking exclusions. Only names matching an include spec + and not matching an exclude spec are deemed to match the filter. + An empty filter matches any name. + + The following expression includes all name ending in '.dat' with the exception of 'dummy.dat' + "+\.dat$;-^dummy\.dat$" + + + + + Construct an instance based on the filter expression passed + + The filter expression. + + + + Test a string to see if it is a valid regular expression. + + The expression to test. + True if expression is a valid false otherwise. + + + + Test an expression to see if it is valid as a filter. + + The filter expression to test. + True if the expression is valid, false otherwise. + + + + Split a string into its component pieces + + The original string + Returns an array of values containing the individual filter elements. + + + + Convert this filter to its string equivalent. + + The string equivalent for this filter. + + + + Test a value to see if it is included by the filter. + + The value to test. + True if the value is included, false otherwise. + + + + Test a value to see if it is excluded by the filter. + + The value to test. + True if the value is excluded, false otherwise. + + + + Test a value to see if it matches the filter. + + The value to test. + True if the value matches, false otherwise. + + + + Compile this filter. + + + + + PathFilter filters directories and files using a form of regular expressions + by full path name. + See NameFilter for more detail on filtering. + + + + + Initialise a new instance of . + + The filter expression to apply. + + + + Test a name to see if it matches the filter. + + The name to test. + True if the name matches, false otherwise. + is used to get the full path before matching. + + + + ExtendedPathFilter filters based on name, file size, and the last write time of the file. + + Provides an example of how to customise filtering. + + + + Initialise a new instance of ExtendedPathFilter. + + The filter to apply. + The minimum file size to include. + The maximum file size to include. + + + + Initialise a new instance of ExtendedPathFilter. + + The filter to apply. + The minimum to include. + The maximum to include. + + + + Initialise a new instance of ExtendedPathFilter. + + The filter to apply. + The minimum file size to include. + The maximum file size to include. + The minimum to include. + The maximum to include. + + + + Test a filename to see if it matches the filter. + + The filename to test. + True if the filter matches, false otherwise. + The doesnt exist + + + + Get/set the minimum size/length for a file that will match this filter. + + The default value is zero. + value is less than zero; greater than + + + + Get/set the maximum size/length for a file that will match this filter. + + The default value is + value is less than zero or less than + + + + Get/set the minimum value that will match for this filter. + + Files with a LastWrite time less than this value are excluded by the filter. + + + + Get/set the maximum value that will match for this filter. + + Files with a LastWrite time greater than this value are excluded by the filter. + + + + NameAndSizeFilter filters based on name and file size. + + A sample showing how filters might be extended. + + + + Initialise a new instance of NameAndSizeFilter. + + The filter to apply. + The minimum file size to include. + The maximum file size to include. + + + + Test a filename to see if it matches the filter. + + The filename to test. + True if the filter matches, false otherwise. + + + + Get/set the minimum size for a file that will match this filter. + + + + + Get/set the maximum size for a file that will match this filter. + + + + + PathUtils provides simple utilities for handling paths. + + + + + Remove any path root present in the path + + A containing path information. + The path with the root removed if it was present; path otherwise. + + + + Returns a random file name in the users temporary directory, or in directory of if specified + + If specified, used as the base file name for the temporary file + Returns a temporary file name + + + + Provides simple " utilities. + + + + + Read from a ensuring all the required data is read. + + The stream to read. + The buffer to fill. + + + + + Read from a " ensuring all the required data is read. + + The stream to read data from. + The buffer to store data in. + The offset at which to begin storing data. + The number of bytes of data to store. + Required parameter is null + and or are invalid. + End of stream is encountered before all the data has been read. + + + + Read as much data as possible from a ", up to the requested number of bytes + + The stream to read data from. + The buffer to store data in. + The offset at which to begin storing data. + The number of bytes of data to store. + Required parameter is null + and or are invalid. + + + + Copy the contents of one to another. + + The stream to source data from. + The stream to write data to. + The buffer to use during copying. + + + + Copy the contents of one to another. + + The stream to source data from. + The stream to write data to. + The buffer to use during copying. + The progress handler delegate to use. + The minimum between progress updates. + The source for this event. + The name to use with the event. + This form is specialised for use within #Zip to support events during archive operations. + + + + Copy the contents of one to another. + + The stream to source data from. + The stream to write data to. + The buffer to use during copying. + The progress handler delegate to use. + The minimum between progress updates. + The source for this event. + The name to use with the event. + A predetermined fixed target value to use with progress updates. + If the value is negative the target is calculated by looking at the stream. + This form is specialised for use within #Zip to support events during archive operations. + + + + SharpZipBaseException is the base exception class for SharpZipLib. + All library exceptions are derived from this. + + NOTE: Not all exceptions thrown will be derived from this class. + A variety of other exceptions are possible for example + + + + Initializes a new instance of the SharpZipBaseException class. + + + + + Initializes a new instance of the SharpZipBaseException class with a specified error message. + + A message describing the exception. + + + + Initializes a new instance of the SharpZipBaseException class with a specified + error message and a reference to the inner exception that is the cause of this exception. + + A message describing the exception. + The inner exception + + + + Initializes a new instance of the SharpZipBaseException class with serialized data. + + + The System.Runtime.Serialization.SerializationInfo that holds the serialized + object data about the exception being thrown. + + + The System.Runtime.Serialization.StreamingContext that contains contextual information + about the source or destination. + + + + + Indicates that an error occurred during decoding of a input stream due to corrupt + data or (unintentional) library incompatibility. + + + + + Initializes a new instance of the StreamDecodingException with a generic message + + + + + Initializes a new instance of the StreamDecodingException class with a specified error message. + + A message describing the exception. + + + + Initializes a new instance of the StreamDecodingException class with a specified + error message and a reference to the inner exception that is the cause of this exception. + + A message describing the exception. + The inner exception + + + + Initializes a new instance of the StreamDecodingException class with serialized data. + + + The System.Runtime.Serialization.SerializationInfo that holds the serialized + object data about the exception being thrown. + + + The System.Runtime.Serialization.StreamingContext that contains contextual information + about the source or destination. + + + + + Indicates that the input stream could not decoded due to known library incompability or missing features + + + + + Initializes a new instance of the StreamUnsupportedException with a generic message + + + + + Initializes a new instance of the StreamUnsupportedException class with a specified error message. + + A message describing the exception. + + + + Initializes a new instance of the StreamUnsupportedException class with a specified + error message and a reference to the inner exception that is the cause of this exception. + + A message describing the exception. + The inner exception + + + + Initializes a new instance of the StreamUnsupportedException class with serialized data. + + + The System.Runtime.Serialization.SerializationInfo that holds the serialized + object data about the exception being thrown. + + + The System.Runtime.Serialization.StreamingContext that contains contextual information + about the source or destination. + + + + + Indicates that the input stream could not decoded due to the stream ending before enough data had been provided + + + + + Initializes a new instance of the UnexpectedEndOfStreamException with a generic message + + + + + Initializes a new instance of the UnexpectedEndOfStreamException class with a specified error message. + + A message describing the exception. + + + + Initializes a new instance of the UnexpectedEndOfStreamException class with a specified + error message and a reference to the inner exception that is the cause of this exception. + + A message describing the exception. + The inner exception + + + + Initializes a new instance of the UnexpectedEndOfStreamException class with serialized data. + + + The System.Runtime.Serialization.SerializationInfo that holds the serialized + object data about the exception being thrown. + + + The System.Runtime.Serialization.StreamingContext that contains contextual information + about the source or destination. + + + + + Indicates that a value was outside of the expected range when decoding an input stream + + + + + Initializes a new instance of the ValueOutOfRangeException class naming the causing variable + + Name of the variable, use: nameof() + + + + Initializes a new instance of the ValueOutOfRangeException class naming the causing variable, + it's current value and expected range. + + Name of the variable, use: nameof() + The invalid value + Expected maximum value + Expected minimum value + + + + Initializes a new instance of the ValueOutOfRangeException class naming the causing variable, + it's current value and expected range. + + Name of the variable, use: nameof() + The invalid value + Expected maximum value + Expected minimum value + + + + Initializes a new instance of the ValueOutOfRangeException class with serialized data. + + + The System.Runtime.Serialization.SerializationInfo that holds the serialized + object data about the exception being thrown. + + + The System.Runtime.Serialization.StreamingContext that contains contextual information + about the source or destination. + + + + + PkzipClassic embodies the classic or original encryption facilities used in Pkzip archives. + While it has been superseded by more recent and more powerful algorithms, its still in use and + is viable for preventing casual snooping + + + + + Generates new encryption keys based on given seed + + The seed value to initialise keys with. + A new key value. + + + + PkzipClassicCryptoBase provides the low level facilities for encryption + and decryption using the PkzipClassic algorithm. + + + + + Transform a single byte + + + The transformed value + + + + + Set the key schedule for encryption/decryption. + + The data use to set the keys from. + + + + Update encryption keys + + + + + Reset the internal state. + + + + + PkzipClassic CryptoTransform for encryption. + + + + + Initialise a new instance of + + The key block to use. + + + + Transforms the specified region of the specified byte array. + + The input for which to compute the transform. + The offset into the byte array from which to begin using data. + The number of bytes in the byte array to use as data. + The computed transform. + + + + Transforms the specified region of the input byte array and copies + the resulting transform to the specified region of the output byte array. + + The input for which to compute the transform. + The offset into the input byte array from which to begin using data. + The number of bytes in the input byte array to use as data. + The output to which to write the transform. + The offset into the output byte array from which to begin writing data. + The number of bytes written. + + + + Gets a value indicating whether the current transform can be reused. + + + + + Gets the size of the input data blocks in bytes. + + + + + Gets the size of the output data blocks in bytes. + + + + + Gets a value indicating whether multiple blocks can be transformed. + + + + + Cleanup internal state. + + + + + PkzipClassic CryptoTransform for decryption. + + + + + Initialise a new instance of . + + The key block to decrypt with. + + + + Transforms the specified region of the specified byte array. + + The input for which to compute the transform. + The offset into the byte array from which to begin using data. + The number of bytes in the byte array to use as data. + The computed transform. + + + + Transforms the specified region of the input byte array and copies + the resulting transform to the specified region of the output byte array. + + The input for which to compute the transform. + The offset into the input byte array from which to begin using data. + The number of bytes in the input byte array to use as data. + The output to which to write the transform. + The offset into the output byte array from which to begin writing data. + The number of bytes written. + + + + Gets a value indicating whether the current transform can be reused. + + + + + Gets the size of the input data blocks in bytes. + + + + + Gets the size of the output data blocks in bytes. + + + + + Gets a value indicating whether multiple blocks can be transformed. + + + + + Cleanup internal state. + + + + + Defines a wrapper object to access the Pkzip algorithm. + This class cannot be inherited. + + + + + Get / set the applicable block size in bits. + + The only valid block size is 8. + + + + Get an array of legal key sizes. + + + + + Generate an initial vector. + + + + + Get an array of legal block sizes. + + + + + Get / set the key value applicable. + + + + + Generate a new random key. + + + + + Create an encryptor. + + The key to use for this encryptor. + Initialisation vector for the new encryptor. + Returns a new PkzipClassic encryptor + + + + Create a decryptor. + + Keys to use for this new decryptor. + Initialisation vector for the new decryptor. + Returns a new decryptor. + + + + Encrypts and decrypts AES ZIP + + + Based on information from http://www.winzip.com/aes_info.htm + and http://www.gladman.me.uk/cryptography_technology/fileencrypt/ + + + + + Constructor + + The stream on which to perform the cryptographic transformation. + Instance of ZipAESTransform + Read or Write + + + + Reads a sequence of bytes from the current CryptoStream into buffer, + and advances the position within the stream by the number of bytes read. + + + + + + + + Writes a sequence of bytes to the current stream and advances the current position within this stream by the number of bytes written. + + An array of bytes. This method copies count bytes from buffer to the current stream. + The byte offset in buffer at which to begin copying bytes to the current stream. + The number of bytes to be written to the current stream. + + + + Transforms stream using AES in CTR mode + + + + + Constructor. + + Password string + Random bytes, length depends on encryption strength. + 128 bits = 8 bytes, 192 bits = 12 bytes, 256 bits = 16 bytes. + The encryption strength, in bytes eg 16 for 128 bits. + True when creating a zip, false when reading. For the AuthCode. + + + + + Implement the ICryptoTransform method. + + + + + Returns the 2 byte password verifier + + + + + Returns the 10 byte AUTH CODE to be checked or appended immediately following the AES data stream. + + + + + Transform final block and read auth code + + + + + Gets the size of the input data blocks in bytes. + + + + + Gets the size of the output data blocks in bytes. + + + + + Gets a value indicating whether multiple blocks can be transformed. + + + + + Gets a value indicating whether the current transform can be reused. + + + + + Cleanup internal state. + + + + + An example class to demonstrate compression and decompression of GZip streams. + + + + + Decompress the input writing + uncompressed data to the output stream + + The readable stream containing data to decompress. + The output stream to receive the decompressed data. + Both streams are closed on completion if true. + Input or output stream is null + + + + Compress the input stream sending + result data to output stream + + The readable stream to compress. + The output stream to receive the compressed data. + Both streams are closed on completion if true. + Deflate buffer size, minimum 512 + Deflate compression level, 0-9 + Input or output stream is null + Buffer Size is smaller than 512 + Compression level outside 0-9 + + + + This class contains constants used for gzip. + + + + + First GZip identification byte + + + + + Second GZip identification byte + + + + + Deflate compression method + + + + + Get the GZip specified encoding (CP-1252 if supported, otherwise ASCII) + + + + + GZip header flags + + + + + Text flag hinting that the file is in ASCII + + + + + CRC flag indicating that a CRC16 preceeds the data + + + + + Extra flag indicating that extra fields are present + + + + + Filename flag indicating that the original filename is present + + + + + Flag bit mask indicating that a comment is present + + + + + GZipException represents exceptions specific to GZip classes and code. + + + + + Initialise a new instance of . + + + + + Initialise a new instance of with its message string. + + A that describes the error. + + + + Initialise a new instance of . + + A that describes the error. + The that caused this exception. + + + + Initializes a new instance of the GZipException class with serialized data. + + + The System.Runtime.Serialization.SerializationInfo that holds the serialized + object data about the exception being thrown. + + + The System.Runtime.Serialization.StreamingContext that contains contextual information + about the source or destination. + + + + + This filter stream is used to decompress a "GZIP" format stream. + The "GZIP" format is described baseInputStream RFC 1952. + + author of the original java version : John Leuner + + This sample shows how to unzip a gzipped file + + using System; + using System.IO; + + using ICSharpCode.SharpZipLib.Core; + using ICSharpCode.SharpZipLib.GZip; + + class MainClass + { + public static void Main(string[] args) + { + using (Stream inStream = new GZipInputStream(File.OpenRead(args[0]))) + using (FileStream outStream = File.Create(Path.GetFileNameWithoutExtension(args[0]))) { + byte[] buffer = new byte[4096]; + StreamUtils.Copy(inStream, outStream, buffer); + } + } + } + + + + + + CRC-32 value for uncompressed data + + + + + Flag to indicate if we've read the GZIP header yet for the current member (block of compressed data). + This is tracked per-block as the file is parsed. + + + + + Flag to indicate if at least one block in a stream with concatenated blocks was read successfully. + This allows us to exit gracefully if downstream data is not in gzip format. + + + + + Creates a GZipInputStream with the default buffer size + + + The stream to read compressed data from (baseInputStream GZIP format) + + + + + Creates a GZIPInputStream with the specified buffer size + + + The stream to read compressed data from (baseInputStream GZIP format) + + + Size of the buffer to use + + + + + Reads uncompressed data into an array of bytes + + + The buffer to read uncompressed data into + + + The offset indicating where the data should be placed + + + The number of uncompressed bytes to be read + + Returns the number of bytes actually read. + + + + Retrieves the filename header field for the block last read + + + + + + This filter stream is used to compress a stream into a "GZIP" stream. + The "GZIP" format is described in RFC 1952. + + author of the original java version : John Leuner + + This sample shows how to gzip a file + + using System; + using System.IO; + + using ICSharpCode.SharpZipLib.GZip; + using ICSharpCode.SharpZipLib.Core; + + class MainClass + { + public static void Main(string[] args) + { + using (Stream s = new GZipOutputStream(File.Create(args[0] + ".gz"))) + using (FileStream fs = File.OpenRead(args[0])) { + byte[] writeData = new byte[4096]; + Streamutils.Copy(s, fs, writeData); + } + } + } + } + + + + + + CRC-32 value for uncompressed data + + + + + Creates a GzipOutputStream with the default buffer size + + + The stream to read data (to be compressed) from + + + + + Creates a GZipOutputStream with the specified buffer size + + + The stream to read data (to be compressed) from + + + Size of the buffer to use + + + + + Sets the active compression level (0-9). The new level will be activated + immediately. + + The compression level to set. + + Level specified is not supported. + + + + + + Get the current compression level. + + The current compression level. + + + + Original filename + + + + + If defined, will use this time instead of the current for the output header + + + + + Write given buffer to output updating crc + + Buffer to write + Offset of first byte in buf to write + Number of bytes to write + + + + Asynchronously write given buffer to output updating crc + + Buffer to write + Offset of first byte in buf to write + Number of bytes to write + The token to monitor for cancellation requests + + + + Writes remaining compressed output data to the output stream + and closes it. + + + + + Flushes the stream by ensuring the header is written, and then calling Flush + on the deflater. + + + + + + + + Finish compression and write any footer information required to stream + + + + + + + + This class contains constants used for LZW + + + + + Magic number found at start of LZW header: 0x1f 0x9d + + + + + Maximum number of bits per code + + + + + Mask for 'number of compression bits' + + + + + Indicates the presence of a fourth header byte + + + + + Reserved bits + + + + + Block compression: if table is full and compression rate is dropping, + clear the dictionary. + + + + + LZW file header size (in bytes) + + + + + Initial number of bits per code + + + + + LzwException represents exceptions specific to LZW classes and code. + + + + + Initialise a new instance of . + + + + + Initialise a new instance of with its message string. + + A that describes the error. + + + + Initialise a new instance of . + + A that describes the error. + The that caused this exception. + + + + Initializes a new instance of the LzwException class with serialized data. + + + The System.Runtime.Serialization.SerializationInfo that holds the serialized + object data about the exception being thrown. + + + The System.Runtime.Serialization.StreamingContext that contains contextual information + about the source or destination. + + + + + This filter stream is used to decompress a LZW format stream. + Specifically, a stream that uses the LZC compression method. + This file format is usually associated with the .Z file extension. + + See http://en.wikipedia.org/wiki/Compress + See http://wiki.wxwidgets.org/Development:_Z_File_Format + + The file header consists of 3 (or optionally 4) bytes. The first two bytes + contain the magic marker "0x1f 0x9d", followed by a byte of flags. + + Based on Java code by Ronald Tschalar, which in turn was based on the unlzw.c + code in the gzip package. + + This sample shows how to unzip a compressed file + + using System; + using System.IO; + + using ICSharpCode.SharpZipLib.Core; + using ICSharpCode.SharpZipLib.LZW; + + class MainClass + { + public static void Main(string[] args) + { + using (Stream inStream = new LzwInputStream(File.OpenRead(args[0]))) + using (FileStream outStream = File.Create(Path.GetFileNameWithoutExtension(args[0]))) { + byte[] buffer = new byte[4096]; + StreamUtils.Copy(inStream, outStream, buffer); + // OR + inStream.Read(buffer, 0, buffer.Length); + // now do something with the buffer + } + } + } + + + + + + Gets or sets a flag indicating ownership of underlying stream. + When the flag is true will close the underlying stream also. + + The default value is true. + + + + Creates a LzwInputStream + + + The stream to read compressed data from (baseInputStream LZW format) + + + + + See + + + + + + Reads decompressed data into the provided buffer byte array + + + The array to read and decompress data into + + + The offset indicating where the data should be placed + + + The number of bytes to decompress + + The number of bytes read. Zero signals the end of stream + + + + Moves the unread data in the buffer to the beginning and resets + the pointers. + + + + + + + Gets a value indicating whether the current stream supports reading + + + + + Gets a value of false indicating seeking is not supported for this stream. + + + + + Gets a value of false indicating that this stream is not writeable. + + + + + A value representing the length of the stream in bytes. + + + + + The current position within the stream. + Throws a NotSupportedException when attempting to set the position + + Attempting to set the position + + + + Flushes the baseInputStream + + + + + Sets the position within the current stream + Always throws a NotSupportedException + + The relative offset to seek to. + The defining where to seek from. + The new position in the stream. + Any access + + + + Set the length of the current stream + Always throws a NotSupportedException + + The new length value for the stream. + Any access + + + + Writes a sequence of bytes to stream and advances the current position + This method always throws a NotSupportedException + + The buffer containing data to write. + The offset of the first byte to write. + The number of bytes to write. + Any access + + + + Writes one byte to the current stream and advances the current position + Always throws a NotSupportedException + + The byte to write. + Any access + + + + Closes the input stream. When + is true the underlying stream is also closed. + + + + + Flag indicating wether this instance has been closed or not. + + + + + This exception is used to indicate that there is a problem + with a TAR archive header. + + + + + Initialise a new instance of the InvalidHeaderException class. + + + + + Initialises a new instance of the InvalidHeaderException class with a specified message. + + Message describing the exception cause. + + + + Initialise a new instance of InvalidHeaderException + + Message describing the problem. + The exception that is the cause of the current exception. + + + + Initializes a new instance of the InvalidHeaderException class with serialized data. + + + The System.Runtime.Serialization.SerializationInfo that holds the serialized + object data about the exception being thrown. + + + The System.Runtime.Serialization.StreamingContext that contains contextual information + about the source or destination. + + + + + Used to advise clients of 'events' while processing archives + + + + + The TarArchive class implements the concept of a + 'Tape Archive'. A tar archive is a series of entries, each of + which represents a file system object. Each entry in + the archive consists of a header block followed by 0 or more data blocks. + Directory entries consist only of the header block, and are followed by entries + for the directory's contents. File entries consist of a + header followed by the number of blocks needed to + contain the file's contents. All entries are written on + block boundaries. Blocks are 512 bytes long. + + TarArchives are instantiated in either read or write mode, + based upon whether they are instantiated with an InputStream + or an OutputStream. Once instantiated TarArchives read/write + mode can not be changed. + + There is currently no support for random access to tar archives. + However, it seems that subclassing TarArchive, and using the + TarBuffer.CurrentRecord and TarBuffer.CurrentBlock + properties, this would be rather trivial. + + + + + Client hook allowing detailed information to be reported during processing + + + + + Raises the ProgressMessage event + + The TarEntry for this event + message for this event. Null is no message + + + + Constructor for a default . + + + + + Initialise a TarArchive for input. + + The to use for input. + + + + Initialise a TarArchive for output. + + The to use for output. + + + + The InputStream based constructors create a TarArchive for the + purposes of extracting or listing a tar archive. Thus, use + these constructors when you wish to extract files from or list + the contents of an existing tar archive. + + The stream to retrieve archive data from. + Returns a new suitable for reading from. + + + + The InputStream based constructors create a TarArchive for the + purposes of extracting or listing a tar archive. Thus, use + these constructors when you wish to extract files from or list + the contents of an existing tar archive. + + The stream to retrieve archive data from. + The used for the Name fields, or null for ASCII only + Returns a new suitable for reading from. + + + + Create TarArchive for reading setting block factor + + A stream containing the tar archive contents + The blocking factor to apply + Returns a suitable for reading. + + + + Create TarArchive for reading setting block factor + + A stream containing the tar archive contents + The blocking factor to apply + The used for the Name fields, or null for ASCII only + Returns a suitable for reading. + + + + Create a TarArchive for writing to, using the default blocking factor + + The to write to + The used for the Name fields, or null for ASCII only + Returns a suitable for writing. + + + + Create a TarArchive for writing to, using the default blocking factor + + The to write to + Returns a suitable for writing. + + + + Create a tar archive for writing. + + The stream to write to + The blocking factor to use for buffering. + Returns a suitable for writing. + + + + Create a tar archive for writing. + + The stream to write to + The blocking factor to use for buffering. + The used for the Name fields, or null for ASCII only + Returns a suitable for writing. + + + + Set the flag that determines whether existing files are + kept, or overwritten during extraction. + + + If true, do not overwrite existing files. + + + + + Get/set the ascii file translation flag. If ascii file translation + is true, then the file is checked to see if it a binary file or not. + If the flag is true and the test indicates it is ascii text + file, it will be translated. The translation converts the local + operating system's concept of line ends into the UNIX line end, + '\n', which is the defacto standard for a TAR archive. This makes + text files compatible with UNIX. + + + + + Set the ascii file translation flag. + + + If true, translate ascii text files. + + + + + PathPrefix is added to entry names as they are written if the value is not null. + A slash character is appended after PathPrefix + + + + + RootPath is removed from entry names if it is found at the + beginning of the name. + + + + + Set user and group information that will be used to fill in the + tar archive's entry headers. This information is based on that available + for the linux operating system, which is not always available on other + operating systems. TarArchive allows the programmer to specify values + to be used in their place. + is set to true by this call. + + + The user id to use in the headers. + + + The user name to use in the headers. + + + The group id to use in the headers. + + + The group name to use in the headers. + + + + + Get or set a value indicating if overrides defined by SetUserInfo should be applied. + + If overrides are not applied then the values as set in each header will be used. + + + + Get the archive user id. + See ApplyUserInfoOverrides for detail + on how to allow setting values on a per entry basis. + + + The current user id. + + + + + Get the archive user name. + See ApplyUserInfoOverrides for detail + on how to allow setting values on a per entry basis. + + + The current user name. + + + + + Get the archive group id. + See ApplyUserInfoOverrides for detail + on how to allow setting values on a per entry basis. + + + The current group id. + + + + + Get the archive group name. + See ApplyUserInfoOverrides for detail + on how to allow setting values on a per entry basis. + + + The current group name. + + + + + Get the archive's record size. Tar archives are composed of + a series of RECORDS each containing a number of BLOCKS. + This allowed tar archives to match the IO characteristics of + the physical device being used. Archives are expected + to be properly "blocked". + + + The record size this archive is using. + + + + + Sets the IsStreamOwner property on the underlying stream. + Set this to false to prevent the Close of the TarArchive from closing the stream. + + + + + Close the archive. + + + + + Perform the "list" command for the archive contents. + + NOTE That this method uses the progress event to actually list + the contents. If the progress display event is not set, nothing will be listed! + + + + + Perform the "extract" command and extract the contents of the archive. + + + The destination directory into which to extract. + + + + + Perform the "extract" command and extract the contents of the archive. + + + The destination directory into which to extract. + + Allow parent directory traversal in file paths (e.g. ../file) + + + + Extract an entry from the archive. This method assumes that the + tarIn stream has been properly set with a call to GetNextEntry(). + + + The destination directory into which to extract. + + + The TarEntry returned by tarIn.GetNextEntry(). + + Allow parent directory traversal in file paths (e.g. ../file) + + + + Write an entry to the archive. This method will call the putNextEntry + and then write the contents of the entry, and finally call closeEntry() + for entries that are files. For directories, it will call putNextEntry(), + and then, if the recurse flag is true, process each entry that is a + child of the directory. + + + The TarEntry representing the entry to write to the archive. + + + If true, process the children of directory entries. + + + + + Write an entry to the archive. This method will call the putNextEntry + and then write the contents of the entry, and finally call closeEntry() + for entries that are files. For directories, it will call putNextEntry(), + and then, if the recurse flag is true, process each entry that is a + child of the directory. + + + The TarEntry representing the entry to write to the archive. + + + If true, process the children of directory entries. + + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Releases the unmanaged resources used by the FileStream and optionally releases the managed resources. + + true to release both managed and unmanaged resources; + false to release only unmanaged resources. + + + + Closes the archive and releases any associated resources. + + + + + Ensures that resources are freed and other cleanup operations are performed + when the garbage collector reclaims the . + + + + + The TarBuffer class implements the tar archive concept + of a buffered input stream. This concept goes back to the + days of blocked tape drives and special io devices. In the + C# universe, the only real function that this class + performs is to ensure that files have the correct "record" + size, or other tars will complain. +

+ You should never have a need to access this class directly. + TarBuffers are created by Tar IO Streams. +

+
+
+ + + The size of a block in a tar archive in bytes. + + This is 512 bytes. + + + + The number of blocks in a default record. + + + The default value is 20 blocks per record. + + + + + The size in bytes of a default record. + + + The default size is 10KB. + + + + + Get the record size for this buffer + + The record size in bytes. + This is equal to the multiplied by the + + + + Get the TAR Buffer's record size. + + The record size in bytes. + This is equal to the multiplied by the + + + + Get the Blocking factor for the buffer + + This is the number of blocks in each record. + + + + Get the TAR Buffer's block factor + + The block factor; the number of blocks per record. + + + + Construct a default TarBuffer + + + + + Create TarBuffer for reading with default BlockFactor + + Stream to buffer + A new suitable for input. + + + + Construct TarBuffer for reading inputStream setting BlockFactor + + Stream to buffer + Blocking factor to apply + A new suitable for input. + + + + Construct TarBuffer for writing with default BlockFactor + + output stream for buffer + A new suitable for output. + + + + Construct TarBuffer for writing Tar output to streams. + + Output stream to write to. + Blocking factor to apply + A new suitable for output. + + + + Initialization common to all constructors. + + + + + Determine if an archive block indicates End of Archive. End of + archive is indicated by a block that consists entirely of null bytes. + All remaining blocks for the record should also be null's + However some older tars only do a couple of null blocks (Old GNU tar for one) + and also partial records + + The data block to check. + Returns true if the block is an EOF block; false otherwise. + + + + Determine if an archive block indicates the End of an Archive has been reached. + End of archive is indicated by a block that consists entirely of null bytes. + All remaining blocks for the record should also be null's + However some older tars only do a couple of null blocks (Old GNU tar for one) + and also partial records + + The data block to check. + Returns true if the block is an EOF block; false otherwise. + + + + Skip over a block on the input stream. + + + + + Skip over a block on the input stream. + + + + + Read a block from the input stream. + + + The block of data read. + + + + + Read a record from data stream. + + + false if End-Of-File, else true. + + + + + Get the current block number, within the current record, zero based. + + Block numbers are zero based values + + + + + Gets or sets a flag indicating ownership of underlying stream. + When the flag is true will close the underlying stream also. + + The default value is true. + + + + Get the current block number, within the current record, zero based. + + + The current zero based block number. + + + The absolute block number = (record number * block factor) + block number. + + + + + Get the current record number. + + + The current zero based record number. + + + + + Get the current record number. + + + The current zero based record number. + + + + + Write a block of data to the archive. + + + The data to write to the archive. + + + + + + Write a block of data to the archive. + + + The data to write to the archive. + + + + + Write an archive record to the archive, where the record may be + inside of a larger array buffer. The buffer must be "offset plus + record size" long. + + + The buffer containing the record data to write. + + + The offset of the record data within buffer. + + + + + + Write an archive record to the archive, where the record may be + inside of a larger array buffer. The buffer must be "offset plus + record size" long. + + + The buffer containing the record data to write. + + + The offset of the record data within buffer. + + + + + Write a TarBuffer record to the archive. + + + + + WriteFinalRecord writes the current record buffer to output any unwritten data is present. + + Any trailing bytes are set to zero which is by definition correct behaviour + for the end of a tar stream. + + + + Close the TarBuffer. If this is an output buffer, also flush the + current block before closing. + + + + + Close the TarBuffer. If this is an output buffer, also flush the + current block before closing. + + + + + This class represents an entry in a Tar archive. It consists + of the entry's header, as well as the entry's File. Entries + can be instantiated in one of three ways, depending on how + they are to be used. +

+ TarEntries that are created from the header bytes read from + an archive are instantiated with the TarEntry( byte[] ) + constructor. These entries will be used when extracting from + or listing the contents of an archive. These entries have their + header filled in using the header bytes. They also set the File + to null, since they reference an archive entry not a file.

+

+ TarEntries that are created from files that are to be written + into an archive are instantiated with the CreateEntryFromFile(string) + pseudo constructor. These entries have their header filled in using + the File's information. They also keep a reference to the File + for convenience when writing entries.

+

+ Finally, TarEntries can be constructed from nothing but a name. + This allows the programmer to construct the entry by hand, for + instance when only an InputStream is available for writing to + the archive, and the header information is constructed from + other information. In this case the header fields are set to + defaults and the File is set to null.

+ +
+
+ + + Initialise a default instance of . + + + + + Construct an entry from an archive's header bytes. File is set + to null. + + + The header bytes from a tar archive entry. + + + + + Construct an entry from an archive's header bytes. File is set + to null. + + + The header bytes from a tar archive entry. + + + The used for the Name fields, or null for ASCII only + + + + + Construct a TarEntry using the header provided + + Header details for entry + + + + Clone this tar entry. + + Returns a clone of this entry. + + + + Construct an entry with only a name. + This allows the programmer to construct the entry's header "by hand". + + The name to use for the entry + Returns the newly created + + + + Construct an entry for a file. File is set to file, and the + header is constructed from information from the file. + + The file name that the entry represents. + Returns the newly created + + + + Determine if the two entries are equal. Equality is determined + by the header names being equal. + + The to compare with the current Object. + + True if the entries are equal; false if not. + + + + + Derive a Hash value for the current + + A Hash code for the current + + + + Determine if the given entry is a descendant of this entry. + Descendancy is determined by the name of the descendant + starting with this entry's name. + + + Entry to be checked as a descendent of this. + + + True if entry is a descendant of this. + + + + + Get this entry's header. + + + This entry's TarHeader. + + + + + Get/Set this entry's name. + + + + + Get/set this entry's user id. + + + + + Get/set this entry's group id. + + + + + Get/set this entry's user name. + + + + + Get/set this entry's group name. + + + + + Convenience method to set this entry's group and user ids. + + + This entry's new user id. + + + This entry's new group id. + + + + + Convenience method to set this entry's group and user names. + + + This entry's new user name. + + + This entry's new group name. + + + + + Get/Set the modification time for this entry + + + + + Get this entry's file. + + + This entry's file. + + + + + Get/set this entry's recorded file size. + + + + + Return true if this entry represents a directory, false otherwise + + + True if this entry is a directory. + + + + + Fill in a TarHeader with information from a File. + + + The TarHeader to fill in. + + + The file from which to get the header information. + + + + + Get entries for all files present in this entries directory. + If this entry doesnt represent a directory zero entries are returned. + + + An array of TarEntry's for this entry's children. + + + + + Write an entry's header information to a header buffer. + + + The tar entry header buffer to fill in. + + + + + Write an entry's header information to a header buffer. + + + The tar entry header buffer to fill in. + + + The used for the Name fields, or null for ASCII only + + + + + Convenience method that will modify an entry's name directly + in place in an entry header buffer byte array. + + + The buffer containing the entry header to modify. + + + The new name to place into the header buffer. + + + + + Convenience method that will modify an entry's name directly + in place in an entry header buffer byte array. + + + The buffer containing the entry header to modify. + + + The new name to place into the header buffer. + + + The used for the Name fields, or null for ASCII only + + + + + Fill in a TarHeader given only the entry's name. + + + The tar entry name. + + + + + The name of the file this entry represents or null if the entry is not based on a file. + + + + + The entry's header information. + + + + + TarException represents exceptions specific to Tar classes and code. + + + + + Initialise a new instance of . + + + + + Initialise a new instance of with its message string. + + A that describes the error. + + + + Initialise a new instance of . + + A that describes the error. + The that caused this exception. + + + + Initializes a new instance of the TarException class with serialized data. + + + The System.Runtime.Serialization.SerializationInfo that holds the serialized + object data about the exception being thrown. + + + The System.Runtime.Serialization.StreamingContext that contains contextual information + about the source or destination. + + + + + Reads the extended header of a Tar stream + + + + + Creates a new . + + + + + Read bytes from + + + + + + + Returns the parsed headers as key-value strings + + + + + This class encapsulates the Tar Entry Header used in Tar Archives. + The class also holds a number of tar constants, used mostly in headers. + + + The tar format and its POSIX successor PAX have a long history which makes for compatability + issues when creating and reading files. + + This is further complicated by a large number of programs with variations on formats + One common issue is the handling of names longer than 100 characters. + GNU style long names are currently supported. + + This is the ustar (Posix 1003.1) header. + + struct header + { + char t_name[100]; // 0 Filename + char t_mode[8]; // 100 Permissions + char t_uid[8]; // 108 Numerical User ID + char t_gid[8]; // 116 Numerical Group ID + char t_size[12]; // 124 Filesize + char t_mtime[12]; // 136 st_mtime + char t_chksum[8]; // 148 Checksum + char t_typeflag; // 156 Type of File + char t_linkname[100]; // 157 Target of Links + char t_magic[6]; // 257 "ustar" or other... + char t_version[2]; // 263 Version fixed to 00 + char t_uname[32]; // 265 User Name + char t_gname[32]; // 297 Group Name + char t_devmajor[8]; // 329 Major for devices + char t_devminor[8]; // 337 Minor for devices + char t_prefix[155]; // 345 Prefix for t_name + char t_mfill[12]; // 500 Filler up to 512 + }; + + + + + The length of the name field in a header buffer. + + + + + The length of the mode field in a header buffer. + + + + + The length of the user id field in a header buffer. + + + + + The length of the group id field in a header buffer. + + + + + The length of the checksum field in a header buffer. + + + + + Offset of checksum in a header buffer. + + + + + The length of the size field in a header buffer. + + + + + The length of the magic field in a header buffer. + + + + + The length of the version field in a header buffer. + + + + + The length of the modification time field in a header buffer. + + + + + The length of the user name field in a header buffer. + + + + + The length of the group name field in a header buffer. + + + + + The length of the devices field in a header buffer. + + + + + The length of the name prefix field in a header buffer. + + + + + The "old way" of indicating a normal file. + + + + + Normal file type. + + + + + Link file type. + + + + + Symbolic link file type. + + + + + Character device file type. + + + + + Block device file type. + + + + + Directory file type. + + + + + FIFO (pipe) file type. + + + + + Contiguous file type. + + + + + Posix.1 2001 global extended header + + + + + Posix.1 2001 extended header + + + + + Solaris access control list file type + + + + + GNU dir dump file type + This is a dir entry that contains the names of files that were in the + dir at the time the dump was made + + + + + Solaris Extended Attribute File + + + + + Inode (metadata only) no file content + + + + + Identifies the next file on the tape as having a long link name + + + + + Identifies the next file on the tape as having a long name + + + + + Continuation of a file that began on another volume + + + + + For storing filenames that dont fit in the main header (old GNU) + + + + + GNU Sparse file + + + + + GNU Tape/volume header ignore on extraction + + + + + The magic tag representing a POSIX tar archive. (would be written with a trailing NULL) + + + + + The magic tag representing an old GNU tar archive where version is included in magic and overwrites it + + + + + Initialise a default TarHeader instance + + + + + Get/set the name for this tar entry. + + Thrown when attempting to set the property to null. + + + + Get the name of this entry. + + The entry's name. + + + + Get/set the entry's Unix style permission mode. + + + + + The entry's user id. + + + This is only directly relevant to unix systems. + The default is zero. + + + + + Get/set the entry's group id. + + + This is only directly relevant to linux/unix systems. + The default value is zero. + + + + + Get/set the entry's size. + + Thrown when setting the size to less than zero. + + + + Get/set the entry's modification time. + + + The modification time is only accurate to within a second. + + Thrown when setting the date time to less than 1/1/1970. + + + + Get the entry's checksum. This is only valid/updated after writing or reading an entry. + + + + + Get value of true if the header checksum is valid, false otherwise. + + + + + Get/set the entry's type flag. + + + + + The entry's link name. + + Thrown when attempting to set LinkName to null. + + + + Get/set the entry's magic tag. + + Thrown when attempting to set Magic to null. + + + + The entry's version. + + Thrown when attempting to set Version to null. + + + + The entry's user name. + + + + + Get/set the entry's group name. + + + This is only directly relevant to unix systems. + + + + + Get/set the entry's major device number. + + + + + Get/set the entry's minor device number. + + + + + Create a new that is a copy of the current instance. + + A new that is a copy of the current instance. + + + + Parse TarHeader information from a header buffer. + + + The tar entry header buffer to get information from. + + + The used for the Name field, or null for ASCII only + + + + + Parse TarHeader information from a header buffer. + + + The tar entry header buffer to get information from. + + + + + 'Write' header information to buffer provided, updating the check sum. + + output buffer for header information + + + + 'Write' header information to buffer provided, updating the check sum. + + output buffer for header information + The used for the Name field, or null for ASCII only + + + + Get a hash code for the current object. + + A hash code for the current object. + + + + Determines if this instance is equal to the specified object. + + The object to compare with. + true if the objects are equal, false otherwise. + + + + Set defaults for values used when constructing a TarHeader instance. + + Value to apply as a default for userId. + Value to apply as a default for userName. + Value to apply as a default for groupId. + Value to apply as a default for groupName. + + + + Parse an octal string from a header buffer. + + The header buffer from which to parse. + The offset into the buffer from which to parse. + The number of header bytes to parse. + The long equivalent of the octal string. + + + + Parse a name from a header buffer. + + + The header buffer from which to parse. + + + The offset into the buffer from which to parse. + + + The number of header bytes to parse. + + + The name parsed. + + + + + Parse a name from a header buffer. + + + The header buffer from which to parse. + + + name encoding, or null for ASCII only + + + The name parsed. + + + + + Add name to the buffer as a collection of bytes + + The name to add + The offset of the first character + The buffer to add to + The index of the first byte to add + The number of characters/bytes to add + The next free index in the + + + + Add name to the buffer as a collection of bytes + + The name to add + The offset of the first character + The buffer to add to + The index of the first byte to add + The number of characters/bytes to add + The next free index in the + + + + Add name to the buffer as a collection of bytes + + The name to add + The offset of the first character + The buffer to add to + The index of the first byte to add + The number of characters/bytes to add + name encoding, or null for ASCII only + The next free index in the + + + + Add an entry name to the buffer + + + The name to add + + + The buffer to add to + + + The offset into the buffer from which to start adding + + + The number of header bytes to add + + + The index of the next free byte in the buffer + + TODO: what should be default behavior?(omit upper byte or UTF8?) + + + + Add an entry name to the buffer + + + The name to add + + + The buffer to add to + + + The offset into the buffer from which to start adding + + + The number of header bytes to add + + + + + The index of the next free byte in the buffer + + + + + Add an entry name to the buffer + + The name to add + The buffer to add to + The offset into the buffer from which to start adding + The number of header bytes to add + The index of the next free byte in the buffer + TODO: what should be default behavior?(omit upper byte or UTF8?) + + + + Add an entry name to the buffer + + The name to add + The buffer to add to + The offset into the buffer from which to start adding + The number of header bytes to add + + The index of the next free byte in the buffer + + + + Add a string to a buffer as a collection of ascii bytes. + + The string to add + The offset of the first character to add. + The buffer to add to. + The offset to start adding at. + The number of ascii characters to add. + The next free index in the buffer. + + + + Add a string to a buffer as a collection of ascii bytes. + + The string to add + The offset of the first character to add. + The buffer to add to. + The offset to start adding at. + The number of ascii characters to add. + String encoding, or null for ASCII only + The next free index in the buffer. + + + + Put an octal representation of a value into a buffer + + + the value to be converted to octal + + + buffer to store the octal string + + + The offset into the buffer where the value starts + + + The length of the octal string to create + + + The offset of the character next byte after the octal string + + + + + Put an octal or binary representation of a value into a buffer + + Value to be convert to octal + The buffer to update + The offset into the buffer to store the value + The length of the octal string. Must be 12. + Index of next byte + + + + Add the checksum integer to header buffer. + + + The header buffer to set the checksum for + The offset into the buffer for the checksum + The number of header bytes to update. + It's formatted differently from the other fields: it has 6 digits, a + null, then a space -- rather than digits, a space, then a null. + The final space is already there, from checksumming + + The modified buffer offset + + + + Compute the checksum for a tar entry header. + The checksum field must be all spaces prior to this happening + + The tar entry's header buffer. + The computed checksum. + + + + Make a checksum for a tar entry ignoring the checksum contents. + + The tar entry's header buffer. + The checksum for the buffer + + + + The TarInputStream reads a UNIX tar archive as an InputStream. + methods are provided to position at each successive entry in + the archive, and the read each entry as a normal input stream + using read(). + + + + + Construct a TarInputStream with default block factor + + stream to source data from + + + + Construct a TarInputStream with default block factor + + stream to source data from + The used for the Name fields, or null for ASCII only + + + + Construct a TarInputStream with user specified block factor + + stream to source data from + block factor to apply to archive + + + + Construct a TarInputStream with user specified block factor + + stream to source data from + block factor to apply to archive + The used for the Name fields, or null for ASCII only + + + + Gets or sets a flag indicating ownership of underlying stream. + When the flag is true will close the underlying stream also. + + The default value is true. + + + + Gets a value indicating whether the current stream supports reading + + + + + Gets a value indicating whether the current stream supports seeking + This property always returns false. + + + + + Gets a value indicating if the stream supports writing. + This property always returns false. + + + + + The length in bytes of the stream + + + + + Gets or sets the position within the stream. + Setting the Position is not supported and throws a NotSupportedExceptionNotSupportedException + + Any attempt to set position + + + + Flushes the baseInputStream + + + + + Flushes the baseInputStream + + + + + + Set the streams position. This operation is not supported and will throw a NotSupportedException + + The offset relative to the origin to seek to. + The to start seeking from. + The new position in the stream. + Any access + + + + Sets the length of the stream + This operation is not supported and will throw a NotSupportedException + + The new stream length. + Any access + + + + Writes a block of bytes to this stream using data from a buffer. + This operation is not supported and will throw a NotSupportedException + + The buffer containing bytes to write. + The offset in the buffer of the frist byte to write. + The number of bytes to write. + Any access + + + + Writes a byte to the current position in the file stream. + This operation is not supported and will throw a NotSupportedException + + The byte value to write. + Any access + + + + Reads a byte from the current tar archive entry. + + A byte cast to an int; -1 if the at the end of the stream. + + + + Reads bytes from the current tar archive entry. + + This method is aware of the boundaries of the current + entry in the archive and will deal with them appropriately + + + The buffer into which to place bytes read. + + + The offset at which to place bytes read. + + + The number of bytes to read. + + + + The number of bytes read, or 0 at end of stream/EOF. + + + + + Reads bytes from the current tar archive entry. + + This method is aware of the boundaries of the current + entry in the archive and will deal with them appropriately + + + The buffer into which to place bytes read. + + + The offset at which to place bytes read. + + + The number of bytes to read. + + + The number of bytes read, or 0 at end of stream/EOF. + + + + + Closes this stream. Calls the TarBuffer's close() method. + The underlying stream is closed by the TarBuffer. + + + + + Set the entry factory for this instance. + + The factory for creating new entries + + + + Get the record size being used by this stream's TarBuffer. + + + + + Get the record size being used by this stream's TarBuffer. + + + TarBuffer record size. + + + + + Get the available data that can be read from the current + entry in the archive. This does not indicate how much data + is left in the entire archive, only in the current entry. + This value is determined from the entry's size header field + and the amount of data already read from the current entry. + + + The number of available bytes for the current entry. + + + + + Skip bytes in the input buffer. This skips bytes in the + current entry's data, not the entire archive, and will + stop at the end of the current entry's data if the number + to skip extends beyond that point. + + + The number of bytes to skip. + + + + + + Skip bytes in the input buffer. This skips bytes in the + current entry's data, not the entire archive, and will + stop at the end of the current entry's data if the number + to skip extends beyond that point. + + + The number of bytes to skip. + + + + + Return a value of true if marking is supported; false otherwise. + + Currently marking is not supported, the return value is always false. + + + + Since we do not support marking just yet, we do nothing. + + + The limit to mark. + + + + + Since we do not support marking just yet, we do nothing. + + + + + Get the next entry in this tar archive. This will skip + over any remaining data in the current entry, if there + is one, and place the input stream at the header of the + next entry, and read the header and instantiate a new + TarEntry from the header bytes and return that entry. + If there are no more entries in the archive, null will + be returned to indicate that the end of the archive has + been reached. + + + The next TarEntry in the archive, or null. + + + + + Get the next entry in this tar archive. This will skip + over any remaining data in the current entry, if there + is one, and place the input stream at the header of the + next entry, and read the header and instantiate a new + TarEntry from the header bytes and return that entry. + If there are no more entries in the archive, null will + be returned to indicate that the end of the archive has + been reached. + + + The next TarEntry in the archive, or null. + + + + + Copies the contents of the current tar archive entry directly into + an output stream. + + + The OutputStream into which to write the entry's data. + + + + + + Copies the contents of the current tar archive entry directly into + an output stream. + + + The OutputStream into which to write the entry's data. + + + + + This interface is provided, along with the method , to allow + the programmer to have their own subclass instantiated for the + entries return from . + + + + + Create an entry based on name alone + + + Name of the new EntryPointNotFoundException to create + + created TarEntry or descendant class + + + + Create an instance based on an actual file + + + Name of file to represent in the entry + + + Created TarEntry or descendant class + + + + + Create a tar entry based on the header information passed + + + Buffer containing header information to create an entry from. + + + Created TarEntry or descendant class + + + + + Standard entry factory class creating instances of the class TarEntry + + + + + Construct standard entry factory class with ASCII name encoding + + + + + Construct standard entry factory with name encoding + + The used for the Name fields, or null for ASCII only + + + + Create a based on named + + The name to use for the entry + A new + + + + Create a tar entry with details obtained from file + + The name of the file to retrieve details from. + A new + + + + Create an entry based on details in header + + The buffer containing entry details. + A new + + + + Flag set when last block has been read + + + + + Size of this entry as recorded in header + + + + + Number of bytes read for this entry so far + + + + + Buffer used with calls to Read() + + + + + Working buffer + + + + + Current entry being read + + + + + Factory used to create TarEntry or descendant class instance + + + + + Stream used as the source of input data. + + + + + The TarOutputStream writes a UNIX tar archive as an OutputStream. + Methods are provided to put entries, and then write their contents + by writing to this stream using write(). + + public + + + + Construct TarOutputStream using default block factor + + stream to write to + + + + Construct TarOutputStream using default block factor + + stream to write to + The used for the Name fields, or null for ASCII only + + + + Construct TarOutputStream with user specified block factor + + stream to write to + blocking factor + + + + Construct TarOutputStream with user specified block factor + + stream to write to + blocking factor + The used for the Name fields, or null for ASCII only + + + + Gets or sets a flag indicating ownership of underlying stream. + When the flag is true will close the underlying stream also. + + The default value is true. + + + + true if the stream supports reading; otherwise, false. + + + + + true if the stream supports seeking; otherwise, false. + + + + + true if stream supports writing; otherwise, false. + + + + + length of stream in bytes + + + + + gets or sets the position within the current stream. + + + + + set the position within the current stream + + The offset relative to the to seek to + The to seek from. + The new position in the stream. + + + + Set the length of the current stream + + The new stream length. + + + + Read a byte from the stream and advance the position within the stream + by one byte or returns -1 if at the end of the stream. + + The byte value or -1 if at end of stream + + + + read bytes from the current stream and advance the position within the + stream by the number of bytes read. + + The buffer to store read bytes in. + The index into the buffer to being storing bytes at. + The desired number of bytes to read. + The total number of bytes read, or zero if at the end of the stream. + The number of bytes may be less than the count + requested if data is not available. + + + + read bytes from the current stream and advance the position within the + stream by the number of bytes read. + + The buffer to store read bytes in. + The index into the buffer to being storing bytes at. + The desired number of bytes to read. + + The total number of bytes read, or zero if at the end of the stream. + The number of bytes may be less than the count + requested if data is not available. + + + + All buffered data is written to destination + + + + + All buffered data is written to destination + + + + + Ends the TAR archive without closing the underlying OutputStream. + The result is that the EOF block of nulls is written. + + + + + Ends the TAR archive without closing the underlying OutputStream. + The result is that the EOF block of nulls is written. + + + + + Ends the TAR archive and closes the underlying OutputStream. + + This means that Finish() is called followed by calling the + TarBuffer's Close(). + + + + Get the record size being used by this stream's TarBuffer. + + + + + Get the record size being used by this stream's TarBuffer. + + + The TarBuffer record size. + + + + + Get a value indicating whether an entry is open, requiring more data to be written. + + + + + Put an entry on the output stream. This writes the entry's + header and positions the output stream for writing + the contents of the entry. Once this method is called, the + stream is ready for calls to write() to write the entry's + contents. Once the contents are written, closeEntry() + MUST be called to ensure that all buffered data + is completely written to the output stream. + + + The TarEntry to be written to the archive. + + + + + + Put an entry on the output stream. This writes the entry's + header and positions the output stream for writing + the contents of the entry. Once this method is called, the + stream is ready for calls to write() to write the entry's + contents. Once the contents are written, closeEntry() + MUST be called to ensure that all buffered data + is completely written to the output stream. + + + The TarEntry to be written to the archive. + + + + + Close an entry. This method MUST be called for all file + entries that contain data. The reason is that we must + buffer data written to the stream in order to satisfy + the buffer's block based writes. Thus, there may be + data fragments still being assembled that must be written + to the output stream before this entry is closed and the + next entry written. + + + + + Close an entry. This method MUST be called for all file + entries that contain data. The reason is that we must + buffer data written to the stream in order to satisfy + the buffer's block based writes. Thus, there may be + data fragments still being assembled that must be written + to the output stream before this entry is closed and the + next entry written. + + + + + Writes a byte to the current tar archive entry. + This method simply calls Write(byte[], int, int). + + + The byte to be written. + + + + + Writes bytes to the current tar archive entry. This method + is aware of the current entry and will throw an exception if + you attempt to write bytes past the length specified for the + current entry. The method is also (painfully) aware of the + record buffering required by TarBuffer, and manages buffers + that are not a multiple of recordsize in length, including + assembling records from small buffers. + + + The buffer to write to the archive. + + + The offset in the buffer from which to get bytes. + + + The number of bytes to write. + + + + + Writes bytes to the current tar archive entry. This method + is aware of the current entry and will throw an exception if + you attempt to write bytes past the length specified for the + current entry. The method is also (painfully) aware of the + record buffering required by TarBuffer, and manages buffers + that are not a multiple of recordsize in length, including + assembling records from small buffers. + + + The buffer to write to the archive. + + + The offset in the buffer from which to get bytes. + + + The number of bytes to write. + + + + + + Write an EOF (end of archive) block to the tar archive. + The end of the archive is indicated by two blocks consisting entirely of zero bytes. + + + + + bytes written for this entry so far + + + + + current 'Assembly' buffer length + + + + + Flag indicating whether this instance has been closed or not. + + + + + Size for the current entry + + + + + single block working buffer + + + + + 'Assembly' buffer used to assemble data before writing + + + + + TarBuffer used to provide correct blocking factor + + + + + the destination stream for the archive contents + + + + + name encoding + + + + + This is the Deflater class. The deflater class compresses input + with the deflate algorithm described in RFC 1951. It has several + compression levels and three different strategies described below. + + This class is not thread safe. This is inherent in the API, due + to the split of deflate and setInput. + + author of the original java version : Jochen Hoenicke + + + + + The best and slowest compression level. This tries to find very + long and distant string repetitions. + + + + + The worst but fastest compression level. + + + + + The default compression level. + + + + + This level won't compress at all but output uncompressed blocks. + + + + + The compression method. This is the only method supported so far. + There is no need to use this constant at all. + + + + + Compression Level as an enum for safer use + + + + + The best and slowest compression level. This tries to find very + long and distant string repetitions. + + + + + The worst but fastest compression level. + + + + + The default compression level. + + + + + This level won't compress at all but output uncompressed blocks. + + + + + The compression method. This is the only method supported so far. + There is no need to use this constant at all. + + + + + Creates a new deflater with default compression level. + + + + + Creates a new deflater with given compression level. + + + the compression level, a value between NO_COMPRESSION + and BEST_COMPRESSION, or DEFAULT_COMPRESSION. + + if lvl is out of range. + + + + Creates a new deflater with given compression level. + + + the compression level, a value between NO_COMPRESSION + and BEST_COMPRESSION. + + + true, if we should suppress the Zlib/RFC1950 header at the + beginning and the adler checksum at the end of the output. This is + useful for the GZIP/PKZIP formats. + + if lvl is out of range. + + + + Resets the deflater. The deflater acts afterwards as if it was + just created with the same compression level and strategy as it + had before. + + + + + Gets the current adler checksum of the data that was processed so far. + + + + + Gets the number of input bytes processed so far. + + + + + Gets the number of output bytes so far. + + + + + Flushes the current input block. Further calls to deflate() will + produce enough output to inflate everything in the current input + block. This is not part of Sun's JDK so I have made it package + private. It is used by DeflaterOutputStream to implement + flush(). + + + + + Finishes the deflater with the current input block. It is an error + to give more input after this method was called. This method must + be called to force all bytes to be flushed. + + + + + Returns true if the stream was finished and no more output bytes + are available. + + + + + Returns true, if the input buffer is empty. + You should then call setInput(). + NOTE: This method can also return true when the stream + was finished. + + + + + Sets the data which should be compressed next. This should be only + called when needsInput indicates that more input is needed. + If you call setInput when needsInput() returns false, the + previous input that is still pending will be thrown away. + The given byte array should not be changed, before needsInput() returns + true again. + This call is equivalent to setInput(input, 0, input.length). + + + the buffer containing the input data. + + + if the buffer was finished() or ended(). + + + + + Sets the data which should be compressed next. This should be + only called when needsInput indicates that more input is needed. + The given byte array should not be changed, before needsInput() returns + true again. + + + the buffer containing the input data. + + + the start of the data. + + + the number of data bytes of input. + + + if the buffer was Finish()ed or if previous input is still pending. + + + + + Sets the compression level. There is no guarantee of the exact + position of the change, but if you call this when needsInput is + true the change of compression level will occur somewhere near + before the end of the so far given input. + + + the new compression level. + + + + + Get current compression level + + Returns the current compression level + + + + Sets the compression strategy. Strategy is one of + DEFAULT_STRATEGY, HUFFMAN_ONLY and FILTERED. For the exact + position where the strategy is changed, the same as for + SetLevel() applies. + + + The new compression strategy. + + + + + Deflates the current input block with to the given array. + + + The buffer where compressed data is stored + + + The number of compressed bytes added to the output, or 0 if either + IsNeedingInput() or IsFinished returns true or length is zero. + + + + + Deflates the current input block to the given array. + + + Buffer to store the compressed data. + + + Offset into the output array. + + + The maximum number of bytes that may be stored. + + + The number of compressed bytes added to the output, or 0 if either + needsInput() or finished() returns true or length is zero. + + + If Finish() was previously called. + + + If offset or length don't match the array length. + + + + + Sets the dictionary which should be used in the deflate process. + This call is equivalent to setDictionary(dict, 0, dict.Length). + + + the dictionary. + + + if SetInput () or Deflate () were already called or another dictionary was already set. + + + + + Sets the dictionary which should be used in the deflate process. + The dictionary is a byte array containing strings that are + likely to occur in the data which should be compressed. The + dictionary is not stored in the compressed output, only a + checksum. To decompress the output you need to supply the same + dictionary again. + + + The dictionary data + + + The index where dictionary information commences. + + + The number of bytes in the dictionary. + + + If SetInput () or Deflate() were already called or another dictionary was already set. + + + + + Compression level. + + + + + If true no Zlib/RFC1950 headers or footers are generated + + + + + The current state. + + + + + The total bytes of output written. + + + + + The pending output. + + + + + The deflater engine. + + + + + This class contains constants used for deflation. + + + + + Set to true to enable debugging + + + + + Written to Zip file to identify a stored block + + + + + Identifies static tree in Zip file + + + + + Identifies dynamic tree in Zip file + + + + + Header flag indicating a preset dictionary for deflation + + + + + Sets internal buffer sizes for Huffman encoding + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Strategies for deflater + + + + + The default strategy + + + + + This strategy will only allow longer string repetitions. It is + useful for random data with a small character set. + + + + + This strategy will not look for string repetitions at all. It + only encodes with Huffman trees (which means, that more common + characters get a smaller encoding. + + + + + Low level compression engine for deflate algorithm which uses a 32K sliding window + with secondary compression from Huffman/Shannon-Fano codes. + + + + + Construct instance with pending buffer + Adler calculation will be performed + + + Pending buffer to use + + + + + Construct instance with pending buffer + + + Pending buffer to use + + + If no adler calculation should be performed + + + + + Deflate drives actual compression of data + + True to flush input buffers + Finish deflation with the current input. + Returns true if progress has been made. + + + + Sets input data to be deflated. Should only be called when NeedsInput() + returns true + + The buffer containing input data. + The offset of the first byte of data. + The number of bytes of data to use as input. + + + + Determines if more input is needed. + + Return true if input is needed via SetInput + + + + Set compression dictionary + + The buffer containing the dictionary data + The offset in the buffer for the first byte of data + The length of the dictionary data. + + + + Reset internal state + + + + + Reset Adler checksum + + + + + Get current value of Adler checksum + + + + + Total data processed + + + + + Get/set the deflate strategy + + + + + Set the deflate level (0-9) + + The value to set the level to. + + + + Fill the window + + + + + Inserts the current string in the head hash and returns the previous + value for this hash. + + The previous hash value + + + + Find the best (longest) string in the window matching the + string starting at strstart. + + Preconditions: + + strstart + DeflaterConstants.MAX_MATCH <= window.length. + + + True if a match greater than the minimum length is found + + + + Hashtable, hashing three characters to an index for window, so + that window[index]..window[index+2] have this hash code. + Note that the array should really be unsigned short, so you need + to and the values with 0xffff. + + + + + prev[index & WMASK] points to the previous index that has the + same hash code as the string starting at index. This way + entries with the same hash code are in a linked list. + Note that the array should really be unsigned short, so you need + to and the values with 0xffff. + + + + + Points to the current character in the window. + + + + + lookahead is the number of characters starting at strstart in + window that are valid. + So window[strstart] until window[strstart+lookahead-1] are valid + characters. + + + + + This array contains the part of the uncompressed stream that + is of relevance. The current character is indexed by strstart. + + + + + The current compression function. + + + + + The input data for compression. + + + + + The total bytes of input read. + + + + + The offset into inputBuf, where input data starts. + + + + + The end offset of the input data. + + + + + The adler checksum + + + + + This is the DeflaterHuffman class. + + This class is not thread safe. This is inherent in the API, due + to the split of Deflate and SetInput. + + author of the original java version : Jochen Hoenicke + + + + + Resets the internal state of the tree + + + + + Check that all frequencies are zero + + + At least one frequency is non-zero + + + + + Set static codes and length + + new codes + length for new codes + + + + Build dynamic codes and lengths + + + + + Get encoded length + + Encoded length, the sum of frequencies * lengths + + + + Scan a literal or distance tree to determine the frequencies of the codes + in the bit length tree. + + + + + Write tree values + + Tree to write + + + + Pending buffer to use + + + + + Construct instance with pending buffer + + Pending buffer to use + + + + Reset internal state + + + + + Write all trees to pending buffer + + The number/rank of treecodes to send. + + + + Compress current buffer writing data to pending buffer + + + + + Flush block to output with no compression + + Data to write + Index of first byte to write + Count of bytes to write + True if this is the last block + + + + Flush block to output with compression + + Data to flush + Index of first byte to flush + Count of bytes to flush + True if this is the last block + + + + Get value indicating if internal buffer is full + + true if buffer is full + + + + Add literal to buffer + + Literal value to add to buffer. + Value indicating internal buffer is full + + + + Add distance code and length to literal and distance trees + + Distance code + Length + Value indicating if internal buffer is full + + + + Reverse the bits of a 16 bit value. + + Value to reverse bits + Value with bits reversed + + + + This class stores the pending output of the Deflater. + + author of the original java version : Jochen Hoenicke + + + + + Construct instance with default buffer size + + + + + Inflater is used to decompress data that has been compressed according + to the "deflate" standard described in rfc1951. + + By default Zlib (rfc1950) headers and footers are expected in the input. + You can use constructor public Inflater(bool noHeader) passing true + if there is no Zlib header information + + The usage is as following. First you have to set some input with + SetInput(), then Inflate() it. If inflate doesn't + inflate any bytes there may be three reasons: +
    +
  • IsNeedingInput() returns true because the input buffer is empty. + You have to provide more input with SetInput(). + NOTE: IsNeedingInput() also returns true when, the stream is finished. +
  • +
  • IsNeedingDictionary() returns true, you have to provide a preset + dictionary with SetDictionary().
  • +
  • IsFinished returns true, the inflater has finished.
  • +
+ Once the first output byte is produced, a dictionary will not be + needed at a later stage. + + author of the original java version : John Leuner, Jochen Hoenicke +
+
+ + + Copy lengths for literal codes 257..285 + + + + + Extra bits for literal codes 257..285 + + + + + Copy offsets for distance codes 0..29 + + + + + Extra bits for distance codes + + + + + These are the possible states for an inflater + + + + + This variable contains the current state. + + + + + The adler checksum of the dictionary or of the decompressed + stream, as it is written in the header resp. footer of the + compressed stream. + Only valid if mode is DECODE_DICT or DECODE_CHKSUM. + + + + + The number of bits needed to complete the current state. This + is valid, if mode is DECODE_DICT, DECODE_CHKSUM, + DECODE_HUFFMAN_LENBITS or DECODE_HUFFMAN_DISTBITS. + + + + + True, if the last block flag was set in the last block of the + inflated stream. This means that the stream ends after the + current block. + + + + + The total number of inflated bytes. + + + + + The total number of bytes set with setInput(). This is not the + value returned by the TotalIn property, since this also includes the + unprocessed input. + + + + + This variable stores the noHeader flag that was given to the constructor. + True means, that the inflated stream doesn't contain a Zlib header or + footer. + + + + + Creates a new inflater or RFC1951 decompressor + RFC1950/Zlib headers and footers will be expected in the input data + + + + + Creates a new inflater. + + + True if no RFC1950/Zlib header and footer fields are expected in the input data + + This is used for GZIPed/Zipped input. + + For compatibility with + Sun JDK you should provide one byte of input more than needed in + this case. + + + + + Resets the inflater so that a new stream can be decompressed. All + pending input and output will be discarded. + + + + + Decodes a zlib/RFC1950 header. + + + False if more input is needed. + + + The header is invalid. + + + + + Decodes the dictionary checksum after the deflate header. + + + False if more input is needed. + + + + + Decodes the huffman encoded symbols in the input stream. + + + false if more input is needed, true if output window is + full or the current block ends. + + + if deflated stream is invalid. + + + + + Decodes the adler checksum after the deflate stream. + + + false if more input is needed. + + + If checksum doesn't match. + + + + + Decodes the deflated stream. + + + false if more input is needed, or if finished. + + + if deflated stream is invalid. + + + + + Sets the preset dictionary. This should only be called, if + needsDictionary() returns true and it should set the same + dictionary, that was used for deflating. The getAdler() + function returns the checksum of the dictionary needed. + + + The dictionary. + + + + + Sets the preset dictionary. This should only be called, if + needsDictionary() returns true and it should set the same + dictionary, that was used for deflating. The getAdler() + function returns the checksum of the dictionary needed. + + + The dictionary. + + + The index into buffer where the dictionary starts. + + + The number of bytes in the dictionary. + + + No dictionary is needed. + + + The adler checksum for the buffer is invalid + + + + + Sets the input. This should only be called, if needsInput() + returns true. + + + the input. + + + + + Sets the input. This should only be called, if needsInput() + returns true. + + + The source of input data + + + The index into buffer where the input starts. + + + The number of bytes of input to use. + + + No input is needed. + + + The index and/or count are wrong. + + + + + Inflates the compressed stream to the output buffer. If this + returns 0, you should check, whether IsNeedingDictionary(), + IsNeedingInput() or IsFinished() returns true, to determine why no + further output is produced. + + + the output buffer. + + + The number of bytes written to the buffer, 0 if no further + output can be produced. + + + if buffer has length 0. + + + if deflated stream is invalid. + + + + + Inflates the compressed stream to the output buffer. If this + returns 0, you should check, whether needsDictionary(), + needsInput() or finished() returns true, to determine why no + further output is produced. + + + the output buffer. + + + the offset in buffer where storing starts. + + + the maximum number of bytes to output. + + + the number of bytes written to the buffer, 0 if no further output can be produced. + + + if count is less than 0. + + + if the index and / or count are wrong. + + + if deflated stream is invalid. + + + + + Returns true, if the input buffer is empty. + You should then call setInput(). + NOTE: This method also returns true when the stream is finished. + + + + + Returns true, if a preset dictionary is needed to inflate the input. + + + + + Returns true, if the inflater has finished. This means, that no + input is needed and no output can be produced. + + + + + Gets the adler checksum. This is either the checksum of all + uncompressed bytes returned by inflate(), or if needsDictionary() + returns true (and thus no output was yet produced) this is the + adler checksum of the expected dictionary. + + + the adler checksum. + + + + + Gets the total number of output bytes returned by Inflate(). + + + the total number of output bytes. + + + + + Gets the total number of processed compressed input bytes. + + + The total number of bytes of processed input bytes. + + + + + Gets the number of unprocessed input bytes. Useful, if the end of the + stream is reached and you want to further process the bytes after + the deflate stream. + + + The number of bytes of the input which have not been processed. + + + + + Continue decoding header from until more bits are needed or decoding has been completed + + Returns whether decoding could be completed + + + + Get literal/length huffman tree, must not be used before has returned true + + If hader has not been successfully read by the state machine + + + + Get distance huffman tree, must not be used before has returned true + + If hader has not been successfully read by the state machine + + + + Huffman tree used for inflation + + + + + Literal length tree + + + + + Distance tree + + + + + Constructs a Huffman tree from the array of code lengths. + + + the array of code lengths + + + + + Reads the next symbol from input. The symbol is encoded using the + huffman tree. + + + input the input source. + + + the next symbol, or -1 if not enough input is available. + + + + + This class is general purpose class for writing data to a buffer. + + It allows you to write bits as well as bytes + Based on DeflaterPending.java + + author of the original java version : Jochen Hoenicke + + + + + Internal work buffer + + + + + construct instance using default buffer size of 4096 + + + + + construct instance using specified buffer size + + + size to use for internal buffer + + + + + Clear internal state/buffers + + + + + Write a byte to buffer + + + The value to write + + + + + Write a short value to buffer LSB first + + + The value to write. + + + + + write an integer LSB first + + The value to write. + + + + Write a block of data to buffer + + data to write + offset of first byte to write + number of bytes to write + + + + The number of bits written to the buffer + + + + + Align internal buffer on a byte boundary + + + + + Write bits to internal buffer + + source of bits + number of bits to write + + + + Write a short value to internal buffer most significant byte first + + value to write + + + + Indicates if buffer has been flushed + + + + + Flushes the pending buffer into the given output array. If the + output array is to small, only a partial flush is done. + + The output array. + The offset into output array. + The maximum number of bytes to store. + The number of bytes flushed. + + + + Convert internal buffer to byte array. + Buffer is empty on completion + + + The internal buffer contents converted to a byte array. + + + + + A special stream deflating or compressing the bytes that are + written to it. It uses a Deflater to perform actual deflating.
+ Authors of the original java version : Tom Tromey, Jochen Hoenicke +
+
+ + + Creates a new DeflaterOutputStream with a default Deflater and default buffer size. + + + the output stream where deflated output should be written. + + + + + Creates a new DeflaterOutputStream with the given Deflater and + default buffer size. + + + the output stream where deflated output should be written. + + + the underlying deflater. + + + + + Creates a new DeflaterOutputStream with the given Deflater and + buffer size. + + + The output stream where deflated output is written. + + + The underlying deflater to use + + + The buffer size in bytes to use when deflating (minimum value 512) + + + bufsize is less than or equal to zero. + + + baseOutputStream does not support writing + + + deflater instance is null + + + + + Finishes the stream by calling finish() on the deflater. + + + Not all input is deflated + + + + + Finishes the stream by calling finish() on the deflater. + + The that can be used to cancel the operation. + + Not all input is deflated + + + + + Gets or sets a flag indicating ownership of underlying stream. + When the flag is true will close the underlying stream also. + + The default value is true. + + + + Allows client to determine if an entry can be patched after its added + + + + + The CryptoTransform currently being used to encrypt the compressed data. + + + + + Returns the 10 byte AUTH CODE to be appended immediately following the AES data stream. + + + + + + + + Encrypt a block of data + + + Data to encrypt. NOTE the original contents of the buffer are lost + + + Offset of first byte in buffer to encrypt + + + Number of bytes in buffer to encrypt + + + + + Deflates everything in the input buffers. This will call + def.deflate() until all bytes from the input buffers + are processed. + + + + + Gets value indicating stream can be read from + + + + + Gets a value indicating if seeking is supported for this stream + This property always returns false + + + + + Get value indicating if this stream supports writing + + + + + Get current length of stream + + + + + Gets the current position within the stream. + + Any attempt to set position + + + + Sets the current position of this stream to the given value. Not supported by this class! + + The offset relative to the to seek. + The to seek from. + The new position in the stream. + Any access + + + + Sets the length of this stream to the given value. Not supported by this class! + + The new stream length. + Any access + + + + Read a byte from stream advancing position by one + + The byte read cast to an int. THe value is -1 if at the end of the stream. + Any access + + + + Read a block of bytes from stream + + The buffer to store read data in. + The offset to start storing at. + The maximum number of bytes to read. + The actual number of bytes read. Zero if end of stream is detected. + Any access + + + + Flushes the stream by calling Flush on the deflater and then + on the underlying stream. This ensures that all bytes are flushed. + + + + + + + + Calls and closes the underlying + stream when is true. + + + + + Get the Auth code for AES encrypted entries + + + + + Writes a single byte to the compressed output stream. + + + The byte value. + + + + + Writes bytes from an array to the compressed stream. + + + The byte array + + + The offset into the byte array where to start. + + + The number of bytes to write. + + + + + + + + This buffer is used temporarily to retrieve the bytes from the + deflater and write them to the underlying output stream. + + + + + The deflater which is used to deflate the stream. + + + + + Base stream the deflater depends on. + + + + + + + + An input buffer customised for use by + + + The buffer supports decryption of incoming data. + + + + + Initialise a new instance of with a default buffer size + + The stream to buffer. + + + + Initialise a new instance of + + The stream to buffer. + The size to use for the buffer + A minimum buffer size of 1KB is permitted. Lower sizes are treated as 1KB. + + + + Get the length of bytes in the + + + + + Get the contents of the raw data buffer. + + This may contain encrypted data. + + + + Get the number of useable bytes in + + + + + Get the contents of the clear text buffer. + + + + + Get/set the number of bytes available + + + + + Call passing the current clear text buffer contents. + + The inflater to set input for. + + + + Fill the buffer from the underlying input stream. + + + + + Read a buffer directly from the input stream + + The buffer to fill + Returns the number of bytes read. + + + + Read a buffer directly from the input stream + + The buffer to read into + The offset to start reading data into. + The number of bytes to read. + Returns the number of bytes read. + + + + Read clear text data from the input stream. + + The buffer to add data to. + The offset to start adding data at. + The number of bytes to read. + Returns the number of bytes actually read. + + + + Read a from the input stream. + + Returns the byte read. + + + + Read an in little endian byte order. + + The short value read case to an int. + + + + Read an in little endian byte order. + + The int value read. + + + + Read a in little endian byte order. + + The long value read. + + + + Get/set the to apply to any data. + + Set this value to null to have no transform applied. + + + + This filter stream is used to decompress data compressed using the "deflate" + format. The "deflate" format is described in RFC 1951. + + This stream may form the basis for other decompression filters, such + as the GZipInputStream. + + Author of the original java version : John Leuner. + + + + + Create an InflaterInputStream with the default decompressor + and a default buffer size of 4KB. + + + The InputStream to read bytes from + + + + + Create an InflaterInputStream with the specified decompressor + and a default buffer size of 4KB. + + + The source of input data + + + The decompressor used to decompress data read from baseInputStream + + + + + Create an InflaterInputStream with the specified decompressor + and the specified buffer size. + + + The InputStream to read bytes from + + + The decompressor to use + + + Size of the buffer to use + + + + + Gets or sets a flag indicating ownership of underlying stream. + When the flag is true will close the underlying stream also. + + The default value is true. + + + + Skip specified number of bytes of uncompressed data + + + Number of bytes to skip + + + The number of bytes skipped, zero if the end of + stream has been reached + + + The number of bytes to skip is less than or equal to zero. + + + + + Clear any cryptographic state. + + + + + Returns 0 once the end of the stream (EOF) has been reached. + Otherwise returns 1. + + + + + Fills the buffer with more data to decompress. + + + Stream ends early + + + + + Gets a value indicating whether the current stream supports reading + + + + + Gets a value of false indicating seeking is not supported for this stream. + + + + + Gets a value of false indicating that this stream is not writeable. + + + + + A value representing the length of the stream in bytes. + + + + + The current position within the stream. + Throws a NotSupportedException when attempting to set the position + + Attempting to set the position + + + + Flushes the baseInputStream + + + + + Sets the position within the current stream + Always throws a NotSupportedException + + The relative offset to seek to. + The defining where to seek from. + The new position in the stream. + Any access + + + + Set the length of the current stream + Always throws a NotSupportedException + + The new length value for the stream. + Any access + + + + Writes a sequence of bytes to stream and advances the current position + This method always throws a NotSupportedException + + The buffer containing data to write. + The offset of the first byte to write. + The number of bytes to write. + Any access + + + + Writes one byte to the current stream and advances the current position + Always throws a NotSupportedException + + The byte to write. + Any access + + + + Closes the input stream. When + is true the underlying stream is also closed. + + + + + Reads decompressed data into the provided buffer byte array + + + The array to read and decompress data into + + + The offset indicating where the data should be placed + + + The number of bytes to decompress + + The number of bytes read. Zero signals the end of stream + + Inflater needs a dictionary + + + + + Decompressor for this stream + + + + + Input buffer for this stream. + + + + + Base stream the inflater reads from. + + + + + The compressed size + + + + + Flag indicating whether this instance has been closed or not. + + + + + Contains the output from the Inflation process. + We need to have a window so that we can refer backwards into the output stream + to repeat stuff.
+ Author of the original java version : John Leuner +
+
+ + + Write a byte to this output window + + value to write + + if window is full + + + + + Append a byte pattern already in the window itself + + length of pattern to copy + distance from end of window pattern occurs + + If the repeated data overflows the window + + + + + Copy from input manipulator to internal window + + source of data + length of data to copy + the number of bytes copied + + + + Copy dictionary to window + + source dictionary + offset of start in source dictionary + length of dictionary + + If window isnt empty + + + + + Get remaining unfilled space in window + + Number of bytes left in window + + + + Get bytes available for output in window + + Number of bytes filled + + + + Copy contents of window to output + + buffer to copy to + offset to start at + number of bytes to count + The number of bytes copied + + If a window underflow occurs + + + + + Reset by clearing window so GetAvailable returns 0 + + + + + This class allows us to retrieve a specified number of bits from + the input buffer, as well as copy big byte blocks. + + It uses an int buffer to store up to 31 bits for direct + manipulation. This guarantees that we can get at least 16 bits, + but we only need at most 15, so this is all safe. + + There are some optimizations in this class, for example, you must + never peek more than 8 bits more than needed, and you must first + peek bits before you may drop them. This is not a general purpose + class but optimized for the behaviour of the Inflater. + + authors of the original java version : John Leuner, Jochen Hoenicke + + + + + Get the next sequence of bits but don't increase input pointer. bitCount must be + less or equal 16 and if this call succeeds, you must drop + at least n - 8 bits in the next call. + + The number of bits to peek. + + the value of the bits, or -1 if not enough bits available. */ + + + + + Tries to grab the next bits from the input and + sets to the value, adding . + + true if enough bits could be read, otherwise false + + + + Tries to grab the next bits from the input and + sets of to the value. + + true if enough bits could be read, otherwise false + + + + Drops the next n bits from the input. You should have called PeekBits + with a bigger or equal n before, to make sure that enough bits are in + the bit buffer. + + The number of bits to drop. + + + + Gets the next n bits and increases input pointer. This is equivalent + to followed by , except for correct error handling. + + The number of bits to retrieve. + + the value of the bits, or -1 if not enough bits available. + + + + + Gets the number of bits available in the bit buffer. This must be + only called when a previous PeekBits() returned -1. + + + the number of bits available. + + + + + Gets the number of bytes available. + + + The number of bytes available. + + + + + Skips to the next byte boundary. + + + + + Returns true when SetInput can be called + + + + + Copies bytes from input buffer to output buffer starting + at output[offset]. You have to make sure, that the buffer is + byte aligned. If not enough bytes are available, copies fewer + bytes. + + + The buffer to copy bytes to. + + + The offset in the buffer at which copying starts + + + The length to copy, 0 is allowed. + + + The number of bytes copied, 0 if no bytes were available. + + + Length is less than zero + + + Bit buffer isnt byte aligned + + + + + Resets state and empties internal buffers + + + + + Add more input for consumption. + Only call when IsNeedingInput returns true + + data to be input + offset of first byte of input + number of bytes of input to add. + + + + FastZipEvents supports all events applicable to FastZip operations. + + + + + Delegate to invoke when processing directories. + + + + + Delegate to invoke when processing files. + + + + + Delegate to invoke during processing of files. + + + + + Delegate to invoke when processing for a file has been completed. + + + + + Delegate to invoke when processing directory failures. + + + + + Delegate to invoke when processing file failures. + + + + + Raise the directory failure event. + + The directory causing the failure. + The exception for this event. + A boolean indicating if execution should continue or not. + + + + Fires the file failure handler delegate. + + The file causing the failure. + The exception for this failure. + A boolean indicating if execution should continue or not. + + + + Fires the ProcessFile delegate. + + The file being processed. + A boolean indicating if execution should continue or not. + + + + Fires the delegate + + The file whose processing has been completed. + A boolean indicating if execution should continue or not. + + + + Fires the process directory delegate. + + The directory being processed. + Flag indicating if the directory has matching files as determined by the current filter. + A of true if the operation should continue; false otherwise. + + + + The minimum timespan between events. + + The minimum period of time between events. + + The default interval is three seconds. + + + + FastZip provides facilities for creating and extracting zip files. + + + + + Defines the desired handling when overwriting files during extraction. + + + + + Prompt the user to confirm overwriting + + + + + Never overwrite files. + + + + + Always overwrite files. + + + + + Initialise a default instance of . + + + + + Initialise a new instance of using the specified + + The time setting to use when creating or extracting Zip entries. + Using TimeSetting.LastAccessTime[Utc] when + creating an archive will set the file time to the moment of reading. + + + + + Initialise a new instance of using the specified + + The time to set all values for created or extracted Zip Entries. + + + + Initialise a new instance of + + The events to use during operations. + + + + Get/set a value indicating whether empty directories should be created. + + + + + Get / set the password value. + + + + + Get / set the method of encrypting entries. + + + Only applies when is set. + Defaults to ZipCrypto for backwards compatibility purposes. + + + + + Get or set the active when creating Zip files. + + + + + + Get or set the active when creating Zip files. + + + + + Gets or sets the setting for Zip64 handling when writing. + + + The default value is dynamic which is not backwards compatible with old + programs and can cause problems with XP's built in compression which cant + read Zip64 archives. However it does avoid the situation were a large file + is added and cannot be completed correctly. + NOTE: Setting the size for entries before they are added is the best solution! + By default the EntryFactory used by FastZip will set the file size. + + + + + Get/set a value indicating whether file dates and times should + be restored when extracting files from an archive. + + The default value is false. + + + + Get/set a value indicating whether file attributes should + be restored during extract operations + + + + + Get/set the Compression Level that will be used + when creating the zip + + + + + Reflects the opposite of the internal , setting it to false overrides the encoding used for reading and writing zip entries + + + + Gets or sets the code page used for reading/writing zip file entries when unicode is disabled + + + + + + + Delegate called when confirming overwriting of files. + + + + + Create a zip file. + + The name of the zip file to create. + The directory to source files from. + True to recurse directories, false for no recursion. + The file filter to apply. + The directory filter to apply. + + + + Create a zip file/archive. + + The name of the zip file to create. + The directory to obtain files and directories from. + True to recurse directories, false for no recursion. + The file filter to apply. + + + + Create a zip archive sending output to the passed. + + The stream to write archive data to. + The directory to source files from. + True to recurse directories, false for no recursion. + The file filter to apply. + The directory filter to apply. + The is closed after creation. + + + + Create a zip archive sending output to the passed. + + The stream to write archive data to. + The directory to source files from. + True to recurse directories, false for no recursion. + The file filter to apply. + The directory filter to apply. + true to leave open after the zip has been created, false to dispose it. + + + + Create a zip file. + + The name of the zip file to create. + The directory to source files from. + True to recurse directories, false for no recursion. + The file filter to apply. + The directory filter to apply. + + + + Create a zip archive sending output to the passed. + + The stream to write archive data to. + The directory to source files from. + True to recurse directories, false for no recursion. + The file filter to apply. + The directory filter to apply. + true to leave open after the zip has been created, false to dispose it. + + + + Create a zip archive sending output to the passed. + + The stream to write archive data to. + The directory to source files from. + True to recurse directories, false for no recursion. + For performing the actual file system scan + true to leave open after the zip has been created, false to dispose it. + The is closed after creation. + + + + Extract the contents of a zip file. + + The zip file to extract from. + The directory to save extracted information in. + A filter to apply to files. + + + + Extract the contents of a zip file. + + The zip file to extract from. + The directory to save extracted information in. + The style of overwriting to apply. + A delegate to invoke when confirming overwriting. + A filter to apply to files. + A filter to apply to directories. + Flag indicating whether to restore the date and time for extracted files. + Allow parent directory traversal in file paths (e.g. ../file) + + + + Extract the contents of a zip file held in a stream. + + The seekable input stream containing the zip to extract from. + The directory to save extracted information in. + The style of overwriting to apply. + A delegate to invoke when confirming overwriting. + A filter to apply to files. + A filter to apply to directories. + Flag indicating whether to restore the date and time for extracted files. + Flag indicating whether the inputStream will be closed by this method. + Allow parent directory traversal in file paths (e.g. ../file) + + + + Defines factory methods for creating new values. + + + + + Create a for a file given its name + + The name of the file to create an entry for. + Returns a file entry based on the passed. + + + + Create a for a file given its name + + The name of the file to create an entry for. + If true get details from the file system if the file exists. + Returns a file entry based on the passed. + + + + Create a for a file given its actual name and optional override name + + The name of the file to create an entry for. + An alternative name to be used for the new entry. Null if not applicable. + If true get details from the file system if the file exists. + Returns a file entry based on the passed. + + + + Create a for a directory given its name + + The name of the directory to create an entry for. + Returns a directory entry based on the passed. + + + + Create a for a directory given its name + + The name of the directory to create an entry for. + If true get details from the file system for this directory if it exists. + Returns a directory entry based on the passed. + + + + Get/set the applicable. + + + + + Get the in use. + + + + + Get the value to use when is set to , + or if not specified, the value of when the class was the initialized + + + + + WindowsNameTransform transforms names to windows compatible ones. + + + + + The maximum windows path name permitted. + + This may not valid for all windows systems - CE?, etc but I cant find the equivalent in the CLR. + + + + In this case we need Windows' invalid path characters. + Path.GetInvalidPathChars() only returns a subset invalid on all platforms. + + + + + Initialises a new instance of + + + Allow parent directory traversal in file paths (e.g. ../file) + + + + Initialise a default instance of + + + + + Gets or sets a value containing the target directory to prefix values with. + + + + + Allow parent directory traversal in file paths (e.g. ../file) + + + + + Gets or sets a value indicating whether paths on incoming values should be removed. + + + + + Transform a Zip directory name to a windows directory name. + + The directory name to transform. + The transformed name. + + + + Transform a Zip format file name to a windows style one. + + The file name to transform. + The transformed name. + + + + Test a name to see if it is a valid name for a windows filename as extracted from a Zip archive. + + The name to test. + Returns true if the name is a valid zip name; false otherwise. + The filename isnt a true windows path in some fundamental ways like no absolute paths, no rooted paths etc. + + + + Force a name to be valid by replacing invalid characters with a fixed value + + The name to make valid + The replacement character to use for any invalid characters. + Returns a valid name + + + + Gets or set the character to replace invalid characters during transformations. + + + + + Determines how entries are tested to see if they should use Zip64 extensions or not. + + + + + Zip64 will not be forced on entries during processing. + + An entry can have this overridden if required + + + + Zip64 should always be used. + + + + + #ZipLib will determine use based on entry values when added to archive. + + + + + The kind of compression used for an entry in an archive + + + + + A direct copy of the file contents is held in the archive + + + + + Common Zip compression method using a sliding dictionary + of up to 32KB and secondary compression from Huffman/Shannon-Fano trees + + + + + An extension to deflate with a 64KB window. Not supported by #Zip currently + + + + + BZip2 compression. Not supported by #Zip. + + + + + LZMA compression. Not supported by #Zip. + + + + + PPMd compression. Not supported by #Zip. + + + + + WinZip special for AES encryption, Now supported by #Zip. + + + + + Identifies the encryption algorithm used for an entry + + + + + No encryption has been used. + + + + + Encrypted using PKZIP 2.0 or 'classic' encryption. + + + + + DES encryption has been used. + + + + + RC2 encryption has been used for encryption. + + + + + Triple DES encryption with 168 bit keys has been used for this entry. + + + + + Triple DES with 112 bit keys has been used for this entry. + + + + + AES 128 has been used for encryption. + + + + + AES 192 has been used for encryption. + + + + + AES 256 has been used for encryption. + + + + + RC2 corrected has been used for encryption. + + + + + Blowfish has been used for encryption. + + + + + Twofish has been used for encryption. + + + + + RC4 has been used for encryption. + + + + + An unknown algorithm has been used for encryption. + + + + + Defines the contents of the general bit flags field for an archive entry. + + + + + Bit 0 if set indicates that the file is encrypted + + + + + Bits 1 and 2 - Two bits defining the compression method (only for Method 6 Imploding and 8,9 Deflating) + + + + + Bit 3 if set indicates a trailing data descriptor is appended to the entry data + + + + + Bit 4 is reserved for use with method 8 for enhanced deflation + + + + + Bit 5 if set indicates the file contains Pkzip compressed patched data. + Requires version 2.7 or greater. + + + + + Bit 6 if set indicates strong encryption has been used for this entry. + + + + + Bit 7 is currently unused + + + + + Bit 8 is currently unused + + + + + Bit 9 is currently unused + + + + + Bit 10 is currently unused + + + + + Bit 11 if set indicates the filename and + comment fields for this file must be encoded using UTF-8. + + + + + Bit 12 is documented as being reserved by PKware for enhanced compression. + + + + + Bit 13 if set indicates that values in the local header are masked to hide + their actual values, and the central directory is encrypted. + + + Used when encrypting the central directory contents. + + + + + Bit 14 is documented as being reserved for use by PKware + + + + + Bit 15 is documented as being reserved for use by PKware + + + + + Helpers for + + + + + This is equivalent of in .NET Core, but since the .NET FW + version is really slow (due to un-/boxing and reflection) we use this wrapper. + + + + + + + + This class contains constants used for Zip format files + + + + + The version made by field for entries in the central header when created by this library + + + This is also the Zip version for the library when comparing against the version required to extract + for an entry. See . + + + + + The version made by field for entries in the central header when created by this library + + + This is also the Zip version for the library when comparing against the version required to extract + for an entry. See ZipInputStream.CanDecompressEntry. + + + + + The minimum version required to support strong encryption + + + + + The minimum version required to support strong encryption + + + + + Version indicating AES encryption + + + + + The version required for Zip64 extensions (4.5 or higher) + + + + + The version required for BZip2 compression (4.6 or higher) + + + + + Size of local entry header (excluding variable length fields at end) + + + + + Size of local entry header (excluding variable length fields at end) + + + + + Size of Zip64 data descriptor + + + + + Size of data descriptor + + + + + Size of data descriptor + + + + + Size of central header entry (excluding variable fields) + + + + + Size of central header entry + + + + + Size of end of central record (excluding variable fields) + + + + + Size of end of central record (excluding variable fields) + + + + + Size of 'classic' cryptographic header stored before any entry data + + + + + Size of cryptographic header stored before entry data + + + + + The size of the Zip64 central directory locator. + + + + + Signature for local entry header + + + + + Signature for local entry header + + + + + Signature for spanning entry + + + + + Signature for spanning entry + + + + + Signature for temporary spanning entry + + + + + Signature for temporary spanning entry + + + + + Signature for data descriptor + + + This is only used where the length, Crc, or compressed size isnt known when the + entry is created and the output stream doesnt support seeking. + The local entry cannot be 'patched' with the correct values in this case + so the values are recorded after the data prefixed by this header, as well as in the central directory. + + + + + Signature for data descriptor + + + This is only used where the length, Crc, or compressed size isnt known when the + entry is created and the output stream doesnt support seeking. + The local entry cannot be 'patched' with the correct values in this case + so the values are recorded after the data prefixed by this header, as well as in the central directory. + + + + + Signature for central header + + + + + Signature for central header + + + + + Signature for Zip64 central file header + + + + + Signature for Zip64 central file header + + + + + Signature for Zip64 central directory locator + + + + + Signature for archive extra data signature (were headers are encrypted). + + + + + Central header digital signature + + + + + Central header digital signature + + + + + End of central directory record signature + + + + + End of central directory record signature + + + + + GeneralBitFlags helper extensions + + + + + Efficiently check if any of the flags are set without enum un-/boxing + + + + Returns whether any of flags are set + + + + Efficiently check if all the flags are set without enum un-/boxing + + + + Returns whether the flags are all set + + + + The method of encrypting entries when creating zip archives. + + + + + No encryption will be used. + + + + + Encrypt entries with ZipCrypto. + + + + + Encrypt entries with AES 128. + + + + + Encrypt entries with AES 256. + + + + + Defines known values for the property. + + + + + Host system = MSDOS + + + + + Host system = Amiga + + + + + Host system = Open VMS + + + + + Host system = Unix + + + + + Host system = VMCms + + + + + Host system = Atari ST + + + + + Host system = OS2 + + + + + Host system = Macintosh + + + + + Host system = ZSystem + + + + + Host system = Cpm + + + + + Host system = Windows NT + + + + + Host system = MVS + + + + + Host system = VSE + + + + + Host system = Acorn RISC + + + + + Host system = VFAT + + + + + Host system = Alternate MVS + + + + + Host system = BEOS + + + + + Host system = Tandem + + + + + Host system = OS400 + + + + + Host system = OSX + + + + + Host system = WinZIP AES + + + + + This class represents an entry in a zip archive. This can be a file + or a directory + ZipFile and ZipInputStream will give you instances of this class as + information about the members in an archive. ZipOutputStream + uses an instance of this class when creating an entry in a Zip file. +
+
Author of the original java version : Jochen Hoenicke +
+
+ + + Creates a zip entry with the given name. + + + The name for this entry. Can include directory components. + The convention for names is 'unix' style paths with relative names only. + There are with no device names and path elements are separated by '/' characters. + + + The name passed is null + + + + + Creates a zip entry with the given name and version required to extract + + + The name for this entry. Can include directory components. + The convention for names is 'unix' style paths with no device names and + path elements separated by '/' characters. This is not enforced see CleanName + on how to ensure names are valid if this is desired. + + + The minimum 'feature version' required this entry + + + The name passed is null + + + + + Initializes an entry with the given name and made by information + + Name for this entry + Version and HostSystem Information + Minimum required zip feature version required to extract this entry + Compression method for this entry. + Whether the entry uses unicode for name and comment + + The name passed is null + + + versionRequiredToExtract should be 0 (auto-calculate) or > 10 + + + This constructor is used by the ZipFile class when reading from the central header + It is not generally useful, use the constructor specifying the name only. + + + + + Creates a deep copy of the given zip entry. + + + The entry to copy. + + + + + Get a value indicating whether the entry has a CRC value available. + + + + + Get/Set flag indicating if entry is encrypted. + A simple helper routine to aid interpretation of flags + + This is an assistant that interprets the flags property. + + +
+ This is an assistant that interprets the flags property. + + + + Value used during password checking for PKZIP 2.0 / 'classic' encryption. + + + + + Get/Set general purpose bit flag for entry + + + General purpose bit flag
+
+ Bit 0: If set, indicates the file is encrypted
+ Bit 1-2 Only used for compression type 6 Imploding, and 8, 9 deflating
+ Imploding:
+ Bit 1 if set indicates an 8K sliding dictionary was used. If clear a 4k dictionary was used
+ Bit 2 if set indicates 3 Shannon-Fanno trees were used to encode the sliding dictionary, 2 otherwise
+
+ Deflating:
+ Bit 2 Bit 1
+ 0 0 Normal compression was used
+ 0 1 Maximum compression was used
+ 1 0 Fast compression was used
+ 1 1 Super fast compression was used
+
+ Bit 3: If set, the fields crc-32, compressed size + and uncompressed size are were not able to be written during zip file creation + The correct values are held in a data descriptor immediately following the compressed data.
+ Bit 4: Reserved for use by PKZIP for enhanced deflating
+ Bit 5: If set indicates the file contains compressed patch data
+ Bit 6: If set indicates strong encryption was used.
+ Bit 7-10: Unused or reserved
+ Bit 11: If set the name and comments for this entry are in unicode.
+ Bit 12-15: Unused or reserved
+
+ + +
+ + + Get/Set index of this entry in Zip file + + This is only valid when the entry is part of a + + + + Get/set offset for use in central header + + + + + Get/Set external file attributes as an integer. + The values of this are operating system dependent see + HostSystem for details + + + + + Get the version made by for this entry or zero if unknown. + The value / 10 indicates the major version number, and + the value mod 10 is the minor version number + + + + + Get a value indicating this entry is for a DOS/Windows system. + + + + + Test the external attributes for this to + see if the external attributes are Dos based (including WINNT and variants) + and match the values + + The attributes to test. + Returns true if the external attributes are known to be DOS/Windows + based and have the same attributes set as the value passed. + + + + Gets the compatibility information for the external file attribute + If the external file attributes are compatible with MS-DOS and can be read + by PKZIP for DOS version 2.04g then this value will be zero. Otherwise the value + will be non-zero and identify the host system on which the attributes are compatible. + + + + The values for this as defined in the Zip File format and by others are shown below. The values are somewhat + misleading in some cases as they are not all used as shown. You should consult the relevant documentation + to obtain up to date and correct information. The modified appnote by the infozip group is + particularly helpful as it documents a lot of peculiarities. The document is however a little dated. + + 0 - MS-DOS and OS/2 (FAT / VFAT / FAT32 file systems) + 1 - Amiga + 2 - OpenVMS + 3 - Unix + 4 - VM/CMS + 5 - Atari ST + 6 - OS/2 HPFS + 7 - Macintosh + 8 - Z-System + 9 - CP/M + 10 - Windows NTFS + 11 - MVS (OS/390 - Z/OS) + 12 - VSE + 13 - Acorn Risc + 14 - VFAT + 15 - Alternate MVS + 16 - BeOS + 17 - Tandem + 18 - OS/400 + 19 - OS/X (Darwin) + 99 - WinZip AES + remainder - unused + + + + + + Get minimum Zip feature version required to extract this entry + + + Minimum features are defined as:
+ 1.0 - Default value
+ 1.1 - File is a volume label
+ 2.0 - File is a folder/directory
+ 2.0 - File is compressed using Deflate compression
+ 2.0 - File is encrypted using traditional encryption
+ 2.1 - File is compressed using Deflate64
+ 2.5 - File is compressed using PKWARE DCL Implode
+ 2.7 - File is a patch data set
+ 4.5 - File uses Zip64 format extensions
+ 4.6 - File is compressed using BZIP2 compression
+ 5.0 - File is encrypted using DES
+ 5.0 - File is encrypted using 3DES
+ 5.0 - File is encrypted using original RC2 encryption
+ 5.0 - File is encrypted using RC4 encryption
+ 5.1 - File is encrypted using AES encryption
+ 5.1 - File is encrypted using corrected RC2 encryption
+ 5.1 - File is encrypted using corrected RC2-64 encryption
+ 6.1 - File is encrypted using non-OAEP key wrapping
+ 6.2 - Central directory encryption (not confirmed yet)
+ 6.3 - File is compressed using LZMA
+ 6.3 - File is compressed using PPMD+
+ 6.3 - File is encrypted using Blowfish
+ 6.3 - File is encrypted using Twofish
+
+ +
+ + + Get a value indicating whether this entry can be decompressed by the library. + + This is based on the and + whether the compression method is supported. + + + + Force this entry to be recorded using Zip64 extensions. + + + + + Get a value indicating whether Zip64 extensions were forced. + + A value of true if Zip64 extensions have been forced on; false if not. + + + + Gets a value indicating if the entry requires Zip64 extensions + to store the full entry values. + + A value of true if a local header requires Zip64 extensions; false if not. + + + + Get a value indicating whether the central directory entry requires Zip64 extensions to be stored. + + + + + Get/Set DosTime value. + + + The MS-DOS date format can only represent dates between 1/1/1980 and 12/31/2107. + + + + + Gets/Sets the time of last modification of the entry. + + + The property is updated to match this as far as possible. + + + + + Returns the entry name. + + + The unix naming convention is followed. + Path components in the entry should always separated by forward slashes ('/'). + Dos device names like C: should also be removed. + See the class, or + + + + + Gets/Sets the size of the uncompressed data. + + + The size or -1 if unknown. + + Setting the size before adding an entry to an archive can help + avoid compatibility problems with some archivers which don't understand Zip64 extensions. + + + + Gets/Sets the size of the compressed data. + + + The compressed entry size or -1 if unknown. + + + + + Gets/Sets the crc of the uncompressed data. + + + Crc is not in the range 0..0xffffffffL + + + The crc value or -1 if unknown. + + + + + Gets/Sets the compression method. + + + The compression method for this entry + + + + + Gets the compression method for outputting to the local or central header. + Returns same value as CompressionMethod except when AES encrypting, which + places 99 in the method and places the real method in the extra data. + + + + + Gets/Sets the extra data. + + + Extra data is longer than 64KB (0xffff) bytes. + + + Extra data or null if not set. + + + + + For AES encrypted files returns or sets the number of bits of encryption (128, 192 or 256). + When setting, only 0 (off), 128 or 256 is supported. + + + + + AES Encryption strength for storage in extra data in entry header. + 1 is 128 bit, 2 is 192 bit, 3 is 256 bit. + + + + + Returns the length of the salt, in bytes + + Key size -> Salt length: 128 bits = 8 bytes, 192 bits = 12 bytes, 256 bits = 16 bytes. + + + + Number of extra bytes required to hold the AES Header fields (Salt, Pwd verify, AuthCode) + + File format: + Bytes | Content + ---------+--------------------------- + Variable | Salt value + 2 | Password verification value + Variable | Encrypted file data + 10 | Authentication code + + + + Number of extra bytes required to hold the encryption header fields. + + + + + Process extra data fields updating the entry based on the contents. + + True if the extra data fields should be handled + for a local header, rather than for a central header. + + + + + Gets/Sets the entry comment. + + + If comment is longer than 0xffff. + + + The comment or null if not set. + + + A comment is only available for entries when read via the class. + The class doesn't have the comment data available. + + + + + Gets a value indicating if the entry is a directory. + however. + + + A directory is determined by an entry name with a trailing slash '/'. + The external file attributes can also indicate an entry is for a directory. + Currently only dos/windows attributes are tested in this manner. + The trailing slash convention should always be followed. + + + + + Get a value of true if the entry appears to be a file; false otherwise + + + This only takes account of DOS/Windows attributes. Other operating systems are ignored. + For linux and others the result may be incorrect. + + + + + Test entry to see if data can be extracted. + + Returns true if data can be extracted for this entry; false otherwise. + + + + Creates a copy of this zip entry. + + An that is a copy of the current instance. + + + + Gets a string representation of this ZipEntry. + + A readable textual representation of this + + + + Test a compression method to see if this library + supports extracting data compressed with that method + + The compression method to test. + Returns true if the compression method is supported; false otherwise + + + + Cleans a name making it conform to Zip file conventions. + Devices names ('c:\') and UNC share names ('\\server\share') are removed + and back slashes ('\') are converted to forward slashes ('/'). + Names are made relative by trimming leading slashes which is compatible + with the ZIP naming convention. + + The name to clean + The 'cleaned' name. + + The Zip name transform class is more flexible. + + + + + General ZipEntry helper extensions + + + + + Efficiently check if a flag is set without enum un-/boxing + + + + Returns whether the flag was set + + + + Efficiently set a flag without enum un-/boxing + + + + Whether the passed flag should be set (1) or cleared (0) + + + + Basic implementation of + + + + + Defines the possible values to be used for the . + + + + + Use the recorded LastWriteTime value for the file. + + + + + Use the recorded LastWriteTimeUtc value for the file + + + + + Use the recorded CreateTime value for the file. + + + + + Use the recorded CreateTimeUtc value for the file. + + + + + Use the recorded LastAccessTime value for the file. + + + + + Use the recorded LastAccessTimeUtc value for the file. + + + + + Use a fixed value. + + The actual value used can be + specified via the constructor or + using the with the setting set + to which will use the when this class was constructed. + The property can also be used to set this value. + + + + Initialise a new instance of the class. + + A default , and the LastWriteTime for files is used. + + + + Initialise a new instance of using the specified + + The time setting to use when creating Zip entries. + + + + Initialise a new instance of using the specified + + The time to set all values to. + + + + Get / set the to be used when creating new values. + + + Setting this property to null will cause a default name transform to be used. + + + + + Get / set the in use. + + + + + Get / set the value to use when is set to + + + + + A bitmask defining the attributes to be retrieved from the actual file. + + The default is to get all possible attributes from the actual file. + + + + A bitmask defining which attributes are to be set on. + + By default no attributes are set on. + + + + Get set a value indicating whether unicode text should be set on. + + + + + Make a new for a file. + + The name of the file to create a new entry for. + Returns a new based on the . + + + + Make a new for a file. + + The name of the file to create a new entry for. + If true entry detail is retrieved from the file system if the file exists. + Returns a new based on the . + + + + Make a new from a name. + + The name of the file to create a new entry for. + An alternative name to be used for the new entry. Null if not applicable. + If true entry detail is retrieved from the file system if the file exists. + Returns a new based on the . + + + + Make a new for a directory. + + The raw untransformed name for the new directory + Returns a new representing a directory. + + + + Make a new for a directory. + + The raw untransformed name for the new directory + If true entry detail is retrieved from the file system if the file exists. + Returns a new representing a directory. + + + + ZipException represents exceptions specific to Zip classes and code. + + + + + Initialise a new instance of . + + + + + Initialise a new instance of with its message string. + + A that describes the error. + + + + Initialise a new instance of . + + A that describes the error. + The that caused this exception. + + + + Initializes a new instance of the ZipException class with serialized data. + + + The System.Runtime.Serialization.SerializationInfo that holds the serialized + object data about the exception being thrown. + + + The System.Runtime.Serialization.StreamingContext that contains contextual information + about the source or destination. + + + + + ExtraData tagged value interface. + + + + + Get the ID for this tagged data value. + + + + + Set the contents of this instance from the data passed. + + The data to extract contents from. + The offset to begin extracting data from. + The number of bytes to extract. + + + + Get the data representing this instance. + + Returns the data for this instance. + + + + A raw binary tagged value + + + + + Initialise a new instance. + + The tag ID. + + + + Get the ID for this tagged data value. + + + + + Set the data from the raw values provided. + + The raw data to extract values from. + The index to start extracting values from. + The number of bytes available. + + + + Get the binary data representing this instance. + + The raw binary data representing this instance. + + + + Get /set the binary data representing this instance. + + The raw binary data representing this instance. + + + + The tag ID for this instance. + + + + + Class representing extended unix date time values. + + + + + Flags indicate which values are included in this instance. + + + + + The modification time is included + + + + + The access time is included + + + + + The create time is included. + + + + + Get the ID + + + + + Set the data from the raw values provided. + + The raw data to extract values from. + The index to start extracting values from. + The number of bytes available. + + + + Get the binary data representing this instance. + + The raw binary data representing this instance. + + + + Test a value to see if is valid and can be represented here. + + The value to test. + Returns true if the value is valid and can be represented; false if not. + The standard Unix time is a signed integer data type, directly encoding the Unix time number, + which is the number of seconds since 1970-01-01. + Being 32 bits means the values here cover a range of about 136 years. + The minimum representable time is 1901-12-13 20:45:52, + and the maximum representable time is 2038-01-19 03:14:07. + + + + + Get /set the Modification Time + + + + + + + Get / set the Access Time + + + + + + + Get / Set the Create Time + + + + + + + Get/set the values to include. + + + + + Class handling NT date time values. + + + + + Get the ID for this tagged data value. + + + + + Set the data from the raw values provided. + + The raw data to extract values from. + The index to start extracting values from. + The number of bytes available. + + + + Get the binary data representing this instance. + + The raw binary data representing this instance. + + + + Test a valuie to see if is valid and can be represented here. + + The value to test. + Returns true if the value is valid and can be represented; false if not. + + NTFS filetimes are 64-bit unsigned integers, stored in Intel + (least significant byte first) byte order. They determine the + number of 1.0E-07 seconds (1/10th microseconds!) past WinNT "epoch", + which is "01-Jan-1601 00:00:00 UTC". 28 May 60056 is the upper limit + + + + + Get/set the last modification time. + + + + + Get /set the create time + + + + + Get /set the last access time. + + + + + A factory that creates tagged data instances. + + + + + Get data for a specific tag value. + + The tag ID to find. + The data to search. + The offset to begin extracting data from. + The number of bytes to extract. + The located value found, or null if not found. + + + + + A class to handle the extra data field for Zip entries + + + Extra data contains 0 or more values each prefixed by a header tag and length. + They contain zero or more bytes of actual data. + The data is held internally using a copy on write strategy. This is more efficient but + means that for extra data created by passing in data can have the values modified by the caller + in some circumstances. + + + + + Initialise a default instance. + + + + + Initialise with known extra data. + + The extra data. + + + + Get the raw extra data value + + Returns the raw byte[] extra data this instance represents. + + + + Clear the stored data. + + + + + Gets the current extra data length. + + + + + Get a read-only for the associated tag. + + The tag to locate data for. + Returns a containing tag data or null if no tag was found. + + + + Get the tagged data for a tag. + + The tag to search for. + Returns a tagged value or null if none found. + + + + Get the length of the last value found by + + This is only valid if has previously returned true. + + + + Get the index for the current read value. + + This is only valid if has previously returned true. + Initially the result will be the index of the first byte of actual data. The value is updated after calls to + , and . + + + + Get the number of bytes remaining to be read for the current value; + + + + + Find an extra data value + + The identifier for the value to find. + Returns true if the value was found; false otherwise. + + + + Add a new entry to extra data. + + The value to add. + + + + Add a new entry to extra data + + The ID for this entry. + The data to add. + If the ID already exists its contents are replaced. + + + + Start adding a new entry. + + Add data using , , , or . + The new entry is completed and actually added by calling + + + + + Add entry data added since using the ID passed. + + The identifier to use for this entry. + + + + Add a byte of data to the pending new entry. + + The byte to add. + + + + + Add data to a pending new entry. + + The data to add. + + + + + Add a short value in little endian order to the pending new entry. + + The data to add. + + + + + Add an integer value in little endian order to the pending new entry. + + The data to add. + + + + + Add a long value in little endian order to the pending new entry. + + The data to add. + + + + + Delete an extra data field. + + The identifier of the field to delete. + Returns true if the field was found and deleted. + + + + Read a long in little endian form from the last found data value + + Returns the long value read. + + + + Read an integer in little endian form from the last found data value. + + Returns the integer read. + + + + Read a short value in little endian form from the last found data value. + + Returns the short value read. + + + + Read a byte from an extra data + + The byte value read or -1 if the end of data has been reached. + + + + Skip data during reading. + + The number of bytes to skip. + + + + Internal form of that reads data at any location. + + Returns the short value read. + + + + Dispose of this instance. + + + + + Arguments used with KeysRequiredEvent + + + + + Initialise a new instance of + + The name of the file for which keys are required. + + + + Initialise a new instance of + + The name of the file for which keys are required. + The current key value. + + + + Gets the name of the file for which keys are required. + + + + + Gets or sets the key value + + + + + The strategy to apply to testing. + + + + + Find the first error only. + + + + + Find all possible errors. + + + + + The operation in progress reported by a during testing. + + TestArchive + + + + Setting up testing. + + + + + Testing an individual entries header + + + + + Testing an individual entries data + + + + + Testing an individual entry has completed. + + + + + Running miscellaneous tests + + + + + Testing is complete + + + + + Status returned by during testing. + + TestArchive + + + + Initialise a new instance of + + The this status applies to. + + + + Get the current in progress. + + + + + Get the this status is applicable to. + + + + + Get the current/last entry tested. + + + + + Get the number of errors detected so far. + + + + + Get the number of bytes tested so far for the current entry. + + + + + Get a value indicating whether the last entry test was valid. + + + + + Delegate invoked during testing if supplied indicating current progress and status. + + If the message is non-null an error has occured. If the message is null + the operation as found in status has started. + + + + The possible ways of applying updates to an archive. + + + + + Perform all updates on temporary files ensuring that the original file is saved. + + + + + Update the archive directly, which is faster but less safe. + + + + + This class represents a Zip archive. You can ask for the contained + entries, or get an input stream for a file entry. The entry is + automatically decompressed. + + You can also update the archive adding or deleting entries. + + This class is thread safe for input: You can open input streams for arbitrary + entries in different threads. +
+
Author of the original java version : Jochen Hoenicke +
+ + + using System; + using System.Text; + using System.Collections; + using System.IO; + + using ICSharpCode.SharpZipLib.Zip; + + class MainClass + { + static public void Main(string[] args) + { + using (ZipFile zFile = new ZipFile(args[0])) { + Console.WriteLine("Listing of : " + zFile.Name); + Console.WriteLine(""); + Console.WriteLine("Raw Size Size Date Time Name"); + Console.WriteLine("-------- -------- -------- ------ ---------"); + foreach (ZipEntry e in zFile) { + if ( e.IsFile ) { + DateTime d = e.DateTime; + Console.WriteLine("{0, -10}{1, -10}{2} {3} {4}", e.Size, e.CompressedSize, + d.ToString("dd-MM-yy"), d.ToString("HH:mm"), + e.Name); + } + } + } + } + } + + +
+ + + Delegate for handling keys/password setting during compression/decompression. + + + + + Event handler for handling encryption keys. + + + + + Handles getting of encryption keys when required. + + The file for which encryption keys are required. + + + + Get/set the encryption key value. + + + + + Password to be used for encrypting/decrypting files. + + Set to null if no password is required. + + + + Get a value indicating whether encryption keys are currently available. + + + + + Opens a Zip file with the given name for reading. + + The name of the file to open. + + The argument supplied is null. + + An i/o error occurs + + + The file doesn't contain a valid zip archive. + + + + + Opens a Zip file reading the given . + + The to read archive data from. + The supplied argument is null. + + An i/o error occurs. + + + The file doesn't contain a valid zip archive. + + + + + Opens a Zip file reading the given . + + The to read archive data from. + true to leave the file open when the ZipFile is disposed, false to dispose of it + The supplied argument is null. + + An i/o error occurs. + + + The file doesn't contain a valid zip archive. + + + + + Opens a Zip file reading the given . + + The to read archive data from. + + An i/o error occurs + + + The stream doesn't contain a valid zip archive.
+
+ + The stream doesnt support seeking. + + + The stream argument is null. + +
+ + + Opens a Zip file reading the given . + + The to read archive data from. + true to leave the stream open when the ZipFile is disposed, false to dispose of it + + + An i/o error occurs + + + The stream doesn't contain a valid zip archive.
+
+ + The stream doesnt support seeking. + + + The stream argument is null. + +
+ + + Initialises a default instance with no entries and no file storage. + + + + + Finalize this instance. + + + + + Closes the ZipFile. If the stream is owned then this also closes the underlying input stream. + Once closed, no further instance methods should be called. + + + An i/o error occurs. + + + + + Create a new whose data will be stored in a file. + + The name of the archive to create. + Returns the newly created + is null + + + + Create a new whose data will be stored on a stream. + + The stream providing data storage. + Returns the newly created + is null + doesnt support writing. + + + + Get/set a flag indicating if the underlying stream is owned by the ZipFile instance. + If the flag is true then the stream will be closed when Close is called. + + + The default value is true in all cases. + + + + + Get a value indicating whether + this archive is embedded in another file or not. + + + + + Get a value indicating that this archive is a new one. + + + + + Gets the comment for the zip file. + + + + + Gets the name of this zip file. + + + + + Gets the number of entries in this zip file. + + + The Zip file has been closed. + + + + + Get the number of entries contained in this . + + + + + Indexer property for ZipEntries + + + + + + + + + + + Gets an enumerator for the Zip entries in this Zip file. + + Returns an for this archive. + + The Zip file has been closed. + + + + + Return the index of the entry with a matching name + + Entry name to find + If true the comparison is case insensitive + The index position of the matching entry or -1 if not found + + The Zip file has been closed. + + + + + Searches for a zip entry in this archive with the given name. + String comparisons are case insensitive + + + The name to find. May contain directory components separated by slashes ('/'). + + + A clone of the zip entry, or null if no entry with that name exists. + + + The Zip file has been closed. + + + + + Gets an input stream for reading the given zip entry data in an uncompressed form. + Normally the should be an entry returned by GetEntry(). + + The to obtain a data for + An input containing data for this + + The ZipFile has already been closed + + + The compression method for the entry is unknown + + + The entry is not found in the ZipFile + + + + + Creates an input stream reading a zip entry + + The index of the entry to obtain an input stream for. + + An input containing data for this + + + The ZipFile has already been closed + + + The compression method for the entry is unknown + + + The entry is not found in the ZipFile + + + + + Test an archive for integrity/validity + + Perform low level data Crc check + true if all tests pass, false otherwise + Testing will terminate on the first error found. + + + + Test an archive for integrity/validity + + Perform low level data Crc check + The to apply. + The handler to call during testing. + true if all tests pass, false otherwise + The object has already been closed. + + + + Test a local header against that provided from the central directory + + + The entry to test against + + The type of tests to carry out. + The offset of the entries data in the file + + + + The kind of update to apply. + + + + + Get / set the to apply to names when updating. + + + + + Get/set the used to generate values + during updates. + + + + + Get /set the buffer size to be used when updating this zip file. + + + + + Get a value indicating an update has been started. + + + + + Get / set a value indicating how Zip64 Extension usage is determined when adding entries. + + + + + Begin updating this archive. + + The archive storage for use during the update. + The data source to utilise during updating. + ZipFile has been closed. + One of the arguments provided is null + ZipFile has been closed. + + + + Begin updating to this archive. + + The storage to use during the update. + + + + Begin updating this archive. + + + + + + + + Commit current updates, updating this archive. + + + + ZipFile has been closed. + + + + Abort updating leaving the archive unchanged. + + + + + + + Set the file comment to be recorded when the current update is commited. + + The comment to record. + ZipFile has been closed. + + + + Add a new entry to the archive. + + The name of the file to add. + The compression method to use. + Ensure Unicode text is used for name and comment for this entry. + Argument supplied is null. + ZipFile has been closed. + Compression method is not supported for creating entries. + + + + Add a new entry to the archive. + + The name of the file to add. + The compression method to use. + ZipFile has been closed. + Compression method is not supported for creating entries. + + + + Add a file to the archive. + + The name of the file to add. + Argument supplied is null. + + + + Add a file to the archive. + + The name of the file to add. + The name to use for the on the Zip file created. + Argument supplied is null. + + + + Add a file entry with data. + + The source of the data for this entry. + The name to give to the entry. + + + + Add a file entry with data. + + The source of the data for this entry. + The name to give to the entry. + The compression method to use. + Compression method is not supported for creating entries. + + + + Add a file entry with data. + + The source of the data for this entry. + The name to give to the entry. + The compression method to use. + Ensure Unicode text is used for name and comments for this entry. + Compression method is not supported for creating entries. + + + + Add a that contains no data. + + The entry to add. + This can be used to add directories, volume labels, or empty file entries. + + + + Add a with data. + + The source of the data for this entry. + The entry to add. + This can be used to add file entries with a custom data source. + + The encryption method specified in is unsupported. + + Compression method is not supported for creating entries. + + + + Add a directory entry to the archive. + + The directory to add. + + + + Check if the specified compression method is supported for adding a new entry. + + The compression method for the new entry. + + + + Delete an entry by name + + The filename to delete + True if the entry was found and deleted; false otherwise. + + + + Delete a from the archive. + + The entry to delete. + + + + Write an unsigned short in little endian byte order. + + + + + Write an int in little endian byte order. + + + + + Write an unsigned int in little endian byte order. + + + + + Write a long in little endian byte order. + + + + + Get a raw memory buffer. + + Returns a raw memory buffer. + + + + Get the size of the source descriptor for a . + + The update to get the size for. + Whether to include the signature size + The descriptor size, zero if there isn't one. + + + + Get an output stream for the specified + + The entry to get an output stream for. + The output stream obtained for the entry. + + + + Class used to sort updates. + + + + + Compares two objects and returns a value indicating whether one is + less than, equal to or greater than the other. + + First object to compare + Second object to compare. + Compare result. + + + + Represents a pending update to a Zip file. + + + + + Copy an existing entry. + + The existing entry to copy. + + + + Get the for this update. + + This is the source or original entry. + + + + Get the that will be written to the updated/new file. + + + + + Get the command for this update. + + + + + Get the filename if any for this update. Null if none exists. + + + + + Get/set the location of the size patch for this update. + + + + + Get /set the location of the crc patch for this update. + + + + + Get/set the size calculated by offset. + Specifically, the difference between this and next entry's starting offset. + + + + + Releases the unmanaged resources used by the this instance and optionally releases the managed resources. + + true to release both managed and unmanaged resources; + false to release only unmanaged resources. + + + + Read an unsigned short in little endian byte order. + + Returns the value read. + + The stream ends prematurely + + + + + Read a uint in little endian byte order. + + Returns the value read. + + An i/o error occurs. + + + The file ends prematurely + + + + + Search for and read the central directory of a zip file filling the entries array. + + + An i/o error occurs. + + + The central directory is malformed or cannot be found + + + + + Locate the data for a given entry. + + + The start offset of the data. + + + The stream ends prematurely + + + The local header signature is invalid, the entry and central header file name lengths are different + or the local and entry compression methods dont match + + + + + Skip the verification of the local header when reading an archive entry. Set this to attempt to read the + entries even if the headers should indicate that doing so would fail or produce an unexpected output. + + + + + Represents a string from a which is stored as an array of bytes. + + + + + Initialise a with a string. + + The textual string form. + + + + + Initialise a using a string in its binary 'raw' form. + + + + + + + Get a value indicating the original source of data for this instance. + True if the source was a string; false if the source was binary data. + + + + + Get the length of the comment when represented as raw bytes. + + + + + Get the comment in its 'raw' form as plain bytes. + + + + + Reset the comment to its initial state. + + + + + Implicit conversion of comment to a string. + + The to convert to a string. + The textual equivalent for the input value. + + + + An enumerator for Zip entries + + + + + An is a stream that you can write uncompressed data + to and flush, but cannot read, seek or do anything else to. + + + + + Gets a value indicating whether the current stream supports reading. + + + + + Write any buffered data to underlying storage. + + + + + Gets a value indicating whether the current stream supports writing. + + + + + Gets a value indicating whether the current stream supports seeking. + + + + + Get the length in bytes of the stream. + + + + + Gets or sets the position within the current stream. + + + + + Reads a sequence of bytes from the current stream and advances the position within the stream by the number of bytes read. + + An array of bytes. When this method returns, the buffer contains the specified byte array with the values between offset and (offset + count - 1) replaced by the bytes read from the current source. + The zero-based byte offset in buffer at which to begin storing the data read from the current stream. + The maximum number of bytes to be read from the current stream. + + The total number of bytes read into the buffer. This can be less than the number of bytes requested if that many bytes are not currently available, or zero (0) if the end of the stream has been reached. + + The sum of offset and count is larger than the buffer length. + Methods were called after the stream was closed. + The stream does not support reading. + buffer is null. + An I/O error occurs. + offset or count is negative. + + + + Sets the position within the current stream. + + A byte offset relative to the origin parameter. + A value of type indicating the reference point used to obtain the new position. + + The new position within the current stream. + + An I/O error occurs. + The stream does not support seeking, such as if the stream is constructed from a pipe or console output. + Methods were called after the stream was closed. + + + + Sets the length of the current stream. + + The desired length of the current stream in bytes. + The stream does not support both writing and seeking, such as if the stream is constructed from a pipe or console output. + An I/O error occurs. + Methods were called after the stream was closed. + + + + Writes a sequence of bytes to the current stream and advances the current position within this stream by the number of bytes written. + + An array of bytes. This method copies count bytes from buffer to the current stream. + The zero-based byte offset in buffer at which to begin copying bytes to the current stream. + The number of bytes to be written to the current stream. + An I/O error occurs. + The stream does not support writing. + Methods were called after the stream was closed. + buffer is null. + The sum of offset and count is greater than the buffer length. + offset or count is negative. + + + + A is an + whose data is only a part or subsection of a file. + + + + + Initialise a new instance of the class. + + The containing the underlying stream to use for IO. + The start of the partial data. + The length of the partial data. + + + + Read a byte from this stream. + + Returns the byte read or -1 on end of stream. + + + + Reads a sequence of bytes from the current stream and advances the position within the stream by the number of bytes read. + + An array of bytes. When this method returns, the buffer contains the specified byte array with the values between offset and (offset + count - 1) replaced by the bytes read from the current source. + The zero-based byte offset in buffer at which to begin storing the data read from the current stream. + The maximum number of bytes to be read from the current stream. + + The total number of bytes read into the buffer. This can be less than the number of bytes requested if that many bytes are not currently available, or zero (0) if the end of the stream has been reached. + + The sum of offset and count is larger than the buffer length. + Methods were called after the stream was closed. + The stream does not support reading. + buffer is null. + An I/O error occurs. + offset or count is negative. + + + + Writes a sequence of bytes to the current stream and advances the current position within this stream by the number of bytes written. + + An array of bytes. This method copies count bytes from buffer to the current stream. + The zero-based byte offset in buffer at which to begin copying bytes to the current stream. + The number of bytes to be written to the current stream. + An I/O error occurs. + The stream does not support writing. + Methods were called after the stream was closed. + buffer is null. + The sum of offset and count is greater than the buffer length. + offset or count is negative. + + + + When overridden in a derived class, sets the length of the current stream. + + The desired length of the current stream in bytes. + The stream does not support both writing and seeking, such as if the stream is constructed from a pipe or console output. + An I/O error occurs. + Methods were called after the stream was closed. + + + + When overridden in a derived class, sets the position within the current stream. + + A byte offset relative to the origin parameter. + A value of type indicating the reference point used to obtain the new position. + + The new position within the current stream. + + An I/O error occurs. + The stream does not support seeking, such as if the stream is constructed from a pipe or console output. + Methods were called after the stream was closed. + + + + Clears all buffers for this stream and causes any buffered data to be written to the underlying device. + + An I/O error occurs. + + + + Gets or sets the position within the current stream. + + + The current position within the stream. + An I/O error occurs. + The stream does not support seeking. + Methods were called after the stream was closed. + + + + Gets the length in bytes of the stream. + + + A long value representing the length of the stream in bytes. + A class derived from Stream does not support seeking. + Methods were called after the stream was closed. + + + + Gets a value indicating whether the current stream supports writing. + + false + true if the stream supports writing; otherwise, false. + + + + Gets a value indicating whether the current stream supports seeking. + + true + true if the stream supports seeking; otherwise, false. + + + + Gets a value indicating whether the current stream supports reading. + + true. + true if the stream supports reading; otherwise, false. + + + + Gets a value that determines whether the current stream can time out. + + + A value that determines whether the current stream can time out. + + + + Provides a static way to obtain a source of data for an entry. + + + + + Get a source of data by creating a new stream. + + Returns a to use for compression input. + Ideally a new stream is created and opened to achieve this, to avoid locking problems. + + + + Represents a source of data that can dynamically provide + multiple data sources based on the parameters passed. + + + + + Get a data source. + + The to get a source for. + The name for data if known. + Returns a to use for compression input. + Ideally a new stream is created and opened to achieve this, to avoid locking problems. + + + + Default implementation of a for use with files stored on disk. + + + + + Initialise a new instance of + + The name of the file to obtain data from. + + + + Get a providing data. + + Returns a providing data. + + + + Default implementation of for files stored on disk. + + + + + Get a providing data for an entry. + + The entry to provide data for. + The file name for data if known. + Returns a stream providing data; or null if not available + + + + Defines facilities for data storage when updating Zip Archives. + + + + + Get the to apply during updates. + + + + + Get an empty that can be used for temporary output. + + Returns a temporary output + + + + + Convert a temporary output stream to a final stream. + + The resulting final + + + + + Make a temporary copy of the original stream. + + The to copy. + Returns a temporary output that is a copy of the input. + + + + Return a stream suitable for performing direct updates on the original source. + + The current stream. + Returns a stream suitable for direct updating. + This may be the current stream passed. + + + + Dispose of this instance. + + + + + An abstract suitable for extension by inheritance. + + + + + Initializes a new instance of the class. + + The update mode. + + + + Gets a temporary output + + Returns the temporary output stream. + + + + + Converts the temporary to its final form. + + Returns a that can be used to read + the final storage for the archive. + + + + + Make a temporary copy of a . + + The to make a copy of. + Returns a temporary output that is a copy of the input. + + + + Return a stream suitable for performing direct updates on the original source. + + The to open for direct update. + Returns a stream suitable for direct updating. + + + + Disposes this instance. + + + + + Gets the update mode applicable. + + The update mode. + + + + An implementation suitable for hard disks. + + + + + Initializes a new instance of the class. + + The file. + The update mode. + + + + Initializes a new instance of the class. + + The file. + + + + Gets a temporary output for performing updates on. + + Returns the temporary output stream. + + + + Converts a temporary to its final form. + + Returns a that can be used to read + the final storage for the archive. + + + + Make a temporary copy of a stream. + + The to copy. + Returns a temporary output that is a copy of the input. + + + + Return a stream suitable for performing direct updates on the original source. + + The current stream. + Returns a stream suitable for direct updating. + If the is not null this is used as is. + + + + Disposes this instance. + + + + + An implementation suitable for in memory streams. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The to use + This constructor is for testing as memory streams dont really require safe mode. + + + + Get the stream returned by if this was in fact called. + + + + + Gets the temporary output + + Returns the temporary output stream. + + + + Converts the temporary to its final form. + + Returns a that can be used to read + the final storage for the archive. + + + + Make a temporary copy of the original stream. + + The to copy. + Returns a temporary output that is a copy of the input. + + + + Return a stream suitable for performing direct updates on the original source. + + The original source stream + Returns a stream suitable for direct updating. + If the passed is not null this is used; + otherwise a new is returned. + + + + Disposes this instance. + + + + + Holds data pertinent to a data descriptor. + + + + + Get /set the compressed size of data. + + + + + Get / set the uncompressed size of data + + + + + Get /set the crc value. + + + + + This class assists with writing/reading from Zip files. + + + + + Locates a block with the desired . + + + The signature to find. + Location, marking the end of block. + Minimum size of the block. + The maximum variable data. + Returns the offset of the first byte after the signature; -1 if not found + + + + + + + Write Zip64 end of central directory records (File header and locator). + + + The number of entries in the central directory. + The size of entries in the central directory. + The offset of the central directory. + + + + + + + Write the required records to end the central directory. + + + The number of entries in the directory. + The size of the entries in the directory. + The start of the central directory. + The archive comment. (This can be null). + + + + Write a data descriptor. + + + The entry to write a descriptor for. + Returns the number of descriptor bytes written. + + + + Read data descriptor at the end of compressed data. + + + if set to true [zip64]. + The data to fill in. + Returns the number of bytes read in the descriptor. + + + + This is an InflaterInputStream that reads the files baseInputStream an zip archive + one after another. It has a special method to get the zip entry of + the next file. The zip entry contains information about the file name + size, compressed size, Crc, etc. + It includes support for Stored and Deflated entries. +
+
Author of the original java version : Jochen Hoenicke +
+ + This sample shows how to read a zip file + + using System; + using System.Text; + using System.IO; + + using ICSharpCode.SharpZipLib.Zip; + + class MainClass + { + public static void Main(string[] args) + { + using ( ZipInputStream s = new ZipInputStream(File.OpenRead(args[0]))) { + + ZipEntry theEntry; + const int size = 2048; + byte[] data = new byte[2048]; + + while ((theEntry = s.GetNextEntry()) != null) { + if ( entry.IsFile ) { + Console.Write("Show contents (y/n) ?"); + if (Console.ReadLine() == "y") { + while (true) { + size = s.Read(data, 0, data.Length); + if (size > 0) { + Console.Write(new ASCIIEncoding().GetString(data, 0, size)); + } else { + break; + } + } + } + } + } + } + } + } + + +
+ + + Delegate for reading bytes from a stream. + + + + + The current reader this instance. + + + + + Creates a new Zip input stream, for reading a zip archive. + + The underlying providing data. + + + + Creates a new Zip input stream, for reading a zip archive. + + The underlying providing data. + Size of the buffer. + + + + Creates a new Zip input stream, for reading a zip archive. + + The underlying providing data. + + + + + Optional password used for encryption when non-null + + A password for all encrypted entries in this + + + + Gets a value indicating if there is a current entry and it can be decompressed + + + The entry can only be decompressed if the library supports the zip features required to extract it. + See the ZipEntry Version property for more details. + + Since uses the local headers for extraction, entries with no compression combined with the + flag set, cannot be extracted as the end of the entry data cannot be deduced. + + + + + Is the compression method for the specified entry supported? + + + Uses entry.CompressionMethodForHeader so that entries of type WinZipAES will be rejected. + + the entry to check. + true if the compression method is supported, false if not. + + + + Advances to the next entry in the archive + + + The next entry in the archive or null if there are no more entries. + + + If the previous entry is still open CloseEntry is called. + + + Input stream is closed + + + Password is not set, password is invalid, compression method is invalid, + version required to extract is not supported + + + + + Reads bytes from the input stream until either a local file header signature, or another signature + indicating that no more entries should be present, is found. + + Thrown if the end of the input stream is reached without any signatures found + Returns whether the found signature is for a local entry header + + + + Read data descriptor at the end of compressed data. + + + + + Complete cleanup as the final part of closing. + + True if the crc value should be tested + + + + Closes the current zip entry and moves to the next one. + + + The stream is closed + + + The Zip stream ends early + + + + + Returns 1 if there is an entry available + Otherwise returns 0. + + + + + Returns the current size that can be read from the current entry if available + + Thrown if the entry size is not known. + Thrown if no entry is currently available. + + + + Reads a byte from the current zip entry. + + + The byte or -1 if end of stream is reached. + + + + + Handle attempts to read by throwing an . + + The destination array to store data in. + The offset at which data read should be stored. + The maximum number of bytes to read. + Returns the number of bytes actually read. + + + + Handle attempts to read from this entry by throwing an exception + + + + + Handle attempts to read from this entry by throwing an exception + + + + + Perform the initial read on an entry which may include + reading encryption headers and setting up inflation. + + The destination to fill with data read. + The offset to start reading at. + The maximum number of bytes to read. + The actual number of bytes read. + + + + Read a block of bytes from the stream. + + The destination for the bytes. + The index to start storing data. + The number of bytes to attempt to read. + Returns the number of bytes read. + Zero bytes read means end of stream. + + + + Reads a block of bytes from the current zip entry. + + + The number of bytes read (this may be less than the length requested, even before the end of stream), or 0 on end of stream. + + + An i/o error occurred. + + + The deflated stream is corrupted. + + + The stream is not open. + + + + + Closes the zip input stream + + + + + ZipNameTransform transforms names as per the Zip file naming convention. + + The use of absolute names is supported although its use is not valid + according to Zip naming conventions, and should not be used if maximum compatability is desired. + + + + Initialize a new instance of + + + + + Initialize a new instance of + + The string to trim from the front of paths if found. + + + + Static constructor. + + + + + Transform a windows directory name according to the Zip file naming conventions. + + The directory name to transform. + The transformed name. + + + + Transform a windows file name according to the Zip file naming conventions. + + The file name to transform. + The transformed name. + + + + Get/set the path prefix to be trimmed from paths if present. + + The prefix is trimmed before any conversion from + a windows path is done. + + + + Force a name to be valid by replacing invalid characters with a fixed value + + The name to force valid + The replacement character to use. + Returns a valid name + + + + Test a name to see if it is a valid name for a zip entry. + + The name to test. + If true checking is relaxed about windows file names and absolute paths. + Returns true if the name is a valid zip name; false otherwise. + Zip path names are actually in Unix format, and should only contain relative paths. + This means that any path stored should not contain a drive or + device letter, or a leading slash. All slashes should forward slashes '/'. + An empty name is valid for a file where the input comes from standard input. + A null name is not considered valid. + + + + + Test a name to see if it is a valid name for a zip entry. + + The name to test. + Returns true if the name is a valid zip name; false otherwise. + Zip path names are actually in unix format, + and should only contain relative paths if a path is present. + This means that the path stored should not contain a drive or + device letter, or a leading slash. All slashes should forward slashes '/'. + An empty name is valid where the input comes from standard input. + A null name is not considered valid. + + + + + An implementation of INameTransform that transforms entry paths as per the Zip file naming convention. + Strips path roots and puts directory separators in the correct format ('/') + + + + + Initialize a new instance of + + + + + Transform a windows directory name according to the Zip file naming conventions. + + The directory name to transform. + The transformed name. + + + + Transform a windows file name according to the Zip file naming conventions. + + The file name to transform. + The transformed name. + + + + This is a DeflaterOutputStream that writes the files into a zip + archive one after another. It has a special method to start a new + zip entry. The zip entries contains information about the file name + size, compressed size, CRC, etc. + + It includes support for Stored and Deflated entries. + This class is not thread safe. +
+
Author of the original java version : Jochen Hoenicke +
+ This sample shows how to create a zip file + + using System; + using System.IO; + + using ICSharpCode.SharpZipLib.Core; + using ICSharpCode.SharpZipLib.Zip; + + class MainClass + { + public static void Main(string[] args) + { + string[] filenames = Directory.GetFiles(args[0]); + byte[] buffer = new byte[4096]; + + using ( ZipOutputStream s = new ZipOutputStream(File.Create(args[1])) ) { + + s.SetLevel(9); // 0 - store only to 9 - means best compression + + foreach (string file in filenames) { + ZipEntry entry = new ZipEntry(file); + s.PutNextEntry(entry); + + using (FileStream fs = File.OpenRead(file)) { + StreamUtils.Copy(fs, s, buffer); + } + } + } + } + } + + +
+ + + Creates a new Zip output stream, writing a zip archive. + + + The output stream to which the archive contents are written. + + + + + Creates a new Zip output stream, writing a zip archive. + + The output stream to which the archive contents are written. + Size of the buffer to use. + + + + Creates a new Zip output stream, writing a zip archive. + + The output stream to which the archive contents are written. + + + + + Gets a flag value of true if the central header has been added for this archive; false if it has not been added. + + No further entries can be added once this has been done. + + + + Set the zip file comment. + + + The comment text for the entire archive. + + + The converted comment is longer than 0xffff bytes. + + + + + Sets the compression level. The new level will be activated + immediately. + + The new compression level (1 to 9). + + Level specified is not supported. + + + + + + Get the current deflater compression level + + The current compression level + + + + Get / set a value indicating how Zip64 Extension usage is determined when adding entries. + + Older archivers may not understand Zip64 extensions. + If backwards compatability is an issue be careful when adding entries to an archive. + Setting this property to off is workable but less desirable as in those circumstances adding a file + larger then 4GB will fail. + + + + Used for transforming the names of entries added by . + Defaults to , set to null to disable transforms and use names as supplied. + + + + + Get/set the password used for encryption. + + When set to null or if the password is empty no encryption is performed + + + + Write an unsigned short in little endian byte order. + + + + + Write an int in little endian byte order. + + + + + Write an int in little endian byte order. + + + + + Starts a new Zip entry. It automatically closes the previous + entry if present. + All entry elements bar name are optional, but must be correct if present. + If the compression method is stored and the output is not patchable + the compression for that entry is automatically changed to deflate level 0 + + + the entry. + + + if entry passed is null. + + + if an I/O error occurred. + + + if stream was finished + + + Too many entries in the Zip file
+ Entry name is too long
+ Finish has already been called
+
+ + The Compression method specified for the entry is unsupported. + +
+ + + Starts a new passthrough Zip entry. It automatically closes the previous + entry if present. + Passthrough entry is an entry that is created from compressed data. + It is useful to avoid recompression to save CPU resources if compressed data is already disposable. + All entry elements bar name, crc, size and compressed size are optional, but must be correct if present. + Compression should be set to Deflated. + + + the entry. + + + if entry passed is null. + + + if an I/O error occurred. + + + if stream was finished. + + + Crc is not set
+ Size is not set
+ CompressedSize is not set
+ CompressionMethod is not Deflate
+ Too many entries in the Zip file
+ Entry name is too long
+ Finish has already been called
+
+ + The Compression method specified for the entry is unsupported
+ Entry is encrypted
+
+
+ + + Starts a new Zip entry. It automatically closes the previous + entry if present. + All entry elements bar name are optional, but must be correct if present. + If the compression method is stored and the output is not patchable + the compression for that entry is automatically changed to deflate level 0 + + + the entry. + + The that can be used to cancel the operation. + + if entry passed is null. + + + if an I/O error occured. + + + if stream was finished + + + Too many entries in the Zip file
+ Entry name is too long
+ Finish has already been called
+
+ + The Compression method specified for the entry is unsupported. + +
+ + + Closes the current entry, updating header and footer information as required + + + Invalid entry field values. + + + An I/O error occurs. + + + No entry is active. + + + + + + + + Initializes encryption keys based on given password. + + + + + Initializes encryption keys based on given . + + The password. + + + + Writes the given buffer to the current entry. + + The buffer containing data to write. + The offset of the first byte to write. + The number of bytes to write. + Archive size is invalid + No entry is active. + + + + + + + Finishes the stream. This will write the central directory at the + end of the zip file and flush the stream. + + + This is automatically called when the stream is closed. + + + An I/O error occurs. + + + Comment exceeds the maximum length
+ Entry name exceeds the maximum length +
+
+ + > + + + + Flushes the stream by calling Flush on the deflater stream unless + the current compression method is . Then it flushes the underlying output stream. + + + + + The entries for the archive. + + + + + Used to track the crc of data added to entries. + + + + + The current entry being added. + + + + + Used to track the size of data for an entry during writing. + + + + + Offset to be recorded for each entry in the central header. + + + + + Comment for the entire archive recorded in central header. + + + + + Flag indicating that header patching is required for the current entry. + + + + + The values to patch in the entry local header + + + + + The password to use when encrypting archive entries. + + + + + Deprecated way of setting zip encoding provided for backwards compability. + Use when possible. + + + If any ZipStrings properties are being modified, it will enter a backwards compatibility mode, mimicking the + old behaviour where a single instance was shared between all Zip* instances. + + + + + Returns a new instance or the shared backwards compatible instance. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Utility class for resolving the encoding used for reading and writing strings + + + + + Creates a StringCodec that uses the system default encoder or UTF-8 depending on whether the zip entry Unicode flag is set + + + + + Creates a StringCodec that uses an encoding from the specified code page except for zip entries with the Unicode flag + + + + + Creates a StringCodec that uses an the specified encoding, except for zip entries with the Unicode flag + + + + + Creates a StringCodec that uses the zip specification encoder or UTF-8 depending on whether the zip entry Unicode flag is set + + + + + If set, use the encoding set by for zip entries instead of the defaults + + + + + The default encoding used for ZipCrypto passwords in zip files, set to + for greatest compability. + + + + + Returns the encoding for an output . + Unless overriden by it returns . + + + + + Returns if is set, otherwise it returns the encoding indicated by + + + + + Returns the appropriate encoding for an input according to . + If overridden by , it always returns the encoding indicated by . + + + + + + + + + Code page encoding, used for non-unicode strings + + The original Zip specification (https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT) states + that file names should only be encoded with IBM Code Page 437 or UTF-8. + In practice, most zip apps use OEM or system encoding (typically cp437 on Windows). + + + + + Returns the UTF-8 code page (65001) used for zip entries with unicode flag set + + + + + Code page used for non-unicode strings and legacy zip encoding (if is set). + Default value is + + + + + The non-unicode code page that should be used according to the zip specification + + + + + Operating system default codepage. + + + + + The system default encoding. + + + + + The encoding used for the zip archive comment. Defaults to the encoding for , since + no unicode flag can be set for it in the files. + + + + + The encoding used for the ZipCrypto passwords. Defaults to . + + + + + Create a copy of this StringCodec with the specified zip archive comment encoding + + + + + + + Create a copy of this StringCodec with the specified zip crypto password encoding + + + + + + + Create a copy of this StringCodec that ignores the Unicode flag when reading entries + + + + + diff --git a/Misc/UnityPackage/Plugins/ICSharpCode.SharpZipLib.xml.meta b/Misc/UnityPackage/Plugins/ICSharpCode.SharpZipLib.xml.meta new file mode 100644 index 0000000..5b18638 --- /dev/null +++ b/Misc/UnityPackage/Plugins/ICSharpCode.SharpZipLib.xml.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d380f7dd7bf5e244a9314f6bfdf5c96b +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Misc/UnityPackage/Plugins/PDFtoZPL.dll b/Misc/UnityPackage/Plugins/PDFtoZPL.dll index e177ee62a4d5e9a6f0dd72f62e87acaa34504d54..7b8c54ac8028af0ebc6d9e72acd500cbb00a4d46 100644 GIT binary patch delta 2980 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 E03@hc<^TWy diff --git a/Misc/UnityPackage/Plugins/System.Threading.Tasks.Extensions.dll b/Misc/UnityPackage/Plugins/System.Threading.Tasks.Extensions.dll new file mode 100644 index 0000000000000000000000000000000000000000..a99c9077b12a1e25e93165fb38e5e2bad5f8461e GIT binary patch literal 33008 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 aeU{Qj_Ga<9gS}oKh!eN!P^b7sng0WqAbHLJ literal 0 HcmV?d00001 diff --git a/Misc/UnityPackage/Plugins/System.Threading.Tasks.Extensions.dll.meta b/Misc/UnityPackage/Plugins/System.Threading.Tasks.Extensions.dll.meta new file mode 100644 index 0000000..70d3768 --- /dev/null +++ b/Misc/UnityPackage/Plugins/System.Threading.Tasks.Extensions.dll.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 13c96d5a30175c540a70877554aa42e9 \ No newline at end of file diff --git a/Misc/UnityPackage/Plugins/System.Threading.Tasks.Extensions.xml b/Misc/UnityPackage/Plugins/System.Threading.Tasks.Extensions.xml new file mode 100644 index 0000000..5e02a99 --- /dev/null +++ b/Misc/UnityPackage/Plugins/System.Threading.Tasks.Extensions.xml @@ -0,0 +1,166 @@ + + + System.Threading.Tasks.Extensions + + + + + + + + + + + + + + + + + + + Provides a value type that wraps a and a TResult, only one of which is used. + The result. + + + Initializes a new instance of the class using the supplied task that represents the operation. + The task. + The task argument is null. + + + Initializes a new instance of the class using the supplied result of a successful operation. + The result. + + + Retrieves a object that represents this . + The object that is wrapped in this if one exists, or a new object that represents the result. + + + Configures an awaiter for this value. + true to attempt to marshal the continuation back to the captured context; otherwise, false. + The configured awaiter. + + + Creates a method builder for use with an async method. + The created builder. + + + Determines whether the specified object is equal to the current object. + The object to compare with the current object. + true if the specified object is equal to the current object; otherwise, false. + + + Determines whether the specified object is equal to the current object. + The object to compare with the current object. + true if the specified object is equal to the current object; otherwise, false. + + + Creates an awaiter for this value. + The awaiter. + + + Returns the hash code for this instance. + The hash code for the current object. + + + Gets a value that indicates whether this object represents a canceled operation. + true if this object represents a canceled operation; otherwise, false. + + + Gets a value that indicates whether this object represents a completed operation. + true if this object represents a completed operation; otherwise, false. + + + Gets a value that indicates whether this object represents a successfully completed operation. + true if this object represents a successfully completed operation; otherwise, false. + + + Gets a value that indicates whether this object represents a failed operation. + true if this object represents a failed operation; otherwise, false. + + + Compares two values for equality. + The first value to compare. + The second value to compare. + true if the two values are equal; otherwise, false. + + + Determines whether two values are unequal. + The first value to compare. + The seconed value to compare. + true if the two values are not equal; otherwise, false. + + + Gets the result. + The result. + + + Returns a string that represents the current object. + A string that represents the current object. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Misc/UnityPackage/Plugins/System.Threading.Tasks.Extensions.xml.meta b/Misc/UnityPackage/Plugins/System.Threading.Tasks.Extensions.xml.meta new file mode 100644 index 0000000..ca3d6b5 --- /dev/null +++ b/Misc/UnityPackage/Plugins/System.Threading.Tasks.Extensions.xml.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8cbebc7fbb98b0346907776054c29f93 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Misc/UnityPackage/package.json b/Misc/UnityPackage/package.json index d398b58..ec47ad3 100644 --- a/Misc/UnityPackage/package.json +++ b/Misc/UnityPackage/package.json @@ -1,15 +1,15 @@ { "name": "de.sungaila.pdftozpl", - "version": "5.3.1", + "version": "6.0.0", "displayName": "PDFtoZPL", "description": "A .NET library to convert PDF files (and bitmaps) into Zebra Programming Language code.", - "unity": "2022.3", + "unity": "6000.0", "documentationUrl": "https://github.com/sungaila/PDFtoZPL", - "changelogUrl": "https://github.com/sungaila/PDFtoZPL/releases/tag/v5.3.1", + "changelogUrl": "https://github.com/sungaila/PDFtoZPL/releases/tag/v6.0.0", "license": "MIT", "licensesUrl": "https://github.com/sungaila/PDFtoZPL/blob/master/LICENSE", "dependencies": { - "de.sungaila.pdftoimage": "4.1.1" + "de.sungaila.pdftoimage": "5.0.0" }, "keywords": [ "PDF",
+ Get / set a flag indicating whether entry name and comment text are + encoded in unicode UTF8. +