Вы можете сделать это с помощью некоторого кода взаимодействия:
[DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
[return: MarshalAsAttribute(UnmanagedType.Bool)]
public static extern bool PathIsDirectory([MarshalAsAttribute(UnmanagedType.LPWStr), In] string pszPath);
Для дальнейшего уточнения некоторых комментариев ...
Внедрение неуправляемого кода в это не более опасно, чем любые другие вызовы файлов или операций ввода-вывода в .NET, так как они в конечном итоге все вызывают неуправляемый код.
Это единственный вызов функции с использованием строки. Вы не вводите новые типы данных и / или использование памяти, вызывая эту функцию. Да, вам нужно полагаться на неуправляемый код для правильной очистки, но в конечном итоге вы зависите от большинства вызовов, связанных с вводом / выводом.
Для справки, вот код File.GetAttributes (путь строки) из 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;
}
Как видите, он также вызывает неуправляемый код для получения атрибутов файла, поэтому аргументы о том, что неуправляемый код опасен, недопустимы. Аналогично, аргумент о том, чтобы полностью оставаться в управляемом коде. Для этого не существует управляемой реализации кода. Даже вызов File.GetAttributes (), как предлагают другие ответы, имеет те же «проблемы» вызова неуправляемого кода, и я считаю, что это более надежный метод для определения, является ли путь каталогом.
Редактировать Чтобы ответить на комментарий @Christian K о CAS. Я полагаю, что единственная причина, по которой GetAttributes предъявляет требования безопасности, заключается в том, что ему нужно прочитать свойства файла, поэтому он хочет убедиться, что вызывающий код имеет разрешение на это. Это не то же самое, что проверки ОС (если они есть). Вы всегда можете создать функцию-оболочку вокруг вызова P / Invoke PathIsDirectory, которая также при необходимости требует определенных разрешений CAS.