Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > alternative to fstat ?

Reply
Thread Tools

alternative to fstat ?

 
 
Joachim Schmitz
Guest
Posts: n/a
 
      12-12-2007
"Kenneth Brody" <(E-Mail Removed)> schrieb im Newsbeitrag
news:(E-Mail Removed)...
> Joachim Schmitz wrote:
>>
>> "Kenneth Brody" <(E-Mail Removed)> schrieb im Newsbeitrag
>> news:(E-Mail Removed)...
>> > Joachim Schmitz wrote:

> [... use fstat() to check for file existence ...]
>> > Well, if you have a file handle to pass to fstat(), I think we can
>> > pretty much agree that the file exists. (Even if POSIX is OT here.)
>> >
>> >

>> Oops...
>>
>> > And, if I recall, a discussion in the past noted that a failed access()
>> > call doesn't necessarily mean the file doesn't exist. (For example,
>> > you may simply not have permission to check for the existence.) Also,

>> Very true, so you would have to check errno in case access() returns
>> a -1.
>>
>> printf("%s does%s exist\n", filename, ((access(filename) == -1) &&
>> (errno==
>> ENOFILE))? "n't":"");

ENOENT, not ENOFILE

>> The same is true for stat BTW(). And for fstat() resp. the open() it
>> needs.

>
> (I'm not sure why we're discussing POSIX here, but...)

Because ANSI/ISO C doesn't have fstat(), so the thread was OT from it's very
beginning


> What if the file doesn't exist in a directory to which you do not
> have the proper permissions? I believe the error will be EPERM
> (or, at least, not ENOFILE), and you will display "does exist".
> The point is, an error other than ENOFILE does not imply that the
> file does exist. I believe the same holds true for stat() et al.

OK, make it this then:
printf("%s %s exist\n", filename, ((access(filename) == -1) && (errno==
ENOENT))? "doesn't":"may");

> The only thing you can reliably check for is whether you can open
> the file, by seeing what fopen() returns. (Yes, you can use
> something like access() to see if you have permission to a file
> _at_the_time_you_call_access()_, but you have race conditions to
> take into account.)

The OP was looking for an alternative to fstat() to check for the existence
of a file, that request seems entirly unneccessary, as fstat() requires the
file to have been open()ed first, hence proving that it exists and is
accessible.

To bring it back to topicallity, how about this:
#include <stdio.h>
#include <errno.h>

/*
* return 1 if file could be opened, proving it's existence, 0 otherwise,
* which is not a secure sign that the file doesn't exist!
*/
int faccess(char *filename)
{
FILE *fp;
/* mode got to be "r" or "r+", anything else would create it */
fp=fopen(filename, "r");
if (fp)
fclose(fp);

return fp?1:0;
}

/*
* returns 0 if filename does not exist, 1 if it exists and -1 if unsure
* i.e. if couldn't be opened for reading, but this could be due to
permissions
* to the file or some component of the file's path
*/
int fexist(char *filename)
{
errno=0;
(void)faccess(filename);
perror("");
switch (errno)
{
case 0: return 1;
case ENOENT: return 0;
default: return -1;
}
}



Bye, Jojo


 
Reply With Quote
 
 
 
 
Chris Torek
Guest
Posts: n/a
 
      12-13-2007
>"solarisss" <(E-Mail Removed)> schrieb im Newsbeitrag
>news:(E-Mail Removed)...
>>I have thousands of files whose exitence needs to be checked.
>> I think fstat is too costly for this.
>> Is there any better way for the same ?


In article <fjleja$lsc$(E-Mail Removed)> Joachim Schmitz
<(E-Mail Removed)> wrote:
>OT here, but in POSIX you'd have stat() (which would save you the fopen())
>and access() (which should be much cheaper as it doesn't have to fill the
>entire struct stat).


Using access() is usually the wrong approach, although this is not
the place to discuss why.

In this case, the best approach is probably to read the directory
(or directories) in which those "thousands of files" might be
stored, and then do your own in-memory lookups ... but this too is
off-topic, because ANSI C does not even support "read a directory"
type operations.
--
In-Real-Life: Chris Torek, Wind River Systems
Salt Lake City, UT, USA (4039.22'N, 11150.29'W) +1 801 277 2603
email: forget about it http://web.torek.net/torek/index.html
Reading email is like searching for food in the garbage, thanks to spammers.
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
jython newbee general question docu / os.fstat Mark Fink Python 1 02-05-2006 11:23 AM
Quicktime Alternative, RealPlayer Alternative & Media Player Classic John Capleton Computer Support 3 12-05-2005 07:41 AM
WPS DDK Updates or alternative? glenn Wireless Networking 1 11-06-2005 03:20 PM
fstat Martijn C Programming 2 01-11-2004 04:56 PM
fstat for an open fstream =?ISO-8859-1?Q?Klaus_F=FCller?= C++ 4 09-26-2003 11:39 PM



Advertisments