• C

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


LVL 4
Stephen KairysTechnical Writer - ConsultantAsked:
Who is Participating?
 
Kent OlsenConnect With a Mentor Data Warehouse Architect / DBACommented:
Hi Steve,

Sorry about the typo.

S_IFDIR is a constant.  This constant is a bit that flags the item as a directory.

S_ISDIR(m) is a macro.  You would pass statbut->st_mode to it.


I corrected the item and reposted the source code.

Give it a try,
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_IFDIR)
      printf("Directory....\n");
}

Open in new window

0
 
Kent OlsenData Warehouse Architect / DBACommented:
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

0
 
phoffricCommented:
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?"
0
Has Powershell sent you back into the Stone Age?

If managing Active Directory using Windows Powershell® is making you feel like you stepped back in time, you are not alone.  For nearly 20 years, AD admins around the world have used one tool for day-to-day AD management: Hyena. Discover why.

 
phoffricCommented:
Didn't see your post Kent while getting the link and excerpting from it.
0
 
Stephen KairysTechnical Writer - ConsultantAuthor Commented:
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!
0
 
phoffricCommented:
Did you also try
•"S_ISDIR(mode) -- Is this a directory?"
0
 
phoffricCommented:
In listing 5, for example, is the LOC:
     if( S_ISDIR( entryInfo.st_mode ) ) {
0
 
phoffricCommented:
Or, just a typo: try S_IFDIR  instead.
    http://linux.die.net/man/2/stat
0
 
Stephen KairysTechnical Writer - ConsultantAuthor Commented:
>>
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
0
 
Stephen KairysTechnical Writer - ConsultantAuthor Commented:
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.
0
 
Stephen KairysTechnical Writer - ConsultantAuthor Commented:
Phoffric:
I see the two links you posted are from UNIX and Linux. Do they apply to WIndows/DOS 16-bit programming?
Thanks
0
 
Stephen KairysTechnical Writer - ConsultantAuthor Commented:
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
0
 
Stephen KairysTechnical Writer - ConsultantAuthor Commented:
Actually I defer to Kent. You don't need to include <sys\types.h>.  Points to be awaeded shortly. Thanks!
0
 
Stephen KairysTechnical Writer - ConsultantAuthor Commented:
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.
0
 
phoffricCommented:
>> 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

0
 
phoffricCommented:
no problem w/ the points. Like I said, it was just a typo.
0
 
Stephen KairysTechnical Writer - ConsultantAuthor Commented:
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.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.