Nếu bạn đặt trước tên tệp với \\?\
thì bạn bật phân tích cú pháp đường dẫn mở rộng và do đó thoát khỏi giới hạn độ dài đường dẫn 260 ký tự.
Để tiền tố này hoạt động, bạn cần gọi các phiên bản Unicode của các hàm API Win32. Vì vậy, nếu bạn đang sử dụng một Unicode Delphi thì đây là tất cả những gì bạn cần làm. Nhưng kể từ khi bạn đang sử dụng một Pre-Unicode Delphi bạn sẽ phải cuộn phiên bản của riêng bạn FindFirst
gọi các phiên bản Unicode của các chức năng API. Bạn sẽ gọi số FindFirstFileW
, FindNextFileW
, FindClose
và sử dụng phiên bản Unicode của cấu trúc, WIN32_FIND_DATAW
.
Các vấn đề này được thảo luận với độ dài lớn hơn trên MSDN: Naming Files, Paths, and Namespaces.
Trong tình huống cụ thể của bạn, tài liệu cho FindFirstFileW
gọi vấn đề này ra như thế này:
Trong phiên bản ANSI của chức năng này, tên được giới hạn ký tự MAX_PATH. Để mở rộng giới hạn này thành 32.767 ký tự rộng, hãy gọi phiên bản Unicode của hàm và thêm "\? \" Vào đường dẫn.
Lưu ý rằng hai trường tên tệp trong WIN32_FIND_DATAW
được giới hạn độ dài đến 260 ký tự. Điều đó là tốt bởi vì chúng chỉ chứa phần tương đối của tên, đó là tên đối tượng liên quan đến thư mục chứa. Bạn chỉ cần sử dụng tiền tố \\?\
khi bạn gọi FindFirstFileW
.
Để sử dụng phiên bản Unicode của API này, bạn sẽ sử dụng một số WideString
cho thông số lpFileName
của FindFirstFileW
và chuyển nó bằng cách sử dụng PWideChar(FileName)
.
var
FileName: WideString;
....
// initialise FileName, this will happen in your recursion
FindHandle := FindFirstFileW(PWideChar(FileName), FindData);
Đối với thuộc tính tệp, chúng có thể được đọc ra khỏi cấu trúc WIN32_FIND_DATAW
trên mỗi lần lặp lại. Đó là một phần của mã của bạn không cần phải thay đổi. Điều duy nhất bạn cần sửa là để có được phân tích cú pháp> 260 char trên lệnh gọi ban đầu tới FindFirstFileW
. Mọi thứ khác chảy khá bình thường.
Đây là bản sao của [Delphi - Cách kiểm tra xem tệp có tồn tại trên 255 ký tự] hay không (trừ http://stackoverflow.com/q/16874118/62576), ngoại trừ nó hỏi về 'FileExists' thay vì thuộc tính . Câu hỏi cơ bản và câu trả lời là như nhau, mặc dù vậy. –
@KenWhite Câu hỏi này không thực sự về các thuộc tính. Chúng được đọc trong cấu trúc 'WIN32_FIND_DATAW'. Vấn đề chỉ là lời gọi đến 'FindFirstFile' mà cần phải thoát khỏi giới hạn 260 char. –
@David: Tất cả đều được đề cập trong câu trả lời của bạn cho câu hỏi trước, bao gồm liên kết 'Đặt tên tệp' và đề cập đến các phiên bản A/W. Cách này khác gì? –