GetVolumeInformation

C++ Signature:

TCHAR volumeName[MAX_PATH + 1] = { 0 };
    TCHAR fileSystemName[MAX_PATH + 1] = { 0 };
    DWORD serialNumber = 0;
    DWORD maxComponentLen = 0;
    DWORD fileSystemFlags = 0;
    if (GetVolumeInformation(
        _T("C:\\"),
        volumeName,
        ARRAYSIZE(volumeName),
        &serialNumber,
        &maxComponentLen,
        &fileSystemFlags,
        fileSystemName,
        ARRAYSIZE(fileSystemName)))
    {
        m_sn_textbox.Format(_T("GetVolumeInformation : %lu"),serialNumber);
    }

C# Signature:

[DllImport("Kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  [return: MarshalAs(UnmanagedType.Bool)]
  public extern static bool GetVolumeInformation(
    string rootPathName,
    StringBuilder volumeNameBuffer,
    int volumeNameSize,
    out uint volumeSerialNumber,
    out uint maximumComponentLength,
    out FileSystemFeature fileSystemFlags,
    StringBuilder fileSystemNameBuffer,
    int nFileSystemNameSize);

VB Signature:

Private Declare Auto Function GetVolumeInformation Lib "kernel32.dll" ( _
     ByVal RootPathName As String, _
     ByVal VolumeNameBuffer As System.Text.StringBuilder, _
     ByVal VolumeNameSize As UInt32, _
     ByRef VolumeSerialNumber As UInt32, _
     ByRef MaximumComponentLength As UInt32, _
     ByRef FileSystemFlags As UInt32, _
     ByVal FileSystemNameBuffer As System.Text.StringBuilder, _
     ByVal FileSystemNameSize As UInt32) As UInt32

User-Defined Types:

[Flags]
  public enum FileSystemFeature : uint {
    /// <summary>
    /// The file system preserves the case of file names when it places a name on disk.
    /// </summary>
    CasePreservedNames = 2,

    /// <summary>
    /// The file system supports case-sensitive file names.
    /// </summary>
    CaseSensitiveSearch = 1,

    /// <summary>
    /// The specified volume is a direct access (DAX) volume. This flag was introduced in Windows 10, version 1607.
    /// </summary>
    DaxVolume = 0x20000000,

    /// <summary>
    /// The file system supports file-based compression.
    /// </summary>
    FileCompression = 0x10,

    /// <summary>
    /// The file system supports named streams.
    /// </summary>
    NamedStreams = 0x40000,

    /// <summary>
    /// The file system preserves and enforces access control lists (ACL).
    /// </summary>
    PersistentACLS = 8,

    /// <summary>
    /// The specified volume is read-only.
    /// </summary>
    ReadOnlyVolume = 0x80000,

    /// <summary>
    /// The volume supports a single sequential write.
    /// </summary>
    SequentialWriteOnce = 0x100000,

    /// <summary>
    /// The file system supports the Encrypted File System (EFS).
    /// </summary>
    SupportsEncryption = 0x20000,

    /// <summary>
    /// The specified volume supports extended attributes. An extended attribute is a piece of
    /// application-specific metadata that an application can associate with a file and is not part
    /// of the file's data.
    /// </summary>
    SupportsExtendedAttributes = 0x00800000,

    /// <summary>
    /// The specified volume supports hard links. For more information, see Hard Links and Junctions.
    /// </summary>
    SupportsHardLinks = 0x00400000,

    /// <summary>
    /// The file system supports object identifiers.
    /// </summary>
    SupportsObjectIDs = 0x10000,

    /// <summary>
    /// The file system supports open by FileID. For more information, see FILE_ID_BOTH_DIR_INFO.
    /// </summary>
    SupportsOpenByFileId = 0x01000000,

    /// <summary>
    /// The file system supports re-parse points.
    /// </summary>
    SupportsReparsePoints = 0x80,

    /// <summary>
    /// The file system supports sparse files.
    /// </summary>
    SupportsSparseFiles = 0x40,

    /// <summary>
    /// The volume supports transactions.
    /// </summary>
    SupportsTransactions = 0x200000,

    /// <summary>
    /// The specified volume supports update sequence number (USN) journals. For more information,
    /// see Change Journal Records.
    /// </summary>
    SupportsUsnJournal = 0x02000000,

    /// <summary>
    /// The file system supports Unicode in file names as they appear on disk.
    /// </summary>
    UnicodeOnDisk = 4,

    /// <summary>
    /// The specified volume is a compressed volume, for example, a DoubleSpace volume.
    /// </summary>
    VolumeIsCompressed = 0x8000,

    /// <summary>
    /// The file system supports disk quotas.
    /// </summary>
    VolumeQuotas = 0x20
  }

Sample Code:

StringBuilder volname = new StringBuilder(261);
StringBuilder fsname = new StringBuilder(261);
uint sernum, maxlen;
FileSystemFeature flags;
if(!GetVolumeInformation("c:\\", volname, volname.Capacity, out sernum, out maxlen, out flags, fsname, fsname.Capacity))
    Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());
string volnamestr = volname.ToString();
string fsnamestr = fsname.ToString();

Sample code - VB.NET:

''' <summary>
   ''' Returns volume name and serial number, maximum path component length, and filesystem name and flags
   ''' for the specified directory. Works with UNC. Can throw an exception.
   ''' </summary>
   ''' <param name="FolderPath">Path to drive or shared folder to find about.</param>
   ''' <param name="VolumeName">Returns volume name.</param>
   ''' <param name="VolumeSerialNumber">Returns volume serial number.</param>
   ''' <param name="MaxComponentLength">Returns max. path component lenght.</param>
   ''' <param name="FileSystemFlags">Returns file system flags - see http://msdn.microsoft.com/en-us/library/aa364993(VS.85).aspx</param>
   ''' <param name="FileSystemName">Returns file system name.</param>
   ''' <remarks></remarks>
   Public Sub GetVolumeInfo( _
     ByVal FolderPath As String, _
     ByRef VolumeName As String, _
     ByRef VolumeSerialNumber As String, _
     ByRef MaxComponentLength As UInt32, _
     ByRef FileSystemFlags As UInt32, _
     ByRef FileSystemName As String)
      ' see http://msdn.microsoft.com/en-us/library/aa364993(VS.85).aspx
      Dim sRootFolder As String = IO.Path.GetPathRoot(FolderPath)
      If Not sRootFolder.EndsWith("\") Then sRootFolder &= "\"
      Const MAX_PATH As Integer = &H104
      Dim volname As New System.Text.StringBuilder(MAX_PATH + 1)
      Dim fsname As New System.Text.StringBuilder(MAX_PATH + 1)
      Dim sernum As UInt32
      Dim RetVal As UInt32 = GetVolumeInformation(sRootFolder, volname, volname.Capacity, _
                          sernum, MaxComponentLength, FileSystemFlags, _
                          fsname, fsname.Capacity)
      If RetVal = 0 Then Throw New System.ComponentModel.Win32Exception(Err.LastDllError)
      VolumeName = volname.ToString
      FileSystemName = fsname.ToString

      Dim hpart, lpart As Integer
      hpart = sernum \ 65536
      lpart = sernum - hpart * 65536L
      VolumeSerialNumber = Hex(hpart).PadLeft(4, "0"c) & "-" & Hex(lpart).PadLeft(4, "0"c)
   End Sub

Sample:

'Check for valid drive letter argument. 
    Dim ValidDriveLetters As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    If ValidDriveLetters.IndexOf(DriveLetter) <> -1 Then
    If DriveLetter.Length = 1 Then
        Dim Disk As New System.Management.ManagementObject("Win32_LogicalDisk.DeviceID=""" & DriveLetter & ":""")
        Dim DiskProperty As System.Management.PropertyData
        For Each DiskProperty In Disk.Properties
        If DiskProperty.Name = "VolumeSerialNumber" Then
            Return DiskProperty.Value.ToString  '.ToString 'Return the volume serial number. 
        End If
        Next DiskProperty
    End If
    End If
    Return Nothing 'Invalid drive letter.

Última actualización