Открыть каталог с помощью C
Я принимаю путь через командную строку.
Когда я делаю
dir=opendir(args[1]);
он не входит в цикл... т.е. dir==null
...
Как передать ввод командной строки в указатель 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
Ответы
Ответ 1
Вы действительно должны опубликовать свой код, но здесь идет. Начните с:
#include <stdio.h>
#include <dirent.h>
int main (int c, char *v[]) {
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;
}
В вашем случае вам необходимо убедиться, что args[1]
установлен и относится к фактическому каталогу. Когда это выполняется с:
testprog tmp
(tmp
- это подкаталог моего текущего каталога, но вы можете использовать любой допустимый каталог), я получаю:
[.]
[..]
[file1.txt]
[file1_file1.txt]
[file2.avi]
[file2_file2.avi]
[file3.b.txt]
[file3_file3.b.txt]
Обратите внимание, что вы должны передать каталог, а не файл. Когда я выполню:
testprog tmp/file1.txt
я получаю:
Cannot open directory 'tmp/file1.txt'
потому что это файл, а не каталог (если вы подлый, вы можете попытаться использовать diropen(dirname(v[1]))
, если начальный diropen
завершится неудачей).
Ответ 2
Некоторая обратная связь по сегменту кода, хотя по большей части, должна работать...
void main(int c,char **args)
-
int main
- стандарт определяет main
как возвращающий int
.
-
c
и args
обычно называются argc
и argv
с уважением, но вам разрешено называть их чем-либо
...
{
DIR *dir;
struct dirent *dent;
char buffer[50];
strcpy(buffer,args[1]);
- Здесь у вас переполнение буфера: если
args[1]
длиннее 50 байтов, buffer
не сможет его удержать, и вы будете записывать в память, которую вы не должны. Нет причин, по которым я могу посмотреть, чтобы скопировать буфер здесь, чтобы вы могли обойти эти проблемы, просто не используя strcpy
...
...
dir=opendir(buffer); //this part
Если это возвращает NULL
, это может быть по нескольким причинам:
- Каталог не существует. (Вы набрали его правильно? Имел ли он пробел в нем, и вы набрали
./your_program my directory
, что не получится, потому что он пытается opendir("my")
)
- Вам не хватает разрешений для каталога
- Недостаточно памяти. (Это маловероятно.)
Ответ 3
Параметры, переданные в исполняемый файл программы C, представляют собой не что иное, как массив строки (или указатель символа), поэтому память уже была выделена для этих входных параметров, прежде чем ваша программа будет обращаться к этим параметрам, поэтому нет необходимости выделять буфер, и что вы также можете избежать кода обработки ошибок в своей программе (уменьшите шансы segfault:)).
Ответ 4
Вот простой способ реализовать команду ls
, используя c
. Для запуска используйте, например, ./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);
}