您可以使用一些互操作代码来做到这一点:
[DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
[return: MarshalAsAttribute(UnmanagedType.Bool)]
public static extern bool PathIsDirectory([MarshalAsAttribute(UnmanagedType.LPWStr), In] string pszPath);
为了进一步澄清一些评论......
在此引入非托管代码并不比 .NET 中的任何其他文件或 I/O 相关调用更危险,因为它们最终都调用非托管代码。
这是使用字符串的单个函数调用。通过调用此函数,您不会引入任何新的数据类型和/或内存使用。是的,您确实需要依赖非托管代码来正确清理,但您最终对大多数 I/O 相关调用都有依赖。
作为参考,这里是来自 Reflector 的 File.GetAttributes(string path) 的代码:
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 提出安全要求的唯一原因是因为它需要读取文件的属性,因此它希望确保调用代码具有这样做的权限。这与底层操作系统检查(如果有的话)不同。如有必要,您始终可以围绕对 PathIsDirectory 的 P/Invoke 调用创建一个包装函数,该函数还需要某些 CAS 权限。