ENGLISH VERSION |
|
Links | | | Forum | | | Kommentare | | | News melden |
Chat | | | Umfragen | | | Newsticker | | | Archiv |
amiga-news.de Forum > Programmierung > Existenz einer Datei | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
-1- | [ - Beitrag schreiben - ] |
07.12.2003, 17:24 Uhr Mad_Dog Posts: 1944 Nutzer |
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 [ - Antworten - Zitieren - Direktlink - ] |
07.12.2003, 18:36 Uhr nylan Posts: 58 Nutzer |
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 [ - Antworten - Zitieren - Direktlink - ] |
07.12.2003, 18:51 Uhr Mad_Dog Posts: 1944 Nutzer |
Zitat: 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 [ - Antworten - Zitieren - Direktlink - ] |
07.12.2003, 18:57 Uhr thomas Posts: 7718 Nutzer |
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/ [ - Antworten - Zitieren - Direktlink - ] |
07.12.2003, 18:59 Uhr AchimStegemann Posts: 112 Nutzer |
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 [ - Antworten - Zitieren - Direktlink - ] |
07.12.2003, 19:05 Uhr Mad_Dog Posts: 1944 Nutzer |
@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 [ - Antworten - Zitieren - Direktlink - ] |
07.12.2003, 20:15 Uhr Solar Posts: 3680 Nutzer |
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() ) [ - Antworten - Zitieren - Direktlink - ] |
07.12.2003, 20:50 Uhr mrbbc Posts: 101 Nutzer |
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... [ - Antworten - Zitieren - Direktlink - ] |
08.12.2003, 21:22 Uhr Holger Posts: 8116 Nutzer |
Zitat: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. [ - Antworten - Zitieren - Direktlink - ] |
08.12.2003, 23:44 Uhr Mad_Dog Posts: 1944 Nutzer |
Zitat: 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 [ - Antworten - Zitieren - Direktlink - ] |
-1- | [ - Beitrag schreiben - ] |
amiga-news.de Forum > Programmierung > Existenz einer Datei | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
Impressum |
Datenschutzerklärung |
Netiquette |
Werbung |
Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten. |