Câu hỏi là tại sao giới hạn vẫn tồn tại. Chắc chắn Windows hiện đại có thể tăng thêm khía cạnh MAX_PATH
để cho phép các đường dẫn dài hơn. Tại sao giới hạn không được gỡ bỏ?
- Lý do không thể xóa là Windows hứa rằng nó sẽ không bao giờ thay đổi.
Thông qua hợp đồng API, Windows đã đảm bảo tất cả các ứng dụng rằng API tệp tiêu chuẩn sẽ không bao giờ trả lại đường dẫn dài hơn 260
ký tự.
Hãy xem xét mã chính xác sau đây :
WIN32_FIND_DATA findData;
FindFirstFile("C:\Contoso\*", ref findData);
Windows đảm bảo chương trình của tôi rằng nó sẽ đưa vào WIN32_FIND_DATA
cấu trúc của tôi :
WIN32_FIND_DATA {
DWORD dwFileAttributes;
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
//...
TCHAR cFileName[MAX_PATH];
//..
}
Ứng dụng của tôi không khai báo giá trị của hằng số MAX_PATH
, API Windows đã làm. Ứng dụng của tôi đã sử dụng giá trị được xác định.
Cấu trúc của tôi được xác định chính xác và chỉ phân bổ 592
tổng số byte. Điều đó có nghĩa là tôi chỉ có thể nhận được một tên tệp nhỏ hơn 260
ký tự. Windows hứa với tôi rằng nếu tôi viết ứng dụng của mình một cách chính xác, ứng dụng của tôi sẽ tiếp tục hoạt động trong tương lai.
Nếu Windows cho phép tên tệp dài hơn 260
ký tự thì ứng dụng hiện tại của tôi (sử dụng đúng API chính xác) sẽ thất bại.
Đối với bất kỳ ai kêu gọi Microsoft thay đổi MAX_PATH
hằng số, trước tiên họ cần đảm bảo rằng không có ứng dụng hiện có nào bị lỗi. Ví dụ, tôi vẫn sở hữu và sử dụng một ứng dụng Windows được viết để chạy trên Windows 3.11. Nó vẫn chạy trên Windows 10. 64 bit. Đó là những gì khả năng tương thích ngược mang lại cho bạn.
Microsoft đã tạo ra một cách để sử dụng đầy đủ 32.768 tên đường dẫn; nhưng họ phải tạo một hợp đồng API mới để làm điều đó. Đối với một, bạn nên sử dụng API Shell để liệt kê các tệp (vì không phải tất cả các tệp đều tồn tại trên ổ cứng hoặc chia sẻ mạng).
Nhưng họ cũng không được phá vỡ các ứng dụng người dùng hiện có. Phần lớn các ứng dụng không sử dụng api shell cho công việc tập tin. Mọi người chỉ cần gọi FindFirstFile
/ FindNextFile
và gọi nó là một ngày.