Search
Module:
Directory

   Desktop Functions:

   Smart Device Functions:


Show Recent Changes
Subscribe (RSS)
Misc. Pages
Comments
FAQ
Helpful Tools
Playground
Suggested Reading
Website TODO List
Download Visual Studio Add-In

GetCompressedFileSize (kernel32)
 
.
Summary

C# Signature:

[DllImport("kernel32.dll")]
static extern uint GetCompressedFileSize(string lpFileName,
   out uint lpFileSizeHigh);

VB .NET Signature:

Private Declare Function GetCompressedFileSize Lib "kernel32" Alias "GetCompressedFileSizeA" (ByVal lpFileName As String, ByVal lpFileSizeHigh As IntPtr) As UInt32

Legacy VB Signature:

Private Declare Function GetCompressedFileSize Lib "kernel32" Alias "GetCompressedFileSizeA" (ByVal lpFileName As String, lpFileSizeHigh As Long) As Long

User-Defined Types:

None.

Notes:

The code below correctly obtains the compressed file size also if above 4GB. (Fixed VB and C# code, 2012 Eske Rahn)

Tips & Tricks:

Please add some!

Sample Code C#:

    [DllImport("kernel32.dll", SetLastError=true, EntryPoint="GetCompressedFileSize")]
    static extern uint GetCompressedFileSizeAPI(string lpFileName, out uint lpFileSizeHigh);

    public ulong GetCompressedFileSize(string filename)
    {
        uint high;
        uint low;
        low = GetCompressedFileSizeAPI(filename, out high);
        int error = Marshal.GetLastWin32Error();
        if (low == 0xFFFFFFFF && error != 0)
        throw new Win32Exception(error);
        else
        return ((ulong)high << 32) + low;
    }

Sample Code VB .NET:

Imports System.IO
·
·
·
Public Function CompressedFileSize(ByVal path As String) As Long
   If File.Exist(path) Then
     Try
       ' Return Convert.ToInt64(GetCompressedFileSize(path, IntPtr.Zero))

       ' To handle 4Gb+ a bit more complex:
       Dim ptr As IntPtr = Marshal.AllocHGlobal(4)
       Try
         Dim filelength as Long = Convert.ToInt64(GetCompressedFileSize(path, ptr))
         If filelength = &HFFFFFFFF Then
           Dim Err As Long = Marshal.GetLastWin32Error()
           If Err <> 0 Then Throw New IOException("Exception getting compressed size: " & Err.ToString)
         End If
         Return filelength + CLng(Marshal.ReadInt32(ptr)) << 32
       Finally
         Marshal.FreeHGlobal(ptr)
       End Try
     Catch ex As Exception
       Throw New IOException("The compressed size of the specified file could not be determined.")
     End Try

   End If

End Function

Sample code legacy VB:

Private Sub GetFileSize(ByVal strPath As String)
   MsgBox "The size of " + strPath " is " + CStr(GetCompressedFileSize(strPath, ByVal 0&)) + " bytes "
End Sub

Alternative Managed API:

The ManagedWindowsApi project (http://mwinapi.sourceforge.net) provides an ExtendedFileInfo class that contains utility methods for file information.

Documentation

Please edit this page!

Do you have...

  • helpful tips or sample code to share for using this API in managed code?
  • corrections to the existing content?
  • variations of the signature you want to share?
  • additional languages you want to include?

Select "Edit This Page" on the right hand toolbar and edit it! Or add new pages containing supporting types needed for this API (structures, delegates, and more).

 
Access PInvoke.net directly from VS:
Terms of Use
Edit This Page
Find References
Show Printable Version
Revisions