问题
I am accepting the path through command line input.
When I do
dir=opendir(args[1]);
it doesn' t enter the loop...i.e dir==null
...
How do I pass the command line input to dir pointer?
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:
You should really post your code, but here goes. Start with:
#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;
}
You need to check in your case that args[1]
is both set and refers to an actual directory. When this is run with:
testprog tmp
(tmp
is a subdirectory off my current directory but you can use any valid directory), I get:
[.]
[..]
[file1.txt]
[file1_file1.txt]
[file2.avi]
[file2_file2.avi]
[file3.b.txt]
[file3_file3.b.txt]
Note that you have to pass a directory in, not a file. When I execute:
testprog tmp/file1.txt
I get:
Cannot open directory 'tmp/file1.txt'
because that's a file rather than a directory (if you're sneaky, you can attempt to use diropen(dirname(v[1]))
if the initial diropen
fails).
回答2:
Some feedback on the segment of code, though for the most part, it should work...
void main(int c,char **args)
int main
- the standard definesmain
as returning anint
.c
andargs
are typically namedargc
andargv
, respectfully, but you are allowed to name them anything
...
{
DIR *dir;
struct dirent *dent;
char buffer[50];
strcpy(buffer,args[1]);
- You have a buffer overflow here: If
args[1]
is longer than 50 bytes,buffer
will not be able to hold it, and you will write to memory that you shouldn't. There's no reason I can see to copy the buffer here, so you can sidestep these issues by just not usingstrcpy
...
...
dir=opendir(buffer); //this part
If this returning NULL
, it can be for a few reasons:
- The directory didn't exist. (Did you type it right? Did it have a space in it, and you typed
./your_program my directory
, which will fail, because it tries toopendir("my")
) - You lack permissions to the directory
- There's insufficient memory. (This is unlikely.)
回答3:
Parameters passed to the C program executable is nothing but an array of string(or character pointer),so memory would have been already allocated for these input parameter before your program access these parameters,so no need to allocate buffer,and that way you can avoid error handling code in your program as well(Reduce chances of segfault :)).
回答4:
Here is a simple way to implement ls
command using c
. To run use for example ./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);
}
来源:https://stackoverflow.com/questions/3554120/open-directory-using-c