amiga-news DEUTSCHE VERSION
.
Links| Forums| Comments| Report news
.
Chat| Polls| Newsticker| Archive
.

amiga-news.de Forum > Programmierung > Existenz einer Datei [ - Search - New posts - Register - Login - ]

-1- [ - Post reply - ]

2003-12-07, 17:24 h

Mad_Dog
Posts: 1944
User
Hier mal eine Bescheidene Frage:

Wie löst Ihr für gewöhnlich folgendes Problem: Die Existenz einer Datei überprüfen.

Bis jetzt habe ich zwei verschiedene Ansätze benutzt:

1. Ansatz:

Versuche, das File zo locken. Anhand des Rückgabewerts der Lock-Funktion erkennt man dann, ob das File existiert.


2. Ansatz:

Gesamtes Dir, indem sich das File befindet in einen binären Suchbaum einlesen und dann in diesem nach dem File suchen.


In den RKMS habe ich leider keine Funktion wie etwa Exists(FILE) gefunden. Gibt's sowas? Habe ich da was übersehen?

--

http://www.norman-interactive.com

[ - Answer - Quote - Direct link - ]

2003-12-07, 18:36 h

nylan
Posts: 58
User
Oh, genau das Problem wollte ich auch just gerade lösen.
Möchte gerne rausfinden ob ein Verzeichnis existiert...

Ich schau auch nochmal eben weiter, vielleicht findet sich
ja was... ein "exist" existiert seltsamerweise wirklich nicht
als dos funktion.

nylan

[ - Answer - Quote - Direct link - ]

2003-12-07, 18:51 h

Mad_Dog
Posts: 1944
User
Zitat:
Original von nylan:
Oh, genau das Problem wollte ich auch just gerade lösen.
Möchte gerne rausfinden ob ein Verzeichnis existiert...

Ich schau auch nochmal eben weiter, vielleicht findet sich
ja was... ein "exist" existiert seltsamerweise wirklich nicht
als dos funktion.


Zumindest funktioniert es mit den von mir erwähnten Ansätzen. Auch in den Beispielsources zu den RKMs war es mit einem Lock-Versuch gelöst.

Das einzige, was mir noch einfällt, wäre ein Workaround, bei dem man sich den Befehl exists mit einem Shell-Script selbst bastelt.
In der AmigaDos Shell-Skriptsprache gibt es immerhin einen Ausdruck "IF EXISTS <filename>".

Aber einen direkten Ansatz scheint es wohl nicht zu geben?


--

http://www.norman-interactive.com

[ - Answer - Quote - Direct link - ]

2003-12-07, 18:57 h

thomas
Posts: 7718
User

BOOL exists (UBYTE *name)
{
BPTR lock;
if (lock = Lock(name,SHARED_LOCK))
{
UnLock (lock);
return (TRUE);
}
return (FALSE);
}


Diese Funktion gibt auch TRUE zurück, wenn es ein Verzeichnis diesen Namens gibt. Wenn es eine Datei sein muß, solltest du lieber Open() und Close() nehmen.

Z.B. so, wenn du eine existierende Datei nicht überschreiben möchtest:

BPTR SafeOpenNewfile (char *name)
{
BPTR fhand;
if (fhand = Open(name,MODE_OLDFILE))
{
Close (fhand);
SetIoErr (ERROR_OBJECT_EXISTS);
return (NULL);
}

return (Open(name,MODE_NEWFILE));
}

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ - Answer - Quote - Direct link - ]

2003-12-07, 18:59 h

AchimStegemann
Posts: 112
User
Wenn du in C programmieren möchstest geht das so:

int func(char *filename)
{
BPTR lock;
if(lock=Lock(filename,SHARED_LOCK))
{
// gefunden! bla bla...
UnLock(lock);
return TRUE;
}
return FALSE;
}

Die Datei darf aber nicht von einem anderen Programm bereits zum Schreiben geöffnet sein. Bei FALSE kann man sich aber noch IoErr() bedienen, da hier beim Scheitern der Lock-Funktion weitere Fehlercodes analysiert werden können.

Gruß
Achim

[ - Answer - Quote - Direct link - ]

2003-12-07, 19:05 h

Mad_Dog
Posts: 1944
User
@Achim und Thomas:

Ja, so ähnlich habe ich das bisher auch immer gemacht. Und eben mit IOErr() noch den Fehlercode überprüft. Aber was "direkteres" gibt die Dos.library wohl nicht her?




--

http://www.norman-interactive.com

[ - Answer - Quote - Direct link - ]

2003-12-07, 20:15 h

Solar
Posts: 3680
User
Since Open() (on a filesystem object) implies a Lock() internally, the amount of processing required for a FileHandle is obviously greater than that for a FileLock. Thus, to check for the mere existence of a file, it is better to use the function Lock() (and maybe convert the lock into a FileHandle subsequently by using the new 2.0 function OpenFromLock()); unfortunately, directories cannot be Open()ed.

(Amiga Guru Book, §17.1.93 Open() )

[ - Answer - Quote - Direct link - ]

2003-12-07, 20:50 h

mrbbc
Posts: 101
User
Also ich begnüge mich für normal damit, dass wenn fopen() NULL zurück gibt, dass die Datei oder das angegebene Verzeichnis etc. nicht existiert...

Kommt natürlich darauf an, ob man's genauer wissen muss, oder nur geprüft werden soll, ob eine Datei existiert...

[ - Answer - Quote - Direct link - ]

2003-12-08, 21:22 h

Holger
Posts: 8116
User
Zitat:
Original von thomas:
Diese Funktion gibt auch TRUE zurück, wenn es ein Verzeichnis diesen Namens gibt. Wenn es eine Datei sein muß, solltest du lieber Open() und Close() nehmen.

Wieso?
Wenn Du ein Lock hast, kannst Du Dir auch die File-Informationen geben lassen. Dann kannst Du auch erfahren, ob es ein Verzeichnis, eine Datei oder ein symbolischer Link ist.
Die Datei dafür zu öffnen, ist overkill.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Answer - Quote - Direct link - ]

2003-12-08, 23:44 h

Mad_Dog
Posts: 1944
User
Zitat:
Original von Holger:
Zitat:
Original von thomas:
Diese Funktion gibt auch TRUE zurück, wenn es ein Verzeichnis diesen Namens gibt. Wenn es eine Datei sein muß, solltest du lieber Open() und Close() nehmen.

Wieso?
Wenn Du ein Lock hast, kannst Du Dir auch die File-Informationen geben lassen. Dann kannst Du auch erfahren, ob es ein Verzeichnis, eine Datei oder ein symbolischer Link ist.
Die Datei dafür zu öffnen, ist overkill.


Yo, das geht in etwa so (Codeschnipsel aus einem meiner Programme):

code:
// Lock the file in EXCLUSIVE_LOCK mode
         MyFileLock = Lock(filename,ACCESS_WRITE);

         // If Lock was successfull -> File exists
         if (MyFileLock != 0)
         {
           if (Examine(MyFileLock,File_Info_Block) == 0)
           {
              PrintFault(IoErr(),"Examine failed ");
           }

           // ...Do some stuff here

           UnLock(MyFileLock);  // Unlock the file again
         }


Analog für Lesezugriffe...

--

http://www.norman-interactive.com

[ - Answer - Quote - Direct link - ]


-1- [ - Post reply - ]


amiga-news.de Forum > Programmierung > Existenz einer Datei [ - Search - New posts - Register - Login - ]


.
Masthead | Privacy policy | Netiquette | Advertising | Contact
Copyright © 1998-2024 by amiga-news.de - all rights reserved.
.