您可以使用一些互操作代码执行此操作:
[DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
[return: MarshalAsAttribute(UnmanagedType.Bool)]
public static extern bool PathIsDirectory([MarshalAsAttribute(UnmanagedType.LPWStr), In] string pszPath);
为了进一步澄清一些评论...
在.NET中引入非托管代码并不比.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权限。