2012-01-23 42 views
44

Tôi nhận được danh sách các tệp trên hệ thống giống như linux bằng cách sử dụng opendir/readdir. Có vẻ như các mục nhập thư mục được trả về theo thứ tự bảng chữ cái của tên tệp. Tuy nhiên, tôi không thấy bất cứ điều gì trong các trang của người đàn ông về thứ tự này được đảm bảo.Liệu readdir() có đảm bảo một đơn hàng không?

Bất cứ ai có thể cho tôi biết có nên yêu cầu người quản lý lại đơn đặt hàng không?

+0

Theo quy tắc chung, tỷ lệ cược là nếu nó không có trong tài liệu, câu trả lời là không. Ngay cả khi đã xảy ra được một trật tự nhất quán trên tất cả các triển khai, nếu nó không được ghi lại, nó có thể không được đảm bảo. –

+4

Nếu chúng sắp ra chữ cái, gần như chắc chắn rằng chúng ban đầu được tạo * theo thứ tự chữ cái, ví dụ: bằng cách 'giải nén' hoặc' tar' giải nén chúng như vậy ... 'readdir' không cung cấp thứ tự. –

+1

Nhân tiện, 'scandir' có thể hữu ích nếu bạn muốn đặt hàng các kết quả hoặc có quyền truy cập ngẫu nhiên vào chúng. Nó được chuẩn hóa trong POSIX 2008 và là một phần mở rộng phổ biến trước đó. –

Trả lời

34

Phương thức readdir không đảm bảo bất kỳ yêu cầu nào. Nếu bạn muốn đảm bảo chúng được sắp xếp theo thứ tự bảng chữ cái, bạn sẽ cần phải tự mình làm như vậy.

Lưu ý: Tôi đã tìm kiếm một chút để biết tài liệu dứt khoát cho biết đây là trường hợp. Gần nhất tôi đến là liên kết sau

Đó là không phải là dứt khoát nhưng nó cung cấp cho một cái nhìn tổng quan tốt đẹp của các lệnh, đó là lịch sử và làm thế nào nó thực hiện thường là trật tự traversal.

8

Rõ ràng là không được bảo đảm. Việc đặt hàng thường tuân theo một số quy tắc, nhưng các quy tắc phức tạp đến nỗi bạn không nên dựa vào chúng. Ví dụ, thứ tự có thể bị ảnh hưởng bởi các hoạt động khác xảy ra trong cùng một thư mục và bạn không thể kiểm soát chúng. Hãy coi việc đặt hàng là ngẫu nhiên và tự sắp xếp mọi thứ nếu bạn cần.

6

Không, readdir không đảm bảo bất kỳ đơn đặt hàng nào.

(Một số hệ thống tập tin có thể lưu trữ các mục thư mục theo một trật tự nhất định, trong trường hợp này readdir có thể trả lại cho bạn theo thứ tự, nhưng đó không phải là một tính năng của bản thân readdir.)

13

Nói tóm lại, không, readdir() không đảm bảo bất kỳ thứ tự cụ thể nào.

từ một ví dụ readdir trong glibc manual

Thứ tự mà các file xuất hiện trong một thư mục có xu hướng được khá ngẫu nhiên. Một chương trình hữu ích hơn sẽ sắp xếp các mục (có lẽ bởi alphabetizing chúng) trước khi in chúng

+3

Liên kết không thành công. Tôi đã tìm thấy ảnh chụp nhanh trong [web.archive.org] (https://web.archive.org/web/20120531021029/http://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02 /library_13.html) cho bất kỳ ai quan tâm. – iplus26

9

Từ "Giao diện lập trình linux":

Các tên tập tin được trả về bởi readdir() là không theo thứ tự sắp xếp, nhưng thay vì theo thứ tự trong đó chúng xảy ra trong thư mục (tùy thuộc vào thứ tự trong mà hệ thống tệp thêm tệp vào thư mục và cách điền vào các khoảng trống trong danh sách sau khi tệp bị xóa). (Lệnh ls –f liệt kê các tệp trong cùng một trật tự để chúng sẽ được truy xuất bởi readdir().)

Chúng ta có thể sử dụng hàm scandir (3) để lấy danh sách tệp đã sắp xếp khớp với lập trình viên được xác định tiêu chí; xem trang hướng dẫn sử dụng để biết chi tiết. Mặc dù không phải là được chỉ định trong SUSv3, scandir() được cung cấp trên hầu hết các triển khai UNIX.

2

readdir() không đảm bảo bất kỳ thứ tự nào khác phía trên đó là thứ tự đọc đĩa OS.


Theo thử nghiệm mà tôi đã thực hiện trên một vài nền tảng - Solaris - sun4sol, x86 sol, linux, Windows với mã mẫu tất cả kết quả được thay thế một cách ngẫu nhiên.


nguồn: readdir() beginning with dots instead of files

#include <stdio.h> 
#include <stdlib.h> 
#include <dirent.h> 

int main() { 

    DIR *dir; 
    struct dirent *dp; 
    char * file_name; 
    char dirpath [100] ; 


    while(1==1){ 
     printf("Choose dir:"); 
     scanf("%s",dirpath); 
     dir = opendir(dirpath); 
     while ((dp=readdir(dir)) != NULL) { 
      if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, "..")) 
      { 
       // do nothing (straight logic) 
      } else { 
       file_name = dp->d_name; // use it 
       printf("file_name: \"%s\"\n",file_name); 
      } 
     } 
     closedir(dir); 
    } 

    return 0; 
} 
1

Bên cạnh những câu trả lời khác, readdir man page là khá rõ ràng về các tập tin đặt hàng.

Thứ tự trong đó tên tệp được đọc bằng các cuộc gọi liên tiếp đến readdir() tùy thuộc vào việc triển khai hệ thống tệp; không chắc rằng tên sẽ được sắp xếp theo bất kỳ thời trang nào.

Một số hệ thống tệp, như ReiserFS liệt kê các tệp theo thứ tự từ vựng.

Trong trường hợp của bạn, bạn phải lưu trữ tên trong một mảng, sau đó sắp xếp mảng. Ví dụ, sử dụng qsort() để sắp xếp mảng.

Các vấn đề liên quan