Seite 1 von 1
Diskettenwechsel feststellen
Verfasst: 13.10.2005 13:22
von stbi
Moin!
Wie kann ich feststellen, ob eine Diskette ins Laufwerk gelegt wurde?
Gibt es da irgendeinen Event, auf den ich reagieren könnte? Im Forum und im Codearchiv hab ich jedenfalls nichts gefunden.
Dauernd ein ExamineDirectory() auf A:\ zu machen dürfte nicht der Weisheit letzter Schluss sein ...
Hintergrund der Anfrage ist, dass ich einen Sack oller 3,5"-Disketten archivieren und entsorgen will. Dazu will ich ein Programm machen, das automatisch das Diskettenlaufwerk checkt, ob eine neue (neu im Sinn einer unbekannten Volume Serial Number) Diskette eingelegt wurde und diese dann in ein entsprechendes Unterverzeichnis (wieder analog zur Volume Serial Number) kopiert. Und damit das im Hintergrund läuft und ich nicht immer auf einen Button klicken muss, soll das Programm den Diskettenwechsel eben automatisch erkennen.
Danke!
Verfasst: 13.10.2005 15:19
von AND51
Hallo!
Also unter WinXP macht der das aber auch mit ExamineDirectoy(), das sieht man daran, wenn du auf diskettenlaufwerk zugreifen willst und keine Diskette eingelegt ist. Dann schreibt WinXp ja auch "Bitte Diskette in Laufwerk A: einlegen".
Unter Win98 hingegen ist ein Knopf, namens "Wiederholen", den man anklicken muss, wenn man selbst eine neue DIskette eingelegt hat.
Es gibt keinen anderen Weg, als ExamineDirectory(), denn egal wie du das feststellen willst, ob eine neue Diskette drin ist.Wenn dein Diskettenlaufwerk relativ leise ist, ist es doch zu verkraften, oder? Und wenn nicht: Augen zu und durch.
Außrdem kann dein Vorhaben eh nicht 10% ig automatisiert werden, oder schaffst du es, dass sich die Disketten selbst ins Laufwerk stecken, wenn die vorherige komplett kopiert wurde?
Ich würds so machen:
Das Programm soll feststellen, ob eine neue Diskette eingelegt ist und den Namen der Diskkete und/oder die Seriennummer herausfinden, die dann als Name für den Zielordner genommen wird.
Dann soll das Programm automatisch anfangen zu kopieren und wenn es zu ende kopiert hat einen Sound oder Beep_ - Ton ausgeben, so weißt du, wann der Kopiervorgang beendet ist. Um nicht jedesmal auf den Knopf zu klicken "Kopieren starten" (oder so) soll das Program automatisch nach 15 oder 30 Sekunden damit anfangen. Nebenbei lässt du eine Liste erstellen mit den Seriennummern aller Disketten, um zu vermeiden, dass die Diskette erneut kopiert wird, wenn du sie aus Versehen wieder einlegst.
MfG, AND51
Verfasst: 04.01.2006 21:29
von AND51
und? hast du dein vorhaben realisiert? wenn ja wie?
Verfasst: 05.01.2006 11:14
von stbi
Danke der Nachfrage, leider nicht, da sich das Diskettenlaufwerk zu meinem Laptop verabschiedet hat

aber der Sack Disketten steht immer noch drohend hinter mir

und falls sich mal ein USB-laufwerk zu mir verirrt, werde ich das so machen, wie Du das beschrieben hast.
Verfasst: 05.01.2006 16:33
von AND51
lol...
Ich habe nicht so viele disketten...
aber naja. auch wenn die disketten heutzutage so uneffizient sind, irgendwann werde ich ihnen nachtrauern... nirgendwo sonst konnte mal eben schnell ne kleine datei drauf speichern und lesen. bei ner cd musste man erst drauf brennen. zum glück geht das heutzutage mit speicherkarten.
Mein absoluter Favorit ist die SD-Speicherkarte. Ist ja fast wie ne Minidiskette, nur mti schnellerer Transferrate und mehr Speicherkapazität.
Verfasst: 05.01.2006 16:39
von AND51
Ach ja: So kannst du die Seriennummer der Disketten überprüfen:
Gib in der Eingabeaufforderung bei XP mal
"LABEL A:" ein. Für weitere Hilfe gib mal "LABEL /?" ein.
entweder lässt du die eingabeaufforderung gehooked auslesen oder schreibe einfach "LABEL A: >C:\disk.txt" und schon ist alles, was auf den bildschirm kommt/käme in der datei gespeichert. ein > : datei wird jedesmal überschrieben. jeder neue befehl mit >> : ausgaben werden an die datei angehängt.
Verfasst: 05.01.2006 16:56
von Hroudtwolf
So zum Bleistift....
Code: Alles auswählen
; 2005 Hroudtwolf
; Check-Floppy
Declare.s GetHDSerial(Drive.s)
If OpenWindow(0,0,0,300,200,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Check Floppy")
CreateGadgetList(WindowID(0))
StringGadget(0,8, 10,306,20,"Keine Diskette eingelegt")
Repeat
If CheckTime.l=0 : StopTime.l=GetTickCount_()+400 : CheckTime.l=1 : EndIf
If CheckTime.l=1 And StopTime.l<GetTickCount_()
CheckTime.l=0
If GetHDSerial("a:")<>"0"
SetGadgetText(0,"Diskette eingelegt")
Else
SetGadgetText(0,"Keine Diskette eingelegt")
EndIf
EndIf
Until WaitWindowEvent()=#PB_Event_CloseWindow
EndIf
Procedure.s GetHDSerial(Drive.s)
DefType.l tmpSerial
DefType.s tmpdrv, tmpFS
tmpdrv.s = Left(Drive.s, 1) + ":\"
tmpFS = Space(256)
GetVolumeInformation_(@tmpdrv, @tmpFS, 255, @tmpSerial, 0,0 , @tmpFileSystem, 255)
ProcedureReturn Hex(tmpSerial)
EndProcedure
Verfasst: 05.01.2006 17:27
von stbi
@and51: es ist zwar kein Sack, aber eine randvolle Plastiktüte, ein paar hundert Stück werdens schon sein ...
@and51 und hroudtwolf: ich danke Euch für Hinweise und Code

Verfasst: 05.01.2006 18:10
von Lupo
Hat eine Diskette wirklich eine Seriennummer wie eine HD?
Ich kenne eigentlich nur das Label und das kann man beim
Formatieren (oder auch extra) setzen, glaube 11 Zeichen.
Das Label kann aber auch durchaus gleich sein bei Disketten,
meist ist es eh leer.
@HW: Liefert dein Code auch was wenn das Label leer ist?
(kanns nicht probieren weil mein DiskettenLW ist gerade hinüber -
muss erst einen Schrotthaufen wo plündern)
Es müsste aber einen API-Befehl geben (wie bei der CD) wo man
abfragen kann ob das Medium gewechselt wurde.
Wenn man mit dem Windows-Explorer das Inhaltverzeichnis einer Diskette
ansieht, dann wird der Inhalt gleich in den Cache gelesen, man merkts
am rumnuckeln. Wenn man den Explorer schliesst und wiederaufruft
nuckelt das Laufwerk nicht. Wenn man aber die Diskette rausnimmt und
gleich wieder reinsteckt dann lädt der Explorer den Cache neu.
Muss also einen Mechanismus geben der beim Öffnen des LW den
Cache leert bzw beim Neuzugriff feststellt dass das LW offen war.
Vom Inhalt hängts nicht ab. Leider hab ich diesen *ist das Medium
gewechselt worden Api-Befehl* noch nicht gefunden.
Weis jemand da näheres?
Danke
LUPO
Verfasst: 05.01.2006 18:23
von AND51
Entschuldigung, nicht den befehl LABEL nehmen, sondern VOL, der zeigt die Volume Seriennummer an!
Oder speicher auf jede Diskette eine kleine Textdatei!!!