C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Re: Dateiexistenz überprüfen

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Markus Schaaf
Guest





PostPosted: Wed Nov 12, 2003 11:54 am    Post subject: Re: Dateiexistenz überprüfen Reply with quote



"Mark Henning" <n1234w5678s (AT) homolog (DOT) de> schrieb:

Quote:
bool FileExists(const char * szFilePath)
{
ifstream fileCheck(szFilePath, ios::nocreate);

Diese Flags sind Erweiterungen Deines Compilers und mithin völlig
unportabel. Mit reinem Standard-C++ geht da gar nichts. Ich würde
direkt das POSIX-open verwenden. Das existiert sogar unter Windows.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Karl Heinz Buchegger
Guest





PostPosted: Wed Nov 12, 2003 12:30 pm    Post subject: Re: Dateiexistenz überprüfen Reply with quote





Mark Henning wrote:
Quote:

Moin!

Wie überprüfe ich, ob eine Datei existiert? (Eigentlich eine triviale
Fragestellung, sollte man meinen, sind doch Beispiele dafür in Massen
vorhanden, aaaaber...)

In Standard C++ ?
Gar nicht.

Wie Du selbst schon festgestellt hast, ist die einzige Moeglichkeit
die Du mittels Standard C++ hast, zu versuchen ob die Datei geoeffnet
werden kann. Geht das, dann existiert die Datei mit Sicherheit. Geht
das aber nicht, dann gibts hunderte Gruende warum das nicht geht, einer
davon ist: Datei existiert nicht.

Also: Hier musst Du zu einer Platform spezifischen Loesung zurueck-
greifen. Ob Du willst oder nicht :-)

--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Andreas Huennebeck
Guest





PostPosted: Wed Nov 12, 2003 1:40 pm    Post subject: Re: Dateiexistenz überprüfen Reply with quote



Mark Henning wrote:

Quote:
Moin!

Wie überprüfe ich, ob eine Datei existiert? (Eigentlich eine triviale
Fragestellung, sollte man meinen, sind doch Beispiele dafür in Massen
vorhanden, aaaaber...) [..]
Wie kann ich also unterscheiden zwischen "Datei existiert nicht" und
"Datei existiert zwar, aber ich habe im Moment keinen Zugriff darauf"?

Mit access(2), ist POSIX-kompatibel.

Quote:
Oder wie muss ich die Datei anstelle von

ifstream ifs(FileName, ios::in, filebuf::sh_none);

öffnen, damit ein anderer Prozess zwar deren Existenz festellen, aber
weder lesend, noch schreibend darauf zugreifen kann?

Hintergrund: Ich habe eine Vielzahl von Prozessen auf verschiedenen
Rechnern, die lesend und schreibend auf diese Datei (zentral auf einem
Rechner gelegen) zugreifen, sich dabei aber nicht gegenseitig in's
Gehege kommen dürfen. Und im Falle, dass die Datei noch nicht
existiert, soll sie automatisch erzeugt werden.

Dazu brauchst Du eine Synchronisation mit Hilfe atomarer Operationen.
Einfaches Filehandling koennte da zu Problemen fuehren. Da das bei
Dir rechneruebergreifend stattfindet, kaemen Dateilocks (problematisch,
wenn die Klienten verschiedene OS haben) oder ein Serverprozess in Frage.
Ich bin in dem Gebiet (OS uebergreifende Synchronisation) aber kein
Fachmann.

Tschau
Andreas
--
Andreas Hünnebeck | email: [email]ah (AT) despammed (DOT) com[/email]
----- privat ---- | www : http://www.huennebeck-online.de
Fax/Anrufbeantworter: 0721/151-284301 o. 0180/50525-5232659 (24 Pfg/Min)
SMS: D1=72617 D2=0172/7366-042 E-Plus=0177/7934-396 Viag=0179/2029-894
GPG-Key: http://www.huennebeck-online.de/public_keys/andreas.asc

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Bastian Blank
Guest





PostPosted: Wed Nov 12, 2003 2:39 pm    Post subject: Re: Dateiexistenz überprüfen Reply with quote

Mark Henning wrote:
Quote:
bool FileExists(const char * szFilePath)
{
int nOpenResult(_open(szFilePath, _O_RDONLY));
int nErrNoSaved(errno);
if ( nOpenResult != -1 )
if ( nOpenResult >= 0 )
{
_close(nOpenResult);
return true;
}
else
return ( nErrNoSaved != ENOENT );
}

man 2 stat ist eigentlich das richtige für diese Aufgabe.

Quote:
Das Problem, das ich sehe: Es ist nicht mehr thread-sicher (da errno
im ungünstigsten Fall zwischen _open und Wertabfrage überschrieben
werden kann) - aber soweit ich weiß, gibt es im C++-Standards keine
Threads, und ich muss in diesem Fall wohl damit leben (zumindest, wenn
ich nicht Windows-spezifisch mit Critical_Sections anfangen will).

Was glaubst du, benutzt die STL im Hintergrund? Irgendwelche
Low-Level-Funktionen müssen es ja sein. Auch ist die Aussage, das errno
generell nicht thread-safe sei, unwahr[1].

Quote:
int nErrNoSaved(errno);
vs.
int nErrNoSaved = errno;

Ist das selbe. Allerdings muss man aufpassen, die Definition von errno
lässt auch Makros und andere Spielereien zu.

Bastian

[1] vgl: /usr/include/bits/errno.h mit errno.h Element von
glibc-Header.

wegen OT: fup2dcoup

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Torsten Robitzki
Guest





PostPosted: Wed Nov 12, 2003 6:06 pm    Post subject: Re: Dateiexistenz überprüfen Reply with quote

Mark Henning wrote:

Quote:
Markus Schaaf (Wed, 12 Nov 2003 12:54:12 +0100) wrote:

"Mark Henning" <n1234w5678s (AT) homolog (DOT) de> schrieb:


bool FileExists(const char * szFilePath)
{
ifstream fileCheck(szFilePath, ios::nocreate);

Diese Flags sind Erweiterungen Deines Compilers und mithin völlig
unportabel.


Aha - ich habe das aus einem allgemeinen Buch über C++ (in dem Buch
ist nirgendwo ein spezieller Compiler oder ein spezielles
Betriebssystem auch nur _erwähnt_, war von rororo) - deshalb ging ich
davon aus, das sei Standard und portabel, und auch in meiner Hilfe
(von MS-VC++ 6.0) steht nicht drin, das sei Microsoft- oder
Betriebssystem-spezifisch (was ansonsten an sehr vielen Stellen
angegeben ist).


Mit reinem Standard-C++ geht da gar nichts. Ich würde
direkt das POSIX-open verwenden. Das existiert sogar unter Windows.


Ich habe jetzt Folgendes versucht, und es scheint auch zu
funktionieren:

bool FileExists(const char * szFilePath)
{
int nOpenResult(_open(szFilePath, _O_RDONLY));
int nErrNoSaved(errno);
if ( nOpenResult != -1 )
{
_close(nOpenResult);
return true;
}
else
return ( nErrNoSaved != ENOENT );
}

Kommentare oder - wenn ich schonmal damit hier bin -
Verbesserungsvorschläge in Bezug auf den Stil?

Nun, jetzt weist Du, das es die Datei zu einem bestimmten Zeitpunkt gab.
Direkt nach dem Funktionsaufruf, kann die Datei auch schon wieder weg sein.

Quote:
Das Problem, das ich sehe: Es ist nicht mehr thread-sicher (da errno
im ungünstigsten Fall zwischen _open und Wertabfrage überschrieben
werden kann) - aber soweit ich weiß, gibt es im C++-Standards keine
Threads, und ich muss in diesem Fall wohl damit leben (zumindest, wenn
ich nicht Windows-spezifisch mit Critical_Sections anfangen will).

Errno ist glaube ich auch nicht C sondern posix. Und wenn Du eine
funktionierende threadfeste posix library hast, sollte errno auch keine
globale Variable sein, sondern ein Makro, das zu einem Funktionsaufruf
aufgelöst wird.

Quote:
Was haltet ihr eigentlich von den Varianten

int nErrNoSaved(errno);

vs.

int nErrNoSaved = errno;

?

Geschmackssache :-)

mfg Torsten

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Albrecht Fritzsche
Guest





PostPosted: Wed Nov 12, 2003 9:54 pm    Post subject: Re: Dateiexistenz überprüfen Reply with quote

Mark Henning wrote:
Quote:
Aha - ich habe das aus einem allgemeinen Buch über C++ (in dem Buch
ist nirgendwo ein spezieller Compiler oder ein spezielles
Betriebssystem auch nur _erwähnt_, war von rororo) - deshalb ging ich
davon aus, das sei Standard und portabel

Ich habe jetzt Folgendes versucht, und es scheint auch zu
funktionieren:

bool FileExists(const char * szFilePath)
{
int nOpenResult(_open(szFilePath, _O_RDONLY));
int nErrNoSaved(errno);
if ( nOpenResult != -1 )
{
_close(nOpenResult);
return true;
}
else
return ( nErrNoSaved != ENOENT );
}

Was sind _open() und _close() - wiederrum aus Deinem rororo-Buch?

Ali

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
André Pönitz
Guest





PostPosted: Thu Nov 13, 2003 10:17 am    Post subject: Re: Dateiexistenz überprüfen Reply with quote

Mark Henning <n1234w5678s (AT) homolog (DOT) de> wrote:
Quote:
Was haltet ihr eigentlich von den Varianten

int nErrNoSaved(errno);

vs.

int nErrNoSaved = errno;

Eine solide Grundlage fuer einen Glaubenskrieg.

Die Anhaenger der ersten Variante werden natuerlich zuerst verbrannt ;-)

Andre'

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.