Bạn có thể làm điều này với một số mã tương tác:
[DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
[return: MarshalAsAttribute(UnmanagedType.Bool)]
public static extern bool PathIsDirectory([MarshalAsAttribute(UnmanagedType.LPWStr), In] string pszPath);
Để làm rõ thêm một số ý kiến ...
Việc giới thiệu mã không được quản lý trong điều này không nguy hiểm hơn bất kỳ tệp tin kế thừa nào hoặc các lệnh gọi liên quan đến I / O khác trong .NET vì chúng tối hậu thư đều gọi đến mã không được quản lý.
Đây là một lệnh gọi hàm đơn sử dụng một chuỗi. Bạn sẽ không giới thiệu bất kỳ kiểu dữ liệu mới nào và / hoặc cách sử dụng bộ nhớ bằng cách gọi hàm này. Có, bạn cần phải dựa vào mã không được quản lý để dọn dẹp đúng cách, nhưng cuối cùng bạn phải phụ thuộc vào hầu hết các cuộc gọi liên quan đến I / O.
Để tham khảo, đây là mã đến File.GetAttributes (đường dẫn chuỗi) từ 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;
}
Như bạn có thể thấy, nó cũng đang gọi đến mã không được quản lý để truy xuất các thuộc tính tệp, vì vậy các tranh luận về việc đưa mã không được quản lý là nguy hiểm là không hợp lệ. Tương tự như vậy, tranh luận về việc hoàn toàn ở trong mã được quản lý. Không có triển khai mã được quản lý để làm điều này. Ngay cả việc gọi File.GetAttributes () như các câu trả lời khác đề xuất cũng có cùng "vấn đề" khi gọi mã không thay đổi và tôi tin rằng đây là phương pháp đáng tin cậy hơn để xác định xem đường dẫn có phải là một thư mục hay không.
Chỉnh sửa Để trả lời nhận xét của @Christian K về CAS. Tôi tin rằng lý do duy nhất GetAttributes tạo ra yêu cầu bảo mật là vì nó cần đọc các thuộc tính của tệp, vì vậy nó muốn đảm bảo rằng mã gọi có quyền làm như vậy. Điều này không giống như kiểm tra hệ điều hành cơ bản (nếu có). Bạn luôn có thể tạo một hàm bao bọc xung quanh lệnh gọi P / Invoke tới PathIsDirectory cũng yêu cầu một số quyền CAS nhất định, nếu cần.