Avatar of Stephen Kairys
Stephen Kairys
Flag 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


C

Avatar of undefined
Last Comment
Stephen Kairys

8/22/2022 - Mon
Kent Olsen

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

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?"
phoffric

Didn't see your post Kent while getting the link and excerpting from it.
Experts Exchange has (a) saved my job multiple times, (b) saved me hours, days, and even weeks of work, and often (c) makes me look like a superhero! This place is MAGIC!
Walt Forbes
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!
phoffric

Did you also try
•"S_ISDIR(mode) -- Is this a directory?"
phoffric

In listing 5, for example, is the LOC:
     if( S_ISDIR( entryInfo.st_mode ) ) {
⚡ FREE TRIAL OFFER
Try out a week of full access for free.
Find out why thousands trust the EE community with their toughest problems.
phoffric

Or, just a typo: try S_IFDIR  instead.
    http://linux.die.net/man/2/stat
Stephen Kairys

ASKER
>>
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
Stephen Kairys

ASKER
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.
This is the best money I have ever spent. I cannot not tell you how many times these folks have saved my bacon. I learn so much from the contributors.
rwheeler23
Stephen Kairys

ASKER
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
Kent Olsen

THIS SOLUTION ONLY AVAILABLE TO MEMBERS.
View this solution by signing up for a free trial.
Members can start a 7-Day free trial and enjoy unlimited access to the platform.
See Pricing Options
Start Free Trial
GET A PERSONALIZED SOLUTION
Ask your own question & get feedback from real experts
Find out why thousands trust the EE community with their toughest problems.
Stephen Kairys

ASKER
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
Stephen Kairys

ASKER
Actually I defer to Kent. You don't need to include <sys\types.h>.  Points to be awaeded shortly. Thanks!
⚡ FREE TRIAL OFFER
Try out a week of full access for free.
Find out why thousands trust the EE community with their toughest problems.
Stephen Kairys

ASKER
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.
phoffric

>> 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

phoffric

no problem w/ the points. Like I said, it was just a typo.
I started with Experts Exchange in 2004 and it's been a mainstay of my professional computing life since. It helped me launch a career as a programmer / Oracle data analyst
William Peck
Stephen Kairys

ASKER
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.