C routines opendir(), readdir() và closir() cung cấp một cách để tôi duyệt qua một cấu trúc thư mục. Tuy nhiên, mỗi cấu trúc dirent được trả về bởi readdir() dường như không cung cấp một cách hữu ích cho tôi để có được tập hợp các con trỏ tới DIR mà tôi sẽ cần phải recurse vào thư mục con thư mục.Duyệt cây thư mục hiệu quả với opendir(), readdir() và closir()
Tất nhiên, họ cho tôi tên tệp, vì vậy tôi có thể nối tên đó vào đường dẫn thư mục và chỉ mục() và opendir() hoặc tôi có thể thay đổi thư mục làm việc hiện tại của quá trình qua chdir() và cuộn nó trở lại thông qua chdir ("..").
Vấn đề với cách tiếp cận đầu tiên là nếu chiều dài của đường dẫn thư mục đủ lớn, thì chi phí để chuyển một chuỗi chứa nó tới opendir() sẽ vượt quá chi phí mở thư mục. Nếu bạn có một chút lý thuyết hơn, bạn có thể nói sự phức tạp của bạn có thể tăng vượt quá thời gian tuyến tính (trong tổng số ký tự của các tên tập tin (tương đối) trong cây thư mục).
Ngoài ra, cách tiếp cận thứ hai có vấn đề. Vì mỗi tiến trình có một thư mục làm việc hiện tại, tất cả chỉ một luồng sẽ phải chặn trong một ứng dụng đa luồng. Ngoài ra, tôi không biết nếu thư mục làm việc hiện tại chỉ là một sự thuận tiện đơn thuần (tức là, đường dẫn tương đối sẽ được nối vào nó trước một truy vấn hệ thống tập tin). Nếu có, cách tiếp cận này cũng sẽ không hiệu quả.
Tôi chấp nhận lựa chọn thay thế cho các chức năng này. Vì vậy, làm thế nào nó có thể đi qua một cây thư mục UNIX hiệu quả (thời gian tuyến tính trong tổng số ký tự của các tập tin theo nó)?
Độ dài tối đa của một tên tập tin hoặc thư mục được thiết lập bởi MAXCOMPLEN, đó là truyền thống 255 và hầu như không bao giờ hơn 512. Vì vậy, nếu bạn thực hiện chức năng đệ quy của bạn, bạn sẽ không phải chuỗi rất lớn, chắc chắn hư không gần điểm phân bổ và quản lý các chuỗi giữ đường dẫn thư mục ảnh hưởng đến độ phức tạp tổng thể của quá trình truyền tải. –