Testing if a file or directory exist

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello

What is the quickest way to test if a file or directory exist.
I can think of three different system calls that can be used:
access(), stat() and open(). Writting a little test program I
found that this is also the order of which is the quickest,
that is access() is the quickest and open() the slowest. The code
for the test programms is shown below.

The question I have is there any other system call that I can use
that would be cheaper then access(). Even if they are linux specific
system calls I would like to know.

Thanks,
Holger

access.c

   #include <stdio.h>
   #include <string.h>
   #include <unistd.h>
   #include <errno.h>

   #define MAX_LOOPS 5000000

   int main(void)
   {
      unsigned int i;

      for (i = 0; i < MAX_LOOPS; i++)
      {
         if (access("abcd", R_OK) != 0)
         {
            (void)fprintf(stderr, "access() error : %s\n", strerror(errno));
            return 1;
         }
      }
      return 0;
   }


stat.c

   #include <stdio.h>
   #include <string.h>
   #include <sys/types.h>
   #include <sys/stat.h>
   #include <unistd.h>
   #include <errno.h>

   #define MAX_LOOPS 5000000

   int main(void)
   {
      unsigned int i;
      struct stat  stat_buf;

      for (i = 0; i < MAX_LOOPS; i++)
      {
         if (stat("abcd", &stat_buf) == -1)
         {
            (void)fprintf(stderr, "stat() error : %s\n", strerror(errno));
            return 1;
         }
      }
      return 0;
   }


open.c

   #include <stdio.h>
   #include <string.h>
   #include <sys/types.h>
   #include <sys/stat.h>
   #include <fcntl.h>
   #include <errno.h>

   #define MAX_LOOPS 5000000

   int main(void)
   {
      int          fd;
      unsigned int i;

      for (i = 0; i < MAX_LOOPS; i++)
      {
         if ((fd = open("abcd", O_RDONLY)) == -1)
         {
            (void)fprintf(stderr, "open() error : %s\n", strerror(errno));
            return 1;
         }
         else
         {
            (void)close(fd);
         }
      }
      return 0;
   }

-
To unsubscribe from this list: send the line "unsubscribe linux-c-programming" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Assembler]     [Git]     [Kernel List]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [C Programming]     [Yosemite Campsites]     [Yosemite News]     [GCC Help]

  Powered by Linux