これは、いくつかの相互運用コードを使用して行うことができます。
[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(文字列パス)へのコードは次のとおりです。
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()を呼び出すことでさえ、管理されていないコードを呼び出すことと同じ「問題」があり、これがパスがディレクトリであるかどうかを判断するためのより信頼できる方法であると思います。
編集CASに関する@ChristianKのコメントに回答します。GetAttributesがセキュリティを要求する唯一の理由は、ファイルのプロパティを読み取る必要があるため、呼び出し元のコードにそのためのアクセス許可があることを確認する必要があるためだと思います。これは、基盤となるOSチェック(存在する場合)と同じではありません。必要に応じて、特定のCAS権限も要求するPathIsDirectoryへのP/Invoke呼び出しの周りにラッパー関数をいつでも作成できます。