GetFileAttributes (kernel32)
Last changed: mklement0-173.48.238.201

.
Summary

C# Signature:

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern uint GetFileAttributes(string lpFileName);

// Frequently used constants (incomplete - see https://msdn.microsoft.com/en-us/library/windows/desktop/gg258117(v=vs.85).aspx for full list)
const unit FILE_ATTRIBUTE_ARCHIVE = 0x20;
const unit FILE_ATTRIBUTE_DIRECTORY = 0x10;
const unit FILE_ATTRIBUTE_HIDDEN = 0x2;
const unit FILE_ATTRIBUTE_NORMAL = 0x80;
const unit FILE_ATTRIBUTE_READONLY = 0x1;
const unit FILE_ATTRIBUTE_SYSTEM = 0x4;
const unit FILE_ATTRIBUTE_TEMPORARY = 0x100;
const uint INVALID_FILE_ATTRIBUTES = 0xffffffff;

VB.Net Signature:

<DllImport("kernel32.dll")>_
Public Shared Function GetFileAttributes(ByVal lpFileName As String) As Integer
End Function

' Frequently used constants  (incomplete - see https://msdn.microsoft.com/en-us/library/windows/desktop/gg258117(v=vs.85).aspx for full list)
Const FILE_ATTRIBUTE_ARCHIVE = &H20
Const FILE_ATTRIBUTE_DIRECTORY = &H10
Const FILE_ATTRIBUTE_HIDDEN = &H2
Const FILE_ATTRIBUTE_NORMAL = &H80
Const FILE_ATTRIBUTE_READONLY = &H1
Const FILE_ATTRIBUTE_SYSTEM = &H4
Const FILE_ATTRIBUTE_TEMPORARY = &H100
Const INVALID_FILE_ATTRIBUTES = &Hffffffff

User-Defined Types:

None.

Notes:

For long file names (260+ characters) prepend "\\?\" to the file name for local files and "\\?\UNC\" for network files.

e.g. D:\A\B\...\C --> \\?\D:\A\B\...\C and \\oscar\meyer\A\B\...\C --> \\?\UNC\oscar\meyer\A\B\...\C

Updated the C# return type from int to uint. MSDN says it's a DWORD and DWORD is an unsigned integer.

Tips & Tricks:

Please add some!

Sample Code:

C#

  [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  static extern uint GetFileAttributes(string lpFileName);
  const uint FILE_ATTRIBUTE_ARCHIVE = 0x20;

....

  if ((GetFileAttributes(@"\\?\UNC\" + file) & FILE_ATTRIBUTE_ARCHIVE) != FILE_ATTRIBUTE_ARCHIVE)
  {
      bool deleted =DeleteFileW(@"\\?\UNC\"+file);
      if (!deleted)
      {
      int lastError = Marshal.GetLastWin32Error();
      Console.WriteLine("Failed to delete '{1}': error={0}", lastError, file);    
      }
  }

Alternative Managed API:

System.IO.File.GetAttributes

Documentation