C/C++ Fast way to test for existence of a file in C++?

AI Thread Summary
The discussion centers on efficiently checking for the existence of files in a large batch without incurring significant delays. The initial approach using FILE *f = fopen(<filename>, "r") was found to be slow. A proposed solution involves using the stat function from the sys/stat.h library, which checks file existence more quickly. The code snippet provided demonstrates this method, returning 1 for non-existing files and 0 for existing ones. For Windows users, an alternative using System::IO::File::Exists is suggested, which also checks file existence. There is a mention of discrepancies between Unix and Windows file handling functions, particularly the difference between stat and _fstat. The discussion highlights the importance of efficient file checks, especially when processing a large number of files, and acknowledges the need for code compatibility across different operating systems.
ahrkron
Staff Emeritus
Science Advisor
Gold Member
Messages
755
Reaction score
2
Here's the situation:

I'm running over a few thousand files, some of which may have already been processed. In order to decide if a file has to be processed, I check if the corresponding output file exists.

The problem:

I tried using FILE *f = fopen(<filename>,"r"), and test for f!=0; however, it takes a long time to just open the files.

Any suggestions?

Edit: FILE instead of TFILE.[/color]
 
Last edited:
Technology news on Phys.org
How about this:

Code:
#include <sys/stat.h>

int fexist( char *filename ) {
  struct stat buffer ;
  if ( stat( filename, &buffer ) ) return 1 ;
  return 0 ;
}

This is under Unix, so stat.h may not be under sys/ for windows.
 
If you're programming for Windows check if the following works:

Code:
System::IO::File::Exists(file);

which returns true if the file exists, false otherwise.
 
Last edited:
Here is the msdn docmentation for stat.h:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_crt__fstat.2c_._fstati64.asp

It looks microsoft is up to their dirty tricks again. Instead of calling their function stat(...), they conveniently change it to _fstat(...). If anyone wants to port their code to unix they would need to change their function calls. Nice job. Even borland uses stat(...).
 
Last edited by a moderator:
Thanks!

That is fast enough.
Just it seems to have the logic reversed: stats(...) returns -1 for non-existing files and 0 for existing files.

(or it may be my expectation of 1 to mean "true" and 0 to be "does not exist").
 
OK. I was just being dumb. I had a piece of code before the actual test of file existence that was using some serious IO. Now both versions (dduardo's and my original FILE use) work ok.

Thanks anyway!
 
dduardo said:
Here is the msdn docmentation for stat.h:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_crt__fstat.2c_._fstati64.asp

It looks microsoft is up to their dirty tricks again. Instead of calling their function stat(...), they conveniently change it to _fstat(...). If anyone wants to port their code to unix they would need to change their function calls. Nice job. Even borland uses stat(...).

But you code you provided will work with Microsoft's compiler.
 
Last edited by a moderator:
You also have the posix

#include <unistd.h>
int access(const char *path, int amode);

Not sure it works on *dows, though
 
Um... did you notice that the posts you responded to are six and a half years old? :smile:
 
  • #10
jtbell said:
Um... did you notice that the posts you responded to are six and a half years old? :smile:
That only makes it only more important to check if the file still exists.
 

Similar threads

Back
Top