Link to home
Start Free TrialLog in
Avatar of Stephen Kairys
Stephen KairysFlag for United States of America

asked on

C function to determine if a directory exists

Using C (not C++):

I have often used the C function access() to determine if a file exists e.g

if (!access(filename, F_OK))
   printf("File exists);
else
  printf("File does NOT exist\n");

For my current purposes, I need to be able to tell if a particular SUBDIRECTORY exists.
e..g if I have a subdir "STEVE", and pass "STEVE" to access() it will return 0, but I need to be able to tell if "STEVE" is a subdir, rather than a file.  Is there a function that can help me out?

Thanks,
Steve


Avatar of Kent Olsen
Kent Olsen
Flag of United States of America image

Hi Steve,

One of the stat() functions should do nicely.


GoodLuck,
Kent

#include <sys\stat.h>
#include <stdio.h>
#include <time.h>
int main(void)
{
   struct stat statbuf;
   int    handle;

//  int stat(const char *path, struct stat *statbuf); 
   stat ("c:\\mypath\\dirname", &statbuf);

   if (statbuf.st_mode & S_S_IFDIR)
      printf("Directory....\n");
}

Open in new window

Avatar of phoffric
phoffric

you can use readdir and get the file stats:
    http://www.ibm.com/developerworks/aix/library/au-unix-readdir.html 

"The stat() function fills a struct stat structure with information about a specific file; if you've got a file descriptor instead of a file name, you can use the fstat() function instead."

•"S_ISDIR(mode) -- Is this a directory?"
•"S_ISREG(mode) -- Is this a regular file?"
Didn't see your post Kent while getting the link and excerpting from it.
Avatar of Stephen Kairys

ASKER

Kent,
Welk. I tried your code, but it seems that the identifier

S_S_IFDIR

is not included in my
sys\stat.h
 nor
sys\types.h

even though stat() is prototyped in stat.h.
Any idea what I'm doing wrong?

Thanks!
Did you also try
•"S_ISDIR(mode) -- Is this a directory?"
In listing 5, for example, is the LOC:
     if( S_ISDIR( entryInfo.st_mode ) ) {
Or, just a typo: try S_IFDIR  instead.
    http://linux.die.net/man/2/stat
>>
S_ISDIR(mode) -- Is this a directory
Not sure I understand this. What is mode?
I see in sys\stat.h that
#define S_ISDIR( m )      (((m) & S_IFMT) == S_IFDIR)
is a macro, but not sure what to pass to it.
Thanks
Look like both S_IFDIR and S_ISDIR exist in stat.h

#define S_IFDIR       0040000 /* directory */
#define S_ISDIR( m )      (((m) & S_IFMT) == S_IFDIR)

Still..need to know..what do I pass in as the parameter "mode"?
Thanks.
Phoffric:
I see the two links you posted are from UNIX and Linux. Do they apply to WIndows/DOS 16-bit programming?
Thanks
ASKER CERTIFIED SOLUTION
Avatar of Kent Olsen
Kent Olsen
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
OK, I think I got it.

Just to be safe, I first use access() to determine if the file exists: Then I invoke stat...
Please do not assume this code is perfect. I did only cursory testing.

Thanks everyone!



 isdir-c.txt
Actually I defer to Kent. You don't need to include <sys\types.h>.  Points to be awaeded shortly. Thanks!
Kent,
Thank you. Your solution had everything in one place so you get the points

phoffric: - As per the above, Kent got the points, but I still appreciate your help. If you feel that you should share in the points, feel free t respond; however, I won't be able to handle your request 'til at least next Thursday as I am going to be on a short vacation. Thanks for your efforts.
>> Do they apply to WIndows/DOS 16-bit programming
I didn't realize you were working in Windows/DOS 16-bit programming. And I don't have that product available to test, so I cannot be sure.

But, I tried the kdo's post in VS 2010 Express, and it works fine (with the typo corrected), so that is a good sign that it will work for you.

Since S_ISDIR is defined for you (it is not defined in sys\stat.h in VS 2010 Express), I think the below code should work for you since it works in Linux. However, you need to verify using your DOS-16 system.
if (statbuf.st_mode & S_IFDIR)  
      printf("Directory....\n");  
   if( S_ISDIR( statbuf.st_mode ) )
      printf("S_ISDIR works in Linux\n");

Open in new window

no problem w/ the points. Like I said, it was just a typo.
Thanks.  Anyone who reads this question should realize that I did not try it on the Linux or Unix but n 16-bit DOS running under windows.