Ви можете зробити це за допомогою коду взаємодії:
[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, якщо це необхідно.