2010-08-24 56 views
9

Tôi chấp nhận đường dẫn thông qua đầu vào dòng lệnh.Mở thư mục bằng cách sử dụng C

Khi tôi làm

dir=opendir(args[1]); 
it doesnt enter the loop...i.e dir==null... 

Làm thế nào để vượt qua các đầu vào dòng lệnh để trỏ dir ???

void main(int c,char **args) 
{ 
    DIR *dir; 
    struct dirent *dent; 
    char buffer[50]; 
    strcpy(buffer, args[1]); 
    dir = opendir(buffer); //this part 
    if(dir!=NULL) 
    { 
     while((dent=readdir(dir))!=NULL) 
      printf(dent->d_name); 
    } 
    close(dir); 
} 

./a.out /root/TEST is used to run the program.. 
./a.out --> to execute the program 
/root/TEST --> input by the user i.e valid path 
+2

Vui lòng cung cấp phần có liên quan của mã của bạn. Câu hỏi của bạn không rõ ràng, ít nhất là với tôi. 'opendir' trả về một' DIR * '. Nó trả về NULL trong 2 tình huống: thư mục không thể được truy cập hoặc bộ nhớ không thể được cấp phát để giữ kết quả. – jweyrich

+0

@Vinod K: Bạn đang thực thi mã này như thế nào/bạn đang sử dụng dòng lệnh nào để chạy? – Thanatos

+0

@Vinod: In args [1] và kiểm tra thủ công xem nó có tồn tại không. 1) Có tồn tại không? 2) Có đường dẫn của bạn phù hợp trong 50 byte (bạn nên sử dụng strncpy)? 3) Điều gì xảy ra nếu bạn không vượt qua paremeter? Thêm điều kiện thích hợp ở đó. – jweyrich

Trả lời

30

Bạn thực sự nên đăng mã của mình, nhưng tại đây. Bắt đầu với:

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

    int main (int c, char *v[]) { 
     int len; 
     struct dirent *pDirent; 
     DIR *pDir; 

     if (c < 2) { 
      printf ("Usage: testprog <dirname>\n"); 
      return 1; 
     } 
     pDir = opendir (v[1]); 
     if (pDir == NULL) { 
      printf ("Cannot open directory '%s'\n", v[1]); 
      return 1; 
     } 

     while ((pDirent = readdir(pDir)) != NULL) { 
      printf ("[%s]\n", pDirent->d_name); 
     } 
     closedir (pDir); 
     return 0; 
    } 

Bạn cần kiểm tra trường hợp args[1] vừa được đặt và đề cập đến một thư mục thực. Khi điều này được chạy với:

testprog tmp 

(tmp là một thư mục con ra khỏi thư mục hiện tại của tôi nhưng bạn có thể sử dụng bất kỳ thư mục hợp lệ), tôi nhận được:

[.] 
[..] 
[file1.txt] 
[file1_file1.txt] 
[file2.avi] 
[file2_file2.avi] 
[file3.b.txt] 
[file3_file3.b.txt] 

Lưu ý rằng bạn phải vượt qua một thư mục trong, không phải là tệp . Khi tôi thực hiện:

testprog tmp/file1.txt 

tôi nhận được:

Cannot open directory 'tmp/file1.txt' 

bởi vì đó là một tập tin chứ không phải là một thư mục (nếu bạn đang lén lút, bạn có thể cố gắng sử dụng diropen(dirname(v[1])) nếu ban đầu diropen thất bại).

+0

ý tôi là ... thay vì pDir = opendir ("Hardcoding the path") chúng ta có thể thích đặt pDir = opendir (args [1]) Người dùng nhập vào? –

+0

@Vinod, vâng, hãy xem bản cập nhật. – paxdiablo

+0

Làm thế nào để tránh đi qua [.] Và [..]? – jaytj95

1

Một số thông tin phản hồi trên đoạn mã, mặc dù đối với hầu hết các phần, nó nên làm việc ...

void main(int c,char **args) 
  • int main - tiêu chuẩn định nghĩa main như trả lại một int.
  • cargs thường được đặt tên argcargv, trân trọng, nhưng bạn được phép đặt tên cho họ bất cứ điều gì

...

{ 
DIR *dir; 
struct dirent *dent; 
char buffer[50]; 
strcpy(buffer,args[1]); 
  • Bạn có một lỗi tràn bộ đệm ở đây: Nếu args[1] dài hơn 50 byte, buffer sẽ không thể giữ nó và bạn sẽ ghi vào bộ nhớ mà bạn không nên. Không có lý do tôi có thể thấy để sao chép bộ đệm đây, vì vậy bạn có thể để bên ngoài những vấn đề này bằng cách chỉ cần không sử dụng strcpy ...

...

dir=opendir(buffer); //this part 

Nếu đây trở NULL, nó có thể được vì một vài lý do:

  • Thư mục không tồn tại. (Bạn đã nhập đúng chưa?Nó có không gian trong đó và bạn đã nhập ./your_program my directory, điều này sẽ thất bại, vì nó cố gắng opendir("my"))
  • Bạn thiếu quyền đối với thư mục
  • Không đủ bộ nhớ. (Điều này khó xảy ra.)
2

Các tham số được chuyển đến chương trình thực thi C không là gì ngoài một chuỗi chuỗi (hoặc ký tự), vì vậy bộ nhớ đã được cấp cho tham số đầu vào trước khi chương trình truy cập các tham số này, vì vậy không cần phải phân bổ bộ đệm, và bằng cách đó bạn có thể tránh lỗi xử lý mã trong chương trình của bạn (Giảm cơ hội segfault :)).

0

Dưới đây là cách đơn giản để triển khai ls lệnh sử dụng c. Để chạy sử dụng ví dụ ./xls /tmp

#include<stdio.h> 
    #include <dirent.h> 
    void main(int argc,char *argv[]) 
    { 
    DIR *dir; 
    struct dirent *dent; 
    dir = opendir(argv[1]); 

    if(dir!=NULL) 
     { 
    while((dent=readdir(dir))!=NULL) 
        { 
     if((strcmp(dent->d_name,".")==0 || strcmp(dent->d_name,"..")==0 || (*dent->d_name) == '.')) 
      { 
      } 
     else 
       { 
     printf(dent->d_name); 
     printf("\n"); 
       } 
        } 
     } 
     close(dir); 
    } 
Các vấn đề liên quan