2013-06-03 30 views
6

Delphi: cách xem lại các đường dẫn trên 255 ký tự và đọc thuộc tính tệpLàm cách nào để xem lại các đường dẫn trên 255 ký tự và đọc thuộc tính tệp?

Tôi đang viết ứng dụng bảng điều khiển và cần duyệt qua cấu trúc thư mục có đường lớn hơn 255 ký tự và sau đó đọc thuộc tính của tệp trong đó.

Trước đây, tôi đã sử dụng đệ quy và FindFirst bằng Turbo Delphi từ năm 2006 nhưng điều này dường như bỏ qua các đường dẫn lớn hơn 255 ký tự.

Tôi có thể hoán đổi chức năng FindFirst() cho một thứ khác không? hay tôi phải thực hiện một cách tiếp cận khác?

+1

Đâ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. –

+0

@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. –

+1

@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ì? –

Trả lời

8

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.

+0

Khi tôi đọc nó, đó là một câu hỏi của một trong hai gói chức năng của riêng tôi cho các phiên bản cũ của Delphi xung quanh các chức năng unicode hoặc sử dụng một phiên bản "unicode" mới hơn. Nếu tôi đã làm sau này và chỉ cần biên dịch lại sẽ làm việc? – Tal

+0

Nếu bạn biên dịch lại trong Unicode Delphi và thêm tiền tố ma thuật, thì bạn sẽ nhận được kết quả mà bạn đang tìm kiếm. Đó là bởi vì 'FindFirst' chuyển tham số' Path' của bạn vào 'FindFirstFile', và bạn nhận được phiên bản Unicode trong Unicode Delphi. –