amiga-news 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:
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

[ - Antworten - Zitieren - Direktlink - ]

07.12.2003, 18:57 Uhr

thomas
Posts: 7717
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:
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.

[ - Antworten - Zitieren - Direktlink - ]

08.12.2003, 23:44 Uhr

Mad_Dog
Posts: 1944
Nutzer
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

[ - 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.
.