Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Creating & Extracting ZIP files?
Message
From
23/12/2003 11:42:46
 
General information
Forum:
Visual FoxPro
Category:
Windows API functions
Miscellaneous
Thread ID:
00859913
Message ID:
00861665
Views:
20
Micheal,

I can't find Zip compression or extraction in my copy of Windows XP.

There is some discussion of compression formats, in the Win32API calls, to enable you to compress and decompress either a file or directory. This is a long way from the Zip facility of combining files into one compressed archive with diskette spanning, etc.

It is possible to get this limited compression under XP, by right clicking the file name, selecting properties then Advanced then checking 'Compress contents to save disk space'.

I had a go at trying to do this (see code below) using the API calls but came unstuck at DeviceIoControl. I expect it's obvious to an expert, but I can't get this call to return True.

Help anyone?

Alan
lpFileName = 'C:\temp\fredold.txt'
* This file exists and has been compressed

* Get the file handle for read and write
#DEFINE OPEN_EXISTING        0x00000003
#DEFINE GENERIC_READ         0x80000000
#DEFINE GENERIC_WRITE        0x40000000
#DEFINE INVALID_HANDLE       -1

DECLARE INTEGER CreateFile IN kernel32 ;
        STRING  @ lpFileName          ,;
        INTEGER dwDesiredAccess       ,;
        INTEGER dwShareMode           ,;
        INTEGER @ lpSecurityAttributes,;
        INTEGER dwCreationDistribution,;
        INTEGER dwFlagsAndAttributes  ,;
        INTEGER hTemplateFile

dwDesiredAccess = GENERIC_READ + GENERIC_WRITE

hFile1 = CreateFile( ;
   @lpFileName      ,;
   dwDesiredAccess  ,;
   0                ,;
   0                ,;
   OPEN_EXISTING    ,;
   0                ,;
   0)

IF hFile1 <> INVALID_HANDLE

   #DEFINE COMPRESSION_FORMAT_NONE     0x0000
   #DEFINE COMPRESSION_FORMAT_DEFAULT  0x0001
   #DEFINE COMPRESSION_FORMAT_LZNT1    0x0002
   #DEFINE FSCTL_SET_COMPRESSION       0x00F0
   #DEFINE FSCTL_GET_COMPRESSION       0x000F 

   DECLARE INTEGER DeviceIoControl IN kernel32 ;
           INTEGER hDevice                    ,;
           INTEGER dwIoControlCode            ,;
           STRING  @ lpInBuffer               ,;
           INTEGER nInBufferSize              ,;
           STRING  @ lpOutBuffer              ,;
           INTEGER nOutBufferSize             ,;
           STRING  @ lpBytesReturned          ,;
           STRING  @ lpOverlapped
	
   dwIoControlCode = FSCTL_GET_COMPRESSION 
   lpInBuffer = '' 
   nInBufferSize = 0
   lpOutBuffer = '  '
   nOutBufferSize = 2 
   lpBytesReturned = '    '
   
   * Find current compression of the file using DeviceIoControl
   RetVal = DeviceIoControl(    ;
         hFile1                ,;
         FSCTL_GET_COMPRESSION ,;
         @lpInBuffer           ,;
         nInBufferSize         ,;
         @lpOutBuffer          ,;
         nOutBufferSize        ,;
         @lpBytesReturned      ,;
         0)
         
   IF RetVal = 0 && DeviceIoControl failed
      MESSAGEBOX('DeviceIoControl failed')
   ELSE
     * Two bytes
      Bufval = 0
      FOR t = 0 TO 1
         BufVal = BufVal + ASC(SUBSTR(lpOutBuffer, t+1, 1))*256^t
      ENDFOR
      DO CASE
      CASE BufVal = COMPRESSION_FORMAT_NONE
         MESSAGEBOX('COMPRESSION_FORMAT_NONE')
      CASE BufVal = COMPRESSION_FORMAT_LZNT1	
         MESSAGEBOX('COMPRESSION_FORMAT_LZNT1')
      ENDCASE
   ENDIF

ENDIF

* Close the file
IF hFile1>0
   DECLARE INTEGER CloseHandle IN kernel32 ;
           INTEGER hObject
   lnClosed = CloseHandle(hFile1)
   IF lnClosed = 0
      MESSAGEBOX('Failed to close the file')
   ENDIF
ENDIF
Previous
Next
Reply
Map
View

Click here to load this message in the networking platform