USB-Stick erkennen



  • Ich wollte einmal fragen ob es (und wenn ja, wie) möglich wäre, als Bedingung zu stellen das ein USB-Stick vorhanden ist.
    Also bei mir z.B. Das er prüft ob ein USB-Stick eingesteckt ist, wenn ja, dann auf diesem prüft ob eine bestimmte Datei darauf gespeichert ist und wenn dies auch der fall ist in diesr Datei guckt ob etwas bestimmtes drinne steht und dann, wenn auch dieses Ereignis stimmen sollte, dass Programm beendet, bzw. umgekehrt, also wenn kein USB-Stick drinne stecken sollte, irgendetwas anderes macht.
    Dazu muss ich sagen das ich noch neu bin was das Programmieren an geht und ich zwar weis wie das mit den Bedingungen funktioniert, jedoch nicht weis ob es möglich ist einen USB-Stick erkennen zu lassen bzw. dies auch in eine bedingung ein zu fügen.

    MfG.: Der Neuling 😃 😡



  • Na sicher geht das!

    Beim Programmstart alle möglichen Laufwerke (Buchstabe C: ... Z:) testen (GetVolumeInfo(...

    Ist Laufwerk gültig, dann testen welcher Typ (Wechselbar)

    Wenn gültig, Mit dem LW- Buchstaben eine bestimte Datei darauf ansprechen...

    Ferdsch.

    Gruss
    frank



  • DerAltenburger schrieb:

    Beim Programmstart alle möglichen Laufwerke (Buchstabe C: ... Z:) testen (GetVolumeInfo(...

    Und was, wenn ich den USB-Stick in ein NTFS-Verzeichnis gemountet habe, statt ihm einen Laufwerksbuchstaben zuzuordnen?



  • audacia schrieb:

    DerAltenburger schrieb:

    Beim Programmstart alle möglichen Laufwerke (Buchstabe C: ... Z:) testen (GetVolumeInfo(...

    Und was, wenn ich den USB-Stick in ein NTFS-Verzeichnis gemountet habe, statt ihm einen Laufwerksbuchstaben zuzuordnen?

    Dann lass mal gucken...



  • DerAltenburger schrieb:

    Dann lass mal gucken...

    Was willst du damit sagen?





  • ralros schrieb:

    Hier steht alles Notwendige drinnen:
    http://www.ftdichip.com/Support/Documents/AppNotes/AN_152_Detecting_USB_ Device_Insertion_and_Removal.pdf

    Nicht ganz. Da steht, wie man Events bekommt für neu hinzugefügte Geräte. Was ist, wenn der USB-Stick schon angeschlossen wurde, bevor das Programm gestartet wird?

    (Damit hier nicht der falsche Eindruck eines Ratespiels entsteht: ich weiß selber nicht, wie man die angeschlossenen USB-Sticks aufzählt und müßte es erst googlen. Aber ich weiß, daß die vorgeschlagenen Antworten nicht die richtigen sind.)



  • Meine Antwort ist aber zum Teil richtig, da man auch noch die Events abfangen muß, wenn das Programm läuft.
    vorher kommt man gut mit "GetLogicalDrives()" und "GetDriveType()" zurecht...sorry, ich bin hier im C++-Builder-Forum, aber ich denke auch dort kann man mit API-Funktionen gut arbeiten.
    "GetDriveType()" liefert aber nur DRIVE_REMOVABLE zurück, welches nicht direkt ein USB-Laufwerk zu Erkennen gibt.



  • Ach da schau her 😃
    Was lese ich da...

    Determines whether a disk drive is a removable, fixed, CD-ROM, RAM disk, or network drive.

    To determine whether a drive is a USB-type drive, call SetupDiGetDeviceRegistryProperty and specify the SPDRP_REMOVAL_POLICY property.

    https://msdn.microsoft.com/en-us/library/windows/desktop/aa364939(v=vs.85).aspx

    Also, dann ist alles super... 😃



  • ralros schrieb:

    Meine Antwort ist aber zum Teil richtig, da man auch noch die Events abfangen muß, wenn das Programm läuft.

    Nicht "muß", aber "sollte", ja.

    ralros schrieb:

    vorher kommt man gut mit "GetLogicalDrives()" und "GetDriveType()" zurecht

    Aber das liefert ja wieder nur Laufwerksbuchstaben. Wenn ich meinen USB-Stick stattdessen unter C:\Sticks\USB1 mounte, kann ich ihn nicht auswählen.

    ralros schrieb:

    Also, dann ist alles super... 😃

    Ich weiß nicht. Wenn man nur einen Laufwerksbuchstaben oder ein Mountverzeichnis hat, wie findet man dan das korrespondierende Device mit den SetupAPI-Funktionen? Kommt mir reichlich umständlich vor.

    Allerdings hat es mich nun selbst interessiert. Folgender Weg scheint mir der richtige zu sein:

    - FindFirstVolume(), FindNextVolume() und FindVolumeClose(), um alle Volumes aufzuzählen
    - GetVolumePathNamesForVolumeName(), um alle gemounteten Pfade eines Volumes aufzuzählen
    - DeviceIoControl() mit IOCTL_STORAGE_GET_HOTPLUG_INFO-Code aufrufen, um zu erfahren, ob es sich um ein entfernbares Laufwerk handelt

    Hier hat jemand sogar ein vollständiges Beispiel gepostet:
    http://stackoverflow.com/a/15662619



  • Jetzt muß ich gestehen, daß es sich dabei um eine Wissenslücke meinerseits handelte...
    ...auch weil mich das Thema interessiert, habe ich jetzt mal gegoogelt, wie das mounten von Laufwerken in Ordnern funktioniert...und ja, das war mir neu...
    aber das ist interessant.
    Wieder einiges dazugelernt 😃
    Ich glaube man kann schon irgendein nettes Tool programmieren, daß auf USB-Laufwerke reagiert.
    Aber das mounten von USB-Laufwerken in Ordnern ist auch recht cool... 👍


Log in to reply