Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Lestat
Anmeldungsdatum: 20.12.2005 Beiträge: 3
|
Verfasst am: 20.12.2005, 22:16 Titel: Überprüfen ob Datei vorhanden |
|
|
Ich will überprüfen ob eine Datei vorhanden ist
So hab ich es bissher:
Zitat: |
...
4 ON ERROR GOTO FEHLER
OPEN "profil.sav" FOR INPUT AS 1
vorhanden:
DO
LINE INPUT #1, name$
LOOP UNTIL EOF(1)
CLOSE 1
PRINT "Das Profil"; name$; "wird dabei ?berschrieben."
PRINT "M”chten sie ihr Profil behalten und trotzdem ein neues Spiel beginnen, m?ssen sie vorher eine Sicherheitskopie der .sav Dateien machen"
PRINT
PRINT "Profil wirklich ?berschreiben?";
COLOR 11, 0
INPUT "(B)est„tigen / (A)bbrechen"; frage$
IF frage$ = "b" THEN start
IF frage$ = "B" THEN start
GOTO 1
END
nichtvorhanden:
PRINT
PRINT "Es ist kein Spielstand vorhanden!"
SLEEP
GOTO 1
END
FEHLER:
IF ERR = 53 THEN RESUME nichtvorhanden |
Da gibt er immer aus: "Marke nicht definiert" (Makiert ist hierbei ON) |
|
Nach oben |
|
 |
Devilkevin aka Kerstin

Anmeldungsdatum: 11.11.2004 Beiträge: 2532 Wohnort: nähe Mannheim
|
Verfasst am: 20.12.2005, 22:24 Titel: |
|
|
Hi, dazu gibts was in der MonsterFAQ auf Qbasic.de!!
Zitat: | Das geht gemäß folgender Befehlssequenz:
ON ERROR GOTO Handler
INPUT "Welche Datei ist auf ihre Existenz hin zu prüfen? ",datnam$
OPEN "I", #1, datnam$
CLOSE #1
GOTO Ende
Handler:
PRINT "Datei ";datnam$;"nicht gefunden!"
RESUME Ende
Ende:
Wichtig ist, dass die Datei sequenziell im INPUT-Modus geöffnet wird, denn im OUTPUS-Modus würde sie einfach erstellt werden. |
Gibt noch mehr möglichkeiten, einfach in die MonsterFAQ (link oben) schauen. _________________ www.piratenpartei.de |
|
Nach oben |
|
 |
Lestat
Anmeldungsdatum: 20.12.2005 Beiträge: 3
|
Verfasst am: 20.12.2005, 22:40 Titel: |
|
|
Ich frage mich immernoch wo der Fehler bei mir liegt.. ist ja nicht so, dass ich mich vorher nicht informiert habe, bevor ich hier gepostet habe
Hab das nun mal so übernommen wie es in deinem Quote steht... und wieder:
Marke nicht definiert  |
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 20.12.2005, 22:52 Titel: |
|
|
Also der Code klappt bei mir einwandfrei :
Code: |
ON ERROR GOTO Handler
INPUT "Welche Datei ist auf ihre Existenz hin zu prüfen? ",datnam$
OPEN "I", #1, datnam$
CLOSE #1
GOTO Ende
Handler:
PRINT "Datei ";datnam$;"nicht gefunden!"
RESUME Ende
Ende:
|
jb |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 20.12.2005, 23:11 Titel: |
|
|
Vielleicht als Verfeinerung: Von VBScript her bin ich mir eigentlich die FileExists()-Methode gewöhnt.
In QB lässt sich ansonsten eine gleichwertige FUNCTION programmieren:
http://beilagen.dreael.ch/QB/DATEXIST.BAS
Kleine Unschönheit: QB erlaubt den Error-Handler nur ins Hauptprogramm zu platzieren statt innerhalb der FUNCTION. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 20.12.2005, 23:26 Titel: |
|
|
Kann man nicht unter PDS
verwenden? Das sollte doch das gleiche bewirken, oder?
jb |
|
Nach oben |
|
 |
Lestat
Anmeldungsdatum: 20.12.2005 Beiträge: 3
|
Verfasst am: 21.12.2005, 00:24 Titel: |
|
|
dreael hat Folgendes geschrieben: |
Kleine Unschönheit: QB erlaubt den Error-Handler nur ins Hauptprogramm zu platzieren statt innerhalb der FUNCTION. |
Dort lag der Hund begraben..
Vielen Dank!  |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 21.12.2005, 22:36 Titel: |
|
|
on local error gibts nur in vb... ich vermisse es auch sehr in fb... _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Lutz Ifer Grillmeister

Anmeldungsdatum: 23.09.2005 Beiträge: 555
|
Verfasst am: 22.12.2005, 00:21 Titel: |
|
|
Sers!
on local error geht auch in fb. musst halt mit "-ex" compilieren.
siehe auch die "onerror.bas" im examples-verzeichnis.
Gruß
Lutz Ifer[/code] |
|
Nach oben |
|
 |
pinkpanther

Anmeldungsdatum: 28.05.2005 Beiträge: 79 Wohnort: Wien
|
Verfasst am: 22.12.2005, 06:41 Titel: |
|
|
Zitat: | Kann man nicht unter PDS
Code:
ON LOCAL ERROR
verwenden? Das sollte doch das gleiche bewirken, oder? (jb) |
Zitat: |
on local error gibts nur in vb... (jojo) |
Auszug aus der PDS-Hilfe: Zitat: |
ON [LOCAL] ERROR {GOTO line | RESUME NEXT | GOTO 0}
■ LOCAL Used to indicate an error-handling routine in the
same procedure. If not used, module-level error handlers
are indicated. |
BTW: Wie schon drael zutreffenderweise schrieb, gibt es elegantere Methoden, um die (Nicht-)Existenz einer Datei zu prüfen. Fehlerbehandlungsroutinen sollten IMO nur dann eingesetzt werden, wenn es wirklich keine andere Möglichkeit gibt, eine bestimmte Bedingung explizit auszutesten. Unter anderem auch deshalb, weil das durch Fehlerbehandlungsroutinen bedingte Herumspringen quer durch den Code ein Programm nicht unbedingt "lesbarer" macht. _________________ lG
pinkpanther  |
|
Nach oben |
|
 |
Thomas Antoni

Anmeldungsdatum: 12.10.2004 Beiträge: 220 Wohnort: Erlangen
|
Verfasst am: 22.12.2005, 20:08 Titel: Dazu habe ich mir Folgendes für die MonsterFAQ vorgemerkt... |
|
|
Dazu habe ich mir Folgendes für die QB-MonsterFAQ vorgemerkt...
-------------------------------------------------------------------------------------
Frage deutsch
~~~~~~~~~~~~~~~~
Wie stelle ich fest, ob eine Datei existiert?
Question English
~~~~~~~~~~~~~~~~
How to figure out whether a file is existing or not?
Antwort 1
~~~~~~~~~~~~~~~~
[ von Andreas Meile im QB-Forum, 2004 ]
Weil in QB so etwas wie file_exists() aus der Programmiersprache PHP fehlt,
würde ich doch dafür eine kleine Ersatz-FUNCTION wie folgt implementieren:
Code: |
'********************************************************
' FILEXIST.EXE = Testet ob eine Datei existiert
' ============
' Dieses QBasic-Programm stellt fest, ob eine Datei
' mit dem angegebenen Pfad- und Dateinamen existiert.
' Es ist ein einfacher Ersatz f?r file_exists() aus PHP
'
' (c) Andreas Meile, 25.10.2004
' ("Dreael"; qbasicde@dreael.ch)
'********************************************************
'
DECLARE FUNCTION DateiExistiert% (d$)
'
INPUT "Dateiname"; d$
'
IF DateiExistiert(d$) THEN
PRINT "Datei "; d$; " existiert."
ELSE
PRINT "Datei "; d$; " gibt es nicht!"
END IF
'
END
'
Fehler:
ex% = 0
RESUME NEXT
'
FUNCTION DateiExistiert% (d$)
SHARED ex%
'
ex% = -1
ON ERROR GOTO Fehler
OPEN d$ FOR INPUT AS 1
CLOSE 1
ON ERROR GOTO 0
DateiExistiert% = ex%
END FUNCTION
|
Leider muss der Error-Handler bei Q(uick)Basic (hier die Befehlssequenz nach
"Fehler:") im Hauptprogramm platziert sein und daf nicht in einer SUB oder
FUNCTION untergebracht sein.
Antwort 2
~~~~~~~~~~~~~
[ von Thomas Antoni, 26.10.2004 ]
So kann man prüfen, ob eine Datei vorhanden ist:
*** Variante 1:
Bei sequentiellen Dateien, die zum Lesen geöffnet werden, Fehler
"Datei nicht gefunden" abfragen entsprechend dem folgenden Bei-
spiel:
Code: |
'*********************************************************************
' SEQERROR.BAS = Stellt fest, ob eine sequentielle Datei vorhanden ist
' ============
' (C) Thomas Antoni, 15.5.2005
'*********************************************************************
ON ERROR GOTO fehler
INPUT "Welche Datei wollen Sie oeffnen "; dateiname$
OPEN dateiname$ FOR INPUT AS #1
GOTO weiter
fehler: PRINT "Datei nicht vorhanden!"
INPUT "Geben Sie den korrekten Dateinamen ein"; dateiname$
RESUME 'Ruecksprung zum fehlerverursachenden Befehl
weiter: PRINT "Datei ist vorhanden"
'... Hier folgen die weiteren Befehle
|
*** Variante 2: Bei allen anderen Dateiarten: Dateilänge auf "0" abfragen:
Code: | IF LOF (<Dateinr. ohne #>) > 0 THEN ... 'Dateilänge > 0 ? |
Funktioniert bei Direktzugriffs-Dateien und binären Dateien. Bei
sequentiellen Dateien nur in der Zugriffsart OUTPUT verwendbar.
**** Variante 3: Prüfen, ob ein definiertes Datum rücklesbar ist, siehe
TOP96.BAS (bei Direktzugriffs-Dateien). Wenn "0" ausge-
lesen wird, ist die Datei nicht vorhanden.
Welche der genannten Variante sinnvoll ist, hängt von der Dateiart und
der Zugriffsart ab.
Antwort 3
~~~~~~~~~~~~~
[ von im QB-Forum, 26.10.2004 ]
Wenn der Dateiname nicht als Variable im Programm gebraucht wird, kann man eine
Batchdatei oder als Shell-Befehl das ganze recht einfach machen.
*** Codebeispiel mit SHELL:
Code: |
SHELL "if exist c:\file.dat del c:\file.dat"
|
*** Codebeispiel mit einer Batchdatei namens loesch.bat:
Inhalt der Batchdatei loesch.bat:
Inhalt QB-Programms, das die Batchdatei loesch.bat aufruft:
Code: |
SHELL "loesch c:\file.dat"
|
------------------------------------------------------------------------------------- _________________ +++ Die beliebte QBasic CD-ROM von QBasic.de - 670 MB QBasic-Stuff mit komfortabler HTML-Oberfläche. Für nur 5 EUR bestellbar auf www.antonis.de/qbcdueb.htm +++ |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 22.12.2005, 22:32 Titel: Re: Dazu habe ich mir Folgendes für die MonsterFAQ vorgemerk |
|
|
Thomas Antoni hat Folgendes geschrieben: | *** Variante 2: Bei allen anderen Dateiarten: Dateilänge auf "0" abfragen:
Code: | IF LOF (<Dateinr. ohne #>) > 0 THEN ... 'Dateilänge > 0 ? |
Funktioniert bei Direktzugriffs-Dateien und binären Dateien. Bei
sequentiellen Dateien nur in der Zugriffsart OUTPUT verwendbar. |
Grundsätzlich korrekt recherchiert, aber von solchen Methoden rate ich wiederum eher ab, denn ich will ja nicht jedesmal einen Schreibzugriff verursachen (Datei neu anlegen), wenn ich eigentlich nur die Existenz prüfen will, sonst habe ich schlussendlich die reinste Müllhalde mit solchen 0-Byte-Dateien auf der Diskette/Festplatte/Server-Netzlaufwerk...
Daher sollte man grundsätzlich bei OPEN .. FOR BINARY vorher ein in ON ERROR GOTO eingeklemmtes OPEN ... FOR INPUT AS machen, um einen Schreibzugriff zu vermeiden, sonst gibt es Probleme bei z.B. einer schreibgeschützten Diskette. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
pinkpanther

Anmeldungsdatum: 28.05.2005 Beiträge: 79 Wohnort: Wien
|
Verfasst am: 23.12.2005, 15:03 Titel: |
|
|
Hier der "direkte" (und dabei relativ einfache) Weg über DOS-Interrupt &H21 - ohne unnötige Schreibaktivitäten bzw. Fehlerbehandlungsroutinen.
Zu beachten:
1. QB mit dem Parameter /l starten - andernfalls kann CALL INTERRUPT nicht ausgeführt werden.
2. Unter PDS letzte Zeile von Pkt. 2 (wie dort vorgeschlagen) abändern.
Code: | DEFINT A-Z
DECLARE FUNCTION DateiVorhanden% (rtDateiName$)
TYPE typRegister
AX AS INTEGER
BX AS INTEGER
CX AS INTEGER
DX AS INTEGER
BP AS INTEGER
SI AS INTEGER
DI AS INTEGER
Flags AS INTEGER
DS AS INTEGER
ES AS INTEGER
END TYPE
DIM SHARED uRegister AS typRegister
TYPE typDTA
Reserviert AS STRING * 21
Attribut AS STRING * 1
DateiZeit AS STRING * 2
DateiDatum AS STRING * 2
DateiGroesse AS LONG
DateiName AS STRING * 13
END TYPE
DIM SHARED uDTA AS typDTA
CLS
PRINT "PRUEFEN AUF EXISTENZ EINER DATEI"
PRINT
INPUT " Geben Sie bitte Pfad/Dateiname ein: ", tDateiName$
PRINT
IF DateiVorhanden%(tDateiName$) THEN
PRINT " Datei vorhanden!"
ELSE
PRINT " Datei nicht gefunden!"
END IF
WHILE LEN(INKEY$) = 0
WEND
END
DEFINT A-Z
FUNCTION DateiVorhanden% (rtDateiName$)
'1. Neuen DOS-DTA einrichten
uRegister.DX = VARPTR(uDTA)
uRegister.DS = VARSEG(uDTA)
uRegister.AX = &H1A00
CALL InterruptX(&H21, uRegister, uRegister)
'2. Suchabfrage formulieren
tDateiName$ = rtDateiName$ + CHR$(0) 'ASCIIZ-String erzeugen
uRegister.AX = &H4E00 'DOS-Service "Suchen von Dateien"
uRegister.CX = 39 'Attribut-Kombination fuer "beliebige Datei"
uRegister.DX = SADD(tDateiName$) 'Adresse des Suchbegriffs
uRegister.DS = VARSEG(tDateiName$) 'Segment des Suchbegriffs (QB 4.5)
'uRegister.DS = SSEG(tDateiName$) 'Segment des Suchbegriffs (PDS)
'3. Suche starten
CALL InterruptX(&H21, uRegister, uRegister)
'4. Suchergebnis auswerten
IF uRegister.Flags AND 1 THEN
DateiVorhanden = 0
ELSE
DateiVorhanden = -1
END IF
END FUNCTION |
Download von Quellcode + EXE: http://rapidshare.de/files/9687941/DateiDa.zip.html _________________ lG
pinkpanther  |
|
Nach oben |
|
 |
studio
Anmeldungsdatum: 08.08.2005 Beiträge: 34
|
Verfasst am: 03.05.2006, 11:14 Titel: |
|
|
Guten Morgen!
Zur oben gestellten Problematik hätte ich ebenfalls eine Frage.
Meine Entwicklungsumgebung gestaltet sich etwas anders (siehe SIG).
Leider steht mir kein INPUT-Modus in der OPEN-Anweisung zur Verfügung.
Bisdato habe ich die Existenz einer Datei immer folgendermaßen gelöst:
Code: |
OPEN Datname$ AS #datFile%
FIELD #datFile%, 20 AS DateienD$
DATlaenge% = LOF(#datFile%)
CLOSE #datFile%
IF DATlaenge% > 0 THEN
PRINT "DAT ist da";
ELSE
PRINT "DAT ist nicht da";
KILL Datname$
END IF
|
Gibt es einen anderen Weg die Überprüfung zu tätigen ohne einen
wie oben schon erwähnt: "Schreibzugriff verursachen (Datei neu anlegen)"?
Desweiteren würde ich gerne in Erfahrung bringen, wie ich eine ausführbare Datei
auf Ihre Existenz prüfen kann. In meinem Fall wäre dies: .PD4
(ohne dabei über den Error-Handler gehen zu müssen -> "File not found")
Vielen Dank im Voraus für Eure Antworten.
Gruß
studio _________________ Entwicklungsumgebung:
---------------------------
Hardware: Denso BHT 300 / SATO Etikettendrucker (MB 200)
Software: BHT-Basic (Ähnlichkeiten zu MSDOS-Basic)
Infos: ftp://www.denso-id.de/Documents/Manuals/Programmers_Manuals/Denso_OS/BHT300_Programmers_Manual_E.pdf
Zuletzt bearbeitet von studio am 03.05.2006, 12:06, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 03.05.2006, 11:56 Titel: |
|
|
du kannst immer hingehen und einfach DIR in ne datei umleiten und auslesen:
Code: | SHELL "dir *.pd4 /zusatzparameterwiesdiramliebstenis > c:\temp.txt"
OPEN "c:\temp.txt" FOR INPUT AS #irgendwas
'dann eben aus #irgendwas das ergebnis von dir auslesen worin alle vorhandenen dateien stehen sollten
CLOSE #irgendwas
KILL "c:\temp.txt" |
das wäre zumindest unter QB die Alternativmethode die eben noch umständlicher ist als das mit dem error verursachen, dafür produziert man damit aber auch nicht gezielt fehler was so manchem vielleicht lieber ist  _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
studio
Anmeldungsdatum: 08.08.2005 Beiträge: 34
|
Verfasst am: 03.05.2006, 12:19 Titel: |
|
|
Hallo!
Vielen Dank für Deine Antwort.
MisterD hat Folgendes geschrieben: | du kannst immer hingehen und einfach DIR in ne datei umleiten und auslesen:
Code: | SHELL "dir *.pd4 /zusatzparameterwiesdiramliebstenis > c:\temp.txt"
OPEN "c:\temp.txt" FOR INPUT AS #irgendwas
'dann eben aus #irgendwas das ergebnis von dir auslesen worin alle vorhandenen dateien stehen sollten
CLOSE #irgendwas
KILL "c:\temp.txt" |
das wäre zumindest unter QB die Alternativmethode die eben noch umständlicher ist als das mit dem error verursachen, dafür produziert man damit aber auch nicht gezielt fehler was so manchem vielleicht lieber ist  |
SHELL und FOR INPUT in der OPEN-Anweisung stehen mir bei meinem
BASIC Derivat leider nicht zur Verfügung. Somit kann ich Deine Hilfe
nicht in die Tat umsetzen.
Ziel:
Sobald "ANZTMP.PD4" vorhanden ist, diese umzubenennen durch "ANZ.PD4"
Aktuell habe ich es so gelöst:
Code: |
ON ERROR GOTO FEHLER
...
OLDNAME$ = "ANZTMP.PD4"
NEWNAME$ = "ANZ.PD4"
CALL "FILE.FN3" .fcRename OLDNAME$, NEWNAME$
IF error$ = "1" THEN
BEEP ,,2,0
error$ = "0"
LOCATE 1,7 : PRINT "NIX DA";
ELSE
LOCATE 1,7 : PRINT "IST DA";
KILL "ANZTMP.PD4"
END IF
FEHLER
error$ = "1"
RESUME NEXT
|
Bei dieser Variante warte ich allerdings auf einen Fehler.
Über Alternativen würde ich mich sehr freuen.
Gruß
studio _________________ Entwicklungsumgebung:
---------------------------
Hardware: Denso BHT 300 / SATO Etikettendrucker (MB 200)
Software: BHT-Basic (Ähnlichkeiten zu MSDOS-Basic)
Infos: ftp://www.denso-id.de/Documents/Manuals/Programmers_Manuals/Denso_OS/BHT300_Programmers_Manual_E.pdf |
|
Nach oben |
|
 |
|