473,395 Members | 1,497 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,395 software developers and data experts.

Checkup: better way to test for file existence?

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.
Jul 23 '05 #1
14 7670

"Matt" <ma**@downwithspammers-mengland.net> wrote in message
news:18********************************@4ax.com...
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
Jul 23 '05 #2
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.

Jul 23 '05 #3
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).

Jul 23 '05 #4

wi******@hotmail.com> wrote in message
news:11**********************@o13g2000cwo.googlegr 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
Jul 23 '05 #5
On Mon, 14 Feb 2005 20:35:07 +0100, Rolf Magnus <ra******@t-online.de>
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.
Jul 23 '05 #6
On Mon, 14 Feb 2005 19:13:35 GMT, "Mike Wahler"
<mk******@mkwahler.net> wrote:

"Matt" <ma**@downwithspammers-mengland.net> wrote in message
news:18********************************@4ax.com.. .
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.
Jul 23 '05 #7

"Matt" <ma**@downwithspammers-mengland.net> wrote in message
news:c9********************************@4ax.com...
On Mon, 14 Feb 2005 19:13:35 GMT, "Mike Wahler"
<mk******@mkwahler.net> wrote:

"Matt" <ma**@downwithspammers-mengland.net> wrote in message
news:18********************************@4ax.com.. .
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
Jul 23 '05 #8
On Mon, 14 Feb 2005 11:58:04 -0600, Matt
<ma**@downwithspammers-mengland.net> 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.
Jul 23 '05 #9
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...

Jul 23 '05 #10
On 14 Feb 2005 18:43:33 -0800, "sqaengineering"
<sq************@yahoo.com> wrote:
if( _stat( strFile.c_str(), &stFile ) == -1 )
Excellent recommendation, I should have thought of this POSIX-based
stat() function earlier.

(It's been a long time since I've done system programming...it's
starting to come back to me now...and I've dug up my beloved, purple
"POSIX Programmer's Guide" book. Yes, I know this is not "standard"
C++, but it seems to be the next best thing, and with cygwin/mingw on
my Windows machines, I seem to be POSIX compliant on virtually every
platform I choose...I hope?)

-Matt

On 14 Feb 2005 18:43:33 -0800, "sqaengineering"
<sq************@yahoo.com> wrote:
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...


--
Remove the "downwithspammers-" text to email me.
Jul 23 '05 #11
Hi Mike, Thanks for this clarification. -Matt

On Mon, 14 Feb 2005 22:39:27 GMT, "Mike Wahler"
<mk******@mkwahler.net> wrote:
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


--
Remove the "downwithspammers-" text to email me.
Jul 23 '05 #12
Point taken. It compile and executes on windows as well for code
compiled with g++ though - so it is not strictly a unix call ....

Jul 23 '05 #13
In message <cu*************@news.t-online.com>, Rolf Magnus
<ra******@t-online.de> writes
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?


A program for producing lists of files springs to mind ;-)

--
Richard Herring
Jul 23 '05 #14
Richard Herring wrote:
In message <cu*************@news.t-online.com>, Rolf Magnus
<ra******@t-online.de> writes
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?


A program for producing lists of files springs to mind ;-)


lol, you mean sort of a brute-force way to get a directory listing without
actual directory support? I guess that'd take quite some time, even if you
assume "good" old DOS with it's case insensitive 8.3 file names. :-)

Jul 23 '05 #15

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

5
by: Thierry S. | last post by:
Hello. I would to test the existence of a variable before to use it (like isset($myVar) in PHP). I try using "if myVar: ", but there is the error meesage (naturally): "NameError: name 'myVar'...
2
by: David | last post by:
I'm using following code for checking a file existence. I's working fine for given folder. Is there a way to check a file exitance in subfolders? Thanks in advance, David Option Compare...
12
by: DC Gringo | last post by:
How do I test for existence of a file in the file system: If FileExists(myVariable & ".pdf") = True pnlMyPanel.Visible = True End If -- _____ DC G
4
by: Gabe Moothart | last post by:
Hello, In one of my asp.net applications I test the existence of a file, like so: File.Exists(Server.MapPath("/path/file.jpg"))); This was failing, even though the path returned by...
0
by: ryjfgjl | last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.