Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Gremlin

Anmeldungsdatum: 12.12.2004 Beiträge: 142 Wohnort: Heinsberg
|
Verfasst am: 22.04.2006, 13:30 Titel: Eigenschaften der Ausgabe von DIR |
|
|
Hallo,
man soll ja nicht mehrere verschiedene Probleme in einem Thread abhandeln...
Ich möchte noch fragen, inwiefern ich mich auf die Ausgabe, die DIR bei meinem System liefert, verlassen kann.
Genauer:
Ich schreibe das Ergebnis des SHELL-Befehls Dir in eine Datei, die dann in einer anderen Sub durchgegangen wird.
Code: | SHELL "DIR /OGN >> LIST.TXT" |
So, daraus sollen jetzt alle Ordner gefiltert werden, daher auch die ausführliche Ansicht.
Hier mal der Beginn der Datei, wie sie also aussieht:
Code: |
Datenträger in Laufwerk C: HARDDISK
Seriennummer des Datenträgers: ****-****
Verzeichnis von C:\qb4.5
. <DIR> 13.04.04 15:19 .
.. <DIR> 13.04.04 15:19 ..
3DDMORPH <DIR> 01.05.04 12:00 3ddmorph
3DDS <DIR> 01.05.04 12:00 3dds
ADOK <DIR> 18.04.04 16:09 adok
ANDERE <DIR> 14.04.04 11:49 andere
[...]
WETTBE~1 <DIR> 05.02.05 22:14 Wettbewerbe
ZIELQ <DIR> 15.12.04 19:34 Zielq
12423 TXT 0 05.06.04 22:28 12423.TXT
2134 0 05.06.04 22:28 2134
241 TXT 0 07.08.04 18:25 241.TXT
[...] |
Da habe ich mir gedacht:
Die ersten 7 Zeilen sind Ausschuss, die kann ich immer wieder in dieselbe Variable einlesen. Ab dann muss ich darauf achten, ob am 16. Zeichen der String "<DIR>" auftaucht und danach die Auswertung beenden.
Schön und gut...aber kann ich mich auch darauf verlassen?
Es könnte ja sein, dass bei älteren DOS-Versionen ein anderer Header der Ausgabe vorliegt und ich dann so ein falsches Ergebnis habe... _________________ Tja, hier konnte ihre Werbung stehen.
Pech gehabt.  |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 22.04.2006, 14:18 Titel: |
|
|
Bei mir sieht DIR /OGN eh ganz anders aus:
Code: | C:\>dir /OGN
Datenträger in Laufwerk C: ist WINDOWS
Datenträgernummer: E824-4A49
Verzeichnis von C:\
06.09.2004 15:47 <DIR> alt
28.12.2004 22:35 <DIR> Blue Byte
20.12.2004 17:23 <DIR> Borland
24.10.2004 11:35 <DIR> brother2k
07.12.2005 13:56 <DIR> cargu
25.02.2006 14:25 <DIR> cquiz15
17.07.2005 19:00 <DIR> ddk
05.03.2006 12:05 <DIR> Desktop-Alarm
01.12.2005 18:31 <DIR> Dev-Cpp
19.02.2006 16:15 <DIR> Dokumente und Einstellungen
03.04.2005 16:41 <DIR> ELSA
20.04.2006 13:32 <DIR> FreeBASIC
24.08.2004 16:20 <DIR> NVIDIA Display Driver
24.08.2004 16:47 <DIR> Program Files
09.04.2006 22:27 <DIR> Programme
22.04.2006 12:19 <DIR> WINNT
13.11.2005 20:48 <DIR> zonenmädchen_data
02.02.2006 11:57 176.895 2006_02_104.pdf
30.03.2006 21:36 129.526 2059213_01[1].wma
21.04.2006 16:30 108.364 HPIM0220.jpg
10.04.2006 16:28 437.942 IE4Info.bmp
10.04.2006 16:27 867.654 IE4Quark.bmp
19.04.2006 23:23 819.785 ISO1_DVD.nri
19.04.2006 22:59 10.039 Log.txt
19.04.2006 23:22 11.477 Log2.txt
11.03.2006 18:22 19.495 Office2000EasterEgg.png
30.03.2006 21:48 154 preview.m3u
31.05.2005 19:32 4 spath.ini
30.03.2006 15:48 66 zeit.bat
[...]
28 Datei(en) 23.895.657 Bytes
102 Verzeichnis(se), 10.274.766.848 Bytes frei
C:\>_ |
System ist W2k. _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 22.04.2006, 14:38 Titel: |
|
|
WinXP ist ganz ähnlich:
Code: | C:\>dir /OGN
Datenträger in Laufwerk C: ist Lokaler Datenträger
Volumeseriennummer: 1C09-4E64
Verzeichnis von C:\
25.01.2006 21:33 <DIR> Backup
01.09.2005 14:17 <DIR> CLICTOPF
02.01.2006 09:57 <DIR> conv
19.02.2005 17:16 <DIR> DESIGNER
13.02.2005 18:20 <DIR> Dokumente und Einstellungen
[...]
19.04.2006 11:52 <DIR> WINDOWS
01.08.2004 16:49 <DIR> WUTemp
24.08.2004 18:15 94 BIOSVIEW.INI
07.04.2006 12:32 115 DownloadLog.txt
24.04.2005 13:58 65'533 MZ
09.05.2004 13:37 3'239 TEMP.DIR
17.03.2006 20:41 360'054 test.bmp
5 Datei(en) 429'035 Bytes
31 Verzeichnis(se), 7'681'568'768 Bytes frei
C:\> |
Würde mich nicht wundern, wenn das auch noch Sprachabhängig ist.
Du betonst aber, das es um dein System geht.
Ich vermute das dein Windows das ganze immer gleich Formatiert, sonst: Probieren geht überstudieren  |
|
Nach oben |
|
 |
Gremlin

Anmeldungsdatum: 12.12.2004 Beiträge: 142 Wohnort: Heinsberg
|
Verfasst am: 22.04.2006, 14:58 Titel: |
|
|
Hm, ich habe es jetzt doch auf DIR /OGN /B umgestellt.
Dann muss ich halt akzeptieren, dass man den Ordner nicht "Haha.bla" nennen kann, was ja unter Windows möglich ist
So können im Ordnernamen wenigstens auch Leerstellen vorkommen, und Punkte, solange nicht genau 3 Zeichen danach kommen, reicht im Grunde für mein Vorhaben.
Danke für die Bestätigung, dass ich nicht umsonst umgestellt habe.  _________________ Tja, hier konnte ihre Werbung stehen.
Pech gehabt.  |
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 22.04.2006, 16:53 Titel: |
|
|
Gremlin hat Folgendes geschrieben: | Dann muss ich halt akzeptieren, dass man den Ordner nicht "Haha.bla" nennen kann, was ja unter Windows möglich ist  |
Diesen Fall könntest du aber auch abfangen, indem du erst mit DIR /AD /B die Ordner ausliest, und dann erst die Dateien...
jb _________________ Elektronik und Programmieren |
|
Nach oben |
|
 |
Gremlin

Anmeldungsdatum: 12.12.2004 Beiträge: 142 Wohnort: Heinsberg
|
Verfasst am: 22.04.2006, 17:48 Titel: |
|
|
Das habe ich ja eh schon.
macht nichts anderes als alphabetisch und mit Verzeichnissen zuerst geordnet (OGN) und im einfachen Modus zu listen (B).
Andererseits könnte dann ja auch jemand den Ordner unbedingt "zzzz.zzz" nennen wollen, was dann?
Ich schreibe dann halt in die Readme, dass man keine Punkte benutzen darf.
Denn bei meinem Projekt ist es so, dass es gar nicht wirklich auf "irgendwelche" Ordner ankommt, sondern auf ganz bestimmte, die dann vom User auch selber erstellt werden (können). Daher stellen sich manche Probleme nicht (wirklich). _________________ Tja, hier konnte ihre Werbung stehen.
Pech gehabt.  |
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 22.04.2006, 17:57 Titel: |
|
|
Öhm , mit DIR /AD /B werden *nur* Verzeichnisse aufgelistet. Somit könntest du sie seperat laden...
jb _________________ Elektronik und Programmieren |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 22.04.2006, 19:10 Titel: /B ist extra für SHELL "dir" konzipiert! |
|
|
Für das schleifenmässige Einlesen eines Verzeichnisses auf SHELL "dir"-Basis gibt es eigentlich nur eine Option: /B => immer "/B" verwenden! Damit bekommt man nur den nackten Dateinamen, so dass
Code: | SHELL "dir " + verz$ + "/b >" + ENVIRON$("TEMP") + "~DIR.TMP"
OPEN ENVIRON$("TEMP") + "~DIR.TMP" FOR INPUT AS 1
WHILE NOT EOF(1)
LINE INPUT#1, d$
' Irgend etwas beliebiges mit Datei d$ tun, z.B. OPEN d$ FOR INPUT AS 1
WEND
CLOSE 1
KILL ENVIRON$("TEMP") + "~DIR.TMP" |
möglich ist und dies auch garantiert überall korrekt funktioniert.
Ohne "/B" wird der Output abhängig von den gewählten Windows-Ländereinstellungen / COUNTRY.SYS-Eintrag bei DOS, ebenso sieht der Output bei jeder DOS- und Windowsversion auch wieder anders aus und natürlich sehen DIR-Ausgaben auf einer englischen Betriebssystemversion auch wieder anders aus als auf einer deutschen. Einen DIR-Output ohne /B zu parsen ist daher entsprechend aufwändig und fehlerträchtig, dass das Programm schlussendlich nicht überall läuft => daher SHELL "dir .." immer ausnahmlos mit "/B" verwenden!
@Thomas Antoni: Bitte evtl. im Monster-FAQ ergänzen. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
pinkpanther

Anmeldungsdatum: 28.05.2005 Beiträge: 79 Wohnort: Wien
|
Verfasst am: 22.04.2006, 19:28 Titel: |
|
|
Mir fielen da auch noch mindestens drei "Ich-will-auf-keinen-Fall-Call-Interrupt-benutzen" Lösungsvarianten ein, die alle ein wenig (wie man bei uns in Wien sagt) "hatschert" daherkommen (d.h. ungenau, schlampig, buggy).
Warum nicht gleich auf die (gar nicht so komplizierte) Call-Interrupt-Lösung zurückgreifen? Funktioniert unter allen Systemen, die DOS emulieren können (und unter allen DIRCMD-Einstellungen!). Enthält weder extrem viele Zeilen noch komplizierte Logik...
Code: | DEFINT A-Z
DECLARE FUNCTION OrdnerVorhanden% (rtOrdnerName$)
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 EINES ORDNERS"
PRINT
INPUT " Geben Sie bitte Pfad/Ordnername ein: ", tOrdnerName$
PRINT
IF OrdnerVorhanden%(tOrdnerName$) THEN
PRINT " Ordner vorhanden!"
ELSE
PRINT " Ordner nicht gefunden!"
END IF
END
FUNCTION OrdnerVorhanden% (rtOrdnerName$)
'1. Neuen DOS-Datentransferbereich einrichten
uRegister.DX = VARPTR(uDTA)
uRegister.DS = VARSEG(uDTA)
uRegister.AX = &H1A00
CALL InterruptX(&H21, uRegister, uRegister)
'2. Suchabfrage formulieren
tOrdnerName$ = rtOrdnerName$ + CHR$(0) 'ASCIIZ-String erzeugen
uRegister.AX = &H4E00 'DOS-Service "Suchen von Dateien/Ordnern"
uRegister.CX = 16 'Attribut-Kombination fuer Ordner
uRegister.DX = SADD(tOrdnerName$) 'Adresse des Suchbegriffs
'uRegister.DS = SSEG(tOrdnerName$) 'Segment des Suchbegriffs (PDS-Funktion)
uRegister.DS = VARSEG(tOrdnerName$) 'Segment des Suchbegriffs (QB 4.5-Funktion)
'3. Suche starten
CALL InterruptX(&H21, uRegister, uRegister)
'4. Suchergebnis auswerten
IF uRegister.Flags AND 1 THEN
OrdnerVorhanden = 0
ELSE
OrdnerVorhanden = -1
END IF
END FUNCTION |
_________________ lG
pinkpanther  |
|
Nach oben |
|
 |
|