Sie können dies mit einem Interop-Code tun:
[DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
[return: MarshalAsAttribute(UnmanagedType.Bool)]
public static extern bool PathIsDirectory([MarshalAsAttribute(UnmanagedType.LPWStr), In] string pszPath);
Um einige der Kommentare weiter zu verdeutlichen ...
Das Einführen von nicht verwaltetem Code ist nicht gefährlicher als alle anderen Datei- oder E / A-bezogenen Aufrufe in .NET, da letztendlich alle nicht verwalteten Code aufrufen.
Dies ist ein einzelner Funktionsaufruf mit einer Zeichenfolge. Durch Aufrufen dieser Funktion werden keine neuen Datentypen und / oder Speichernutzung eingeführt. Ja, Sie müssen sich auf den nicht verwalteten Code verlassen, um ordnungsgemäß zu bereinigen, aber letztendlich haben Sie diese Abhängigkeit von den meisten E / A-bezogenen Aufrufen.
Als Referenz finden Sie hier den Code für File.GetAttributes (Zeichenfolgenpfad) von Reflector:
public static FileAttributes GetAttributes(string path)
{
string fullPathInternal = Path.GetFullPathInternal(path);
new FileIOPermission(FileIOPermissionAccess.Read, new string[] { fullPathInternal }, false, false).Demand();
Win32Native.WIN32_FILE_ATTRIBUTE_DATA data = new Win32Native.WIN32_FILE_ATTRIBUTE_DATA();
int errorCode = FillAttributeInfo(fullPathInternal, ref data, false, true);
if (errorCode != 0)
{
__Error.WinIOError(errorCode, fullPathInternal);
}
return (FileAttributes) data.fileAttributes;
}
Wie Sie sehen können, wird auch nicht verwalteter Code aufgerufen, um die Dateiattribute abzurufen. Daher sind die Argumente zur Einführung von nicht verwaltetem Code, der gefährlich ist, ungültig. Ebenso das Argument, vollständig im verwalteten Code zu bleiben. Hierfür gibt es keine Implementierung von verwaltetem Code. Selbst das Aufrufen von File.GetAttributes (), wie in den anderen Antworten vorgeschlagen, hat die gleichen "Probleme" beim Aufrufen von nicht geändertem Code, und ich glaube, dies ist die zuverlässigere Methode, um festzustellen, ob ein Pfad ein Verzeichnis ist.
Bearbeiten Um den Kommentar von @Christian K zu CAS zu beantworten. Ich glaube, der einzige Grund, warum GetAttributes die Sicherheitsanforderung stellt, ist, dass es die Eigenschaften der Datei lesen muss, um sicherzustellen, dass der aufrufende Code die Berechtigung dazu hat. Dies ist nicht dasselbe wie die zugrunde liegenden Betriebssystemprüfungen (falls vorhanden). Sie können jederzeit eine Wrapper-Funktion um den P / Invoke-Aufruf von PathIsDirectory erstellen, die bei Bedarf auch bestimmte CAS-Berechtigungen erfordert.