Bạn có thể làm điều này với một số mã interop:
[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 ...
Giới thiệu unmanaged code trong này không phải là bất kỳ inherintly nguy hiểm hơn bất kỳ khác tập tin hoặc I/O liên quan đến các cuộc gọi trong .NET kể từ khi họ ultimatley tất cả các cuộc gọi vào mã không được quản lý.
Đây là một cuộc gọi hàm duy nhất sử dụng chuỗi. Bạn không giới thiệu bất kỳ loại dữ liệu mới nào và/hoặc 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 có sự 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à đoạn code để File.GetAttributes (string path) 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 thấy, nó cũng được gọi vào mã không được quản lý để lấy các thuộc tính tập tin, do đó, các tranh luận về việc giới thiệu mã không được quản lý là nguy hiểm là không hợp lệ. Tương tự như vậy, lập luận về việc ở lại hoàn toàn trong mã được quản lý. Không có triển khai mã được quản lý để thực hiện việc này. Ngay cả gọi File.GetAttributes() như các câu trả lời khác đề xuất có cùng một "vấn đề" gọi mã unmanged và tôi tin rằng đây là phương pháp đáng tin cậy hơn để thực hiện xác định nếu một con đường là một thư mục.
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 làm cho nhu cầu bảo mật là bởi vì nó cần phải đọc các thuộc tính của tập tin để 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 bên dưới (nếu có). Bạn luôn có thể tạo ra một hàm bao quanh xung quanh cuộc gọi P/Invoke đến PathIsDirectory cũng yêu cầu các quyền CAS nhất định, nếu cần thiết.
http://stackoverflow.com/a/17198139/128506 – HAL9000
có thể trùng lặp của (http://stackoverflow.com/questions/1395205/better-way-to-check-if-a-path-is-a-file-or-a-directory) – DavidRR