2011-12-11 21 views
5

Với hệ thống tệp cifs được gắn /network/cifs không phân biệt chữ hoa chữ thường, làm thế nào để tôi có được đường dẫn phân biệt chữ hoa chữ thường bằng C? Ví dụ: fs có tệp /network/cfis/Adena/t.txt. Với /network/cfis/AdEnA/T.txt (giải quyết đúng), tôi muốn /network/cfis/Adena/t.txt.Làm cách nào để có được đường dẫn nhạy cảm trên Linux mà không cần lặp lại thư mục?

Tôi biết một cách để làm điều đó là đệ quy lặp qua đường dẫn, khớp với chúng trong mọi trường hợp thấp hơn và nhận được trường hợp thực tế được trả về bằng phép lặp thư mục. Tuy nhiên, điều này liên quan đến rất nhiều syscalls mà tôi không muốn làm.

Thay đổi tùy chọn gắn kết không phải là giải pháp.

Nếu điều này là không thể, có thể xác định xem đường dẫn có thuộc hệ thống tệp phân biệt chữ hoa chữ thường không? Bằng cách này tôi có thể tránh làm lặp lại thư mục đệ quy trừ khi được yêu cầu.

Trả lời

3

Câu hỏi đó vừa được đưa ra đêm qua tại IRC; câu trả lời của tôi là bạn phải lặp lại và lý do là getcwd (có thể được thực hiện bằng cách chỉ xem các tệp /proc/N/ trong Linux) không đáng tin cậy để xác định tên chuẩn. Các mô-đun hạt nhân Linux CIFS sẽ inodes giả lên một cách nhanh chóng với vỏ mà bạn yêu cầu:

ls -dli /mnt/foo /mnt/foO /mnt/fOo /mnt/FOo /mnt/FOO 

có thể hiển thị giá trị rất khác nhau, và như vậy, /proc/self/cwd sẽ phản ánh một trong những inodes, không nhất thiết phải là một với tên gọi chính tắc.

0
#include <stdlib.h> 
#include <stdio.h> /* defines FILENAME_MAX */ 
#ifdef WINDOWS 
    #include <direct.h> 
    #define GetCurrentDir _getcwd 
#else 
    #include <unistd.h> 
    #define GetCurrentDir getcwd 
#endif 


int main(void) 
{ 
    char buffer[FILENAME_MAX]; 

    chdir("/network/cfis/AdEnA"); 
    if (NULL == getcwd(buffer, FILENAME_MAX)) 
     perror("getcwd error"); 
    printf("The current directory is %s.\n", buffer); 
    return 0; 

} 
+0

Đừng bạn có nghĩa là 'nếu (NULL == GetCurrentDir (đệm, FILENAME_MAX))' – Dan

+0

Tôi nghĩ rằng bạn có nghĩa là để sử dụng vĩ mô 'GetCurrentDir' thay vì' getcwd' trong mã? –

+0

Điều gì xảy ra nếu đường dẫn đi qua không phải là thư mục hiện tại? – RedX

0

Một giải pháp khả thi có thể là để open tập tin để đọc, nhận được một bộ mô tả tập tin, ví dụ 23, sau đó đến readlink các pseudo-file /proc/self/fd/23 (nhưng có lẽ lừa rằng sẽ không làm việc tốt, tôi đã làm không thử nó)

+1

Không hoạt động: ( –

0

Đối với những gì nó có giá trị, đây là một cách mà làm việc trên OSX (nhưng dường như không phải Linux):

#include <stdlib.h> 
char case_sensitive_path[1024]; 
realpath("/network/cfis/AdEnA/T.txt", case_sensitive_path); 
// case_sensitive_path is now "/network/cfis/Adena/t.txt" 
+0

đường dẫn thực không được chỉ định khi thực hiện điều này. Nó chỉ giải quyết., .. và các liên kết tượng trưng. Nó cũng không hoạt động đối với tôi trong thực tế trên Linux. –

+0

Cảm ơn. Tôi chỉ thử nó trên OSX , giả định không chính xác rằng hành vi sẽ giống nhau. – Billy