diff --git a/libmspack4n/MSCompressedFile.cs b/libmspack4n/MSCompressedFile.cs index f5812c8..bb78b08 100644 --- a/libmspack4n/MSCompressedFile.cs +++ b/libmspack4n/MSCompressedFile.cs @@ -64,13 +64,15 @@ namespace LibMSPackN { ThrowOnInvalidState(); IntPtr pDestinationFilename = IntPtr.Zero; + string longDestinationFilename = longFilename(destinationFilename); try { - pDestinationFilename = Marshal.StringToCoTaskMemAnsi(destinationFilename); + pDestinationFilename = Marshal.StringToCoTaskMemAnsi(longDestinationFilename); var result = NativeMethods.mspack_invoke_mscab_decompressor_extract(_parentCabinet.Decompressor, _pNativeFile, pDestinationFilename); if (result != NativeMethods.MSPACK_ERR.MSPACK_ERR_OK) - throw new Exception(string.Format("Error '{0}' extracting file to {1}.", result, destinationFilename)); + throw new Exception(string.Format("Error '{0}' extracting file to {1}.", result, longDestinationFilename)); + /* This needs to be done using win32 calls. var modifiedTime = GetModifiedTime(); File.SetCreationTime(destinationFilename, modifiedTime); File.SetLastWriteTime(destinationFilename, modifiedTime); @@ -85,6 +87,7 @@ namespace LibMSPackN if ((_nativeFile.attribs & NativeMethods.mscabd_file_attribs.MSCAB_ATTRIB_SYSTEM) == NativeMethods.mscabd_file_attribs.MSCAB_ATTRIB_SYSTEM) theAttributes |= FileAttributes.System; File.SetAttributes(destinationFilename, theAttributes); + */ } finally { @@ -93,6 +96,21 @@ namespace LibMSPackN } } + private string longFilename(string filename) + { + if (filename.StartsWith("\\\\?\\")) + { + return filename; + } + else + { + if (filename.StartsWith("\\\\")) + return "\\\\?\\UNC\\" + filename.Substring(2); + else + return "\\\\?\\" + filename; + } + } + private DateTime GetModifiedTime() { return new DateTime(_nativeFile.date_y, _nativeFile.date_m, _nativeFile.date_d, _nativeFile.time_h, _nativeFile.time_m, _nativeFile.time_s);