Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > Checkup: better way to test for file existence?

Reply
Thread Tools

Checkup: better way to test for file existence?

 
 
Matt
Guest
Posts: n/a
 
      02-14-2005
Hello,

I see other references in this newsgroup saying that the only standard
C++ way to test for file existence is some variant of my code below;
can someone please confirm...or offer alternatives?

Additionally, might there be cross-platform alternatives, say in a
library like Boost, or something else?

-Matt

#include <fstream>

/*
[class FileHandle contains 'fstream file' and previously-initialed
'string filename'.]
*/

bool
FileHandle::exists()
{
bool retval = false;

// TODO/XXX: Is there a better way to
// test the existence of a file
// without opening it?

file.open(filename.c_str(), ios::in | ios::binary);

if (!file.fail()) retval = true;

file.close();

return retval;
}

--
Remove the "downwithspammers-" text to email me.
 
Reply With Quote
 
 
 
 
Mike Wahler
Guest
Posts: n/a
 
      02-14-2005

"Matt" <(E-Mail Removed)> wrote in message
news:(E-Mail Removed)...
> Hello,
>
> I see other references in this newsgroup saying that the only standard
> C++ way to test for file existence is some variant of my code below;
> can someone please confirm...or offer alternatives?


You must have misread them, or read some that were not
correct. There is no way in standard C++ to detect
conclusively the nonexistence of a file. (If an
open succeeds when using a mode other than once which
will create a nonexistent file, then of course that
does indicate that the file previously existed). But
if an open fails, that does not necessarily mean it
doesn't exist. All you can determine is if an attempt
to open a file succeeded or failed. An attempt to open
could fail for a variety of reasons depending upon the
environment, including but not limited to: insufficient
OS permissions, device where file resides is offline, does
not exist, etc. Many implementations do provide extensions
for obtaining more detailed information about i/o, but
they're not standard.

>
> Additionally, might there be cross-platform alternatives, say in a
> library like Boost, or something else?


There probably are some which address at least a small
number of environments. Try google.


>
> -Matt
>
> #include <fstream>
>
> /*
> [class FileHandle contains 'fstream file' and previously-initialed
> 'string filename'.]
> */
>
> bool
> FileHandle::exists()
> {
> bool retval = false;
>
> // TODO/XXX: Is there a better way to
> // test the existence of a file
> // without opening it?


Depends upon what 'better' means. There is no way
at all using standard C++. AFAIK platform-specific
solutions are provided by most implementations.

>
> file.open(filename.c_str(), ios::in | ios::binary);
>
> if (!file.fail()) retval = true;
>
> file.close();
>
> return retval;
> }


If this function returns 'false', all that means
is that the file could not be opened (for an unknown
reason). Nothing more, nothing less.

-Mike


 
Reply With Quote
 
 
 
 
wittempj@hotmail.com
Guest
Posts: n/a
 
      02-14-2005
You can test this with an old school C function:

#include "unistd.h."
#include <iostream>
#include <string>
int main(int argc, char **argv)
{
int ret(0);
std::string fname("C:\\AUTOEXEC.BAT");
ret = access(fname.c_str(), F_OK);
if (ret == -1)
std::cout << "Access on file " << fname << " is denied" <<
std::endl;

system("Pause");
return EXIT_SUCCESS;
}

more specific tests this if you can get access to the file.

 
Reply With Quote
 
Rolf Magnus
Guest
Posts: n/a
 
      02-14-2005
Matt wrote:

> bool
> FileHandle::exists()
> {
> bool retval = false;
>
> // TODO/XXX: Is there a better way to
> // test the existence of a file
> // without opening it?


Why would you want to test for the existence of a file if you don't want to
open it?
If you just want to make sure it's there so you can open it later, that's
not a good idea since something could change in between (file
removed/created/renamed, permissions changed, device unmounted, whatever).

 
Reply With Quote
 
Mike Wahler
Guest
Posts: n/a
 
      02-14-2005

http://www.velocityreviews.com/forums/(E-Mail Removed)> wrote in message
news:(E-Mail Removed) oups.com...
> You can test this with an old school C function:


'access()' is not a C (or C++) function, it's an extension
provided by some implementations. Also your use of it below
does not indicate a guarantee of a file's existence or nonexistence,
only whether it is accessible. An fstream object can already provide
this information.

>
> #include "unistd.h."
> #include <iostream>
> #include <string>
> int main(int argc, char **argv)
> {
> int ret(0);
> std::string fname("C:\\AUTOEXEC.BAT");
> ret = access(fname.c_str(), F_OK);
> if (ret == -1)
> std::cout << "Access on file " << fname << " is denied" <<
> std::endl;
>
> system("Pause");
> return EXIT_SUCCESS;
> }
>
> more specific tests this if you can get access to the file.


Here the topic is ISO standard C++. Your 'solution' is specific
to a UNIX implementation, so is not applicable to other platforms,
and is not topical here.

-Mike


 
Reply With Quote
 
Matt
Guest
Posts: n/a
 
      02-14-2005
On Mon, 14 Feb 2005 20:35:07 +0100, Rolf Magnus <(E-Mail Removed)>
wrote:
>Why would you want to test for the existence of a file if you don't want to
>open it?


I'm using (in an application I'm building to simulate a
more-complicated, future design) the existence or non-existence of
files as a means of inter-process communication.

(eg, while one process is processing a certain event, it writes a
zero-sized-file, then deletes said file when the event completes. A
separate process polls the existence of said file to see if the event
is continuing. I doubt I can give you many more details beyond that
without explaining more in depth my application and prototype.)

>If you just want to make sure it's there so you can open it later, that's
>not a good idea since something could change in between (file
>removed/created/renamed, permissions changed, device unmounted, whatever).


Yes, obviously. However, that's not what I'm trying to do. See
above.

-Matt
--
Remove the "downwithspammers-" text to email me.
 
Reply With Quote
 
Matt
Guest
Posts: n/a
 
      02-14-2005
On Mon, 14 Feb 2005 19:13:35 GMT, "Mike Wahler"
<(E-Mail Removed)> wrote:

>
>"Matt" <(E-Mail Removed)> wrote in message
>news:(E-Mail Removed).. .
>> Hello,
>>
>> I see other references in this newsgroup saying that the only standard
>> C++ way to test for file existence is some variant of my code below;
>> can someone please confirm...or offer alternatives?

>
>You must have misread them, or read some that were not
>correct. There is no way in standard C++ to detect
>conclusively the nonexistence of a file.


Fair enough. I'll rephrase my question:

What might you recommend as the best possible method/algorithm to
detect the non-existence of a file (even though it may not catch all
cases as noted below) in lieu of having a definitive means to do so
accurately.

As I read from the info below, there is no conclusive way to do this.
Hence there is no real answer to the problem.

What I'm looking for are alternative answers that get me "as close as
possible."

>> Additionally, might there be cross-platform alternatives, say in a
>> library like Boost, or something else?

>
>There probably are some which address at least a small
>number of environments. Try google.


Thanks for the google tip. I have been looking, even prior to this
post. My search was not initially productive, hence my post here.

-Matt

--
Remove the "downwithspammers-" text to email me.
 
Reply With Quote
 
Mike Wahler
Guest
Posts: n/a
 
      02-14-2005

"Matt" <(E-Mail Removed)> wrote in message
news:(E-Mail Removed)...
> On Mon, 14 Feb 2005 19:13:35 GMT, "Mike Wahler"
> <(E-Mail Removed)> wrote:
>
> >
> >"Matt" <(E-Mail Removed)> wrote in message
> >news:(E-Mail Removed).. .
> >> Hello,
> >>
> >> I see other references in this newsgroup saying that the only standard
> >> C++ way to test for file existence is some variant of my code below;
> >> can someone please confirm...or offer alternatives?

> >
> >You must have misread them, or read some that were not
> >correct. There is no way in standard C++ to detect
> >conclusively the nonexistence of a file.

>
> Fair enough. I'll rephrase my question:
>
> What might you recommend as the best possible method/algorithm to
> detect the non-existence of a file (even though it may not catch all
> cases as noted below) in lieu of having a definitive means to do so
> accurately.
>
> As I read from the info below, there is no conclusive way to do this.
> Hence there is no real answer to the problem.
>
> What I'm looking for are alternative answers that get me "as close as
> possible."


If you open the file as "input only, don't create" then
barring the circumstances I cited, a return of 'true'
from 'istream::fail()' would probably mean 'not found'.

std::ifstream input("filename");
if(!input)
std::cerr << "open failed, file probably does not exist\n";

-Mike


 
Reply With Quote
 
Matt
Guest
Posts: n/a
 
      02-15-2005
On Mon, 14 Feb 2005 11:58:04 -0600, Matt
<(E-Mail Removed)> wrote:
>Additionally, might there be cross-platform alternatives, say in a
>library like Boost, or something else?


I had a peak at Boost, there appears to be a file "exists()" method in
its filesystem library:

http://www.boost.org/libs/filesystem/doc/

I may check this out and use it, not sure yet.

-Matt
--
Remove the "downwithspammers-" text to email me.
 
Reply With Quote
 
sqaengineering
Guest
Posts: n/a
 
      02-15-2005
You could try something like this:

bool FileExists( std::string strFile )
{
bool bSuccess = true;
struct _stat stFile;

if( _stat( strFile.c_str(), &stFile ) == -1 )
bSuccess = false;

return bSuccess;
}

For linux, replace _stat with stat...

 
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
Is a blank at the end of a C file a better style than a newline atthe end of the file or is it better to place none? Jimmy C Programming 13 09-21-2011 12:17 AM
Is a blank at the end of a C file a better style than a newline atthe end of the file or is it better to place none? Jimmy C Programming 3 09-09-2011 10:36 PM
theres got to be a better way to test this... serialhex Ruby 0 06-04-2011 06:33 PM
Build a Better Blair (like Build a Better Bush, only better) Kenny Computer Support 0 05-06-2005 04:50 AM
test test test test test test test Computer Support 2 07-02-2003 06:02 PM



Advertisments