你可以用一些互操作的代码做到这一点:
[DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
[return: MarshalAsAttribute(UnmanagedType.Bool)]
public static extern bool PathIsDirectory([MarshalAsAttribute(UnmanagedType.LPWStr), In] string pszPath);
为了进一步澄清一些评论...
在此引入非托管代码并不比任何其他的更inherintly危险文件或I/O相关的调用,因为它们最终都会调用非托管代码。
这是一个使用字符串的单个函数调用。调用此函数不会引入任何新的数据类型和/或内存使用情况。是的,您确实需要依赖非托管代码来正确清理,但最终会对大多数I/O相关调用产生依赖。
仅供参考,这里是从反射器的代码File.GetAttributes(字符串路径):
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()作为其他答案建议有调用unmanged代码相同的“问题”,我相信这是更可靠的方法来完成确定路径是否是一个目录。
编辑要回答@Christian K关于CAS的评论。我相信GetAttributes唯一的原因使安全需求是因为它需要读取文件的属性,所以它想确保调用代码有权这样做。这与底层的操作系统检查不一样(如果有的话)。如果需要,您可以始终围绕对PathIsDirectory的P/Invoke调用创建一个包装函数,该函数也需要某些CAS权限。
http://stackoverflow.com/a/17198139/128506 – HAL9000 2014-06-29 22:30:03
的可能的复制(http://stackoverflow.com/questions/1395205/better-way-to-check-if-a-path-is-a-file-or-a-directory) – DavidRR 2016-09-07 12:50:54