title: Difference between "Network path not found" and "Access denied" in C#
body: <p>In my C# .NET 2.0 application I'm accessing network paths, and I'd like to be able to tell the difference between paths that don't exist, and paths which do exist but for which I don't have access rights.  I tried doing the following:</p>
  
  <pre><code>try
  {
      string[] contents = Directory.GetFileSystemEntries( path );
  }
  catch( Exception e )
  {
      if( e is DirectoryNotFoundException )
          MessageBox.Show( "Path not found" );
      else
          MessageBox.Show( "Access denied" );
  }
  </code></pre>
  
  <p>This works fine for local paths, but for network paths, the exception is always System.IO.IOException, regardless of the reason for the error.  The exception Message field shows a different message depending on whether the path exists or not, so clearly the information is available at some point, but I can't get to it.  Is there a way to differentiate between "path not found" and "access denied" for network paths?</p>
  
  <p>Edit:  So, in case anyone else wants the quick solution to this, as suggested by <a href="https://stackoverflow.com/users/148897/henrik">henrik</a>, and incorporating <a href="https://stackoverflow.com/users/50846/peshir">peSHIr</a>'s advice, here is what you can do:</p>
  
  <pre><code>try
  {
      // Issue this call just to find out whether the path exists
      // We don't care about the result
  
      string[] contents = Directory.GetFileSystemEntries( path );
  
      // If we get this far then the path exists.
  }
  catch( IOException e )
  {
      uint error = (uint)Marshal.GetHRForException( e );
  
      if( error == (uint)0x80070041 )     // ERROR_NETWORK_ACCESS_DENIED
      {
          // The poor deluded user doesn't have access rights
  
          this.SuperProprietaryTechniqueForGettingAccessRights();
      }
      else
      {
          // Hah! The idiot user specified a path that doesn't exist!
          // Chastise them severely, like all good GUI should.
  
          MessageBox.Show( "NO! BAD USER!" );
      }
  }
  catch 
  {
      // Swallow all other types of exception - we only made the call
      // to find out whether the path exists.
  }
  </code></pre>