Diskettenwechsel feststellen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
stbi
Beiträge: 685
Registriert: 31.08.2004 15:39
Wohnort: Cleverly Hills

Diskettenwechsel feststellen

Beitrag 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!
PB 4.02 XP Pro SP2 "Der Code ist willig, aber der Prozessor ist schwach."

Es gibt keine Vista-Witze. Es ist alles wahr!
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

und? hast du dein vorhaben realisiert? wenn ja wie?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
stbi
Beiträge: 685
Registriert: 31.08.2004 15:39
Wohnort: Cleverly Hills

Beitrag von stbi »

Danke der Nachfrage, leider nicht, da sich das Diskettenlaufwerk zu meinem Laptop verabschiedet hat :cry: aber der Sack Disketten steht immer noch drohend hinter mir :lol: und falls sich mal ein USB-laufwerk zu mir verirrt, werde ich das so machen, wie Du das beschrieben hast.
PB 4.02 XP Pro SP2 "Der Code ist willig, aber der Prozessor ist schwach."

Es gibt keine Vista-Witze. Es ist alles wahr!
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Hroudtwolf
Beiträge: 1416
Registriert: 30.10.2004 23:33
Kontaktdaten:

Beitrag 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
Benutzeravatar
stbi
Beiträge: 685
Registriert: 31.08.2004 15:39
Wohnort: Cleverly Hills

Beitrag 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 :allright:
PB 4.02 XP Pro SP2 "Der Code ist willig, aber der Prozessor ist schwach."

Es gibt keine Vista-Witze. Es ist alles wahr!
Benutzeravatar
Lupo
Beiträge: 147
Registriert: 16.02.2005 15:15

Beitrag 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
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Entschuldigung, nicht den befehl LABEL nehmen, sondern VOL, der zeigt die Volume Seriennummer an!

Oder speicher auf jede Diskette eine kleine Textdatei!!!
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten