GetCompressedFileSize (kernel32)
Last changed: -77.213.234.148

.
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 C# code below correctly obtains the compressed file size if >4 GB. The sample VB code does not appear to do so properly.

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 (high == 0 && 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)
       Marshal.WriteInt32(ptr, FileSizeHigh)
       Dim filelength as Long = Convert.ToInt64(GetCompressedFileSize(path, ptr))
       filesizehigh = Marshal.ReadInt32(ptr)
       filelength += CLng(filesizehigh) << 32
       Marshal.FreeHGlobal(ptr)
       Return filelength

     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