Seite 1 von 2

[gelöst] USB-Stick eindeutig erkennen?

Verfasst: 11.11.2008 20:29
von scholly
moin, moin...

Folgendes Szenario:

- ich möchte Files von einem USB-Stick in eine Database aufnehmen.
- ich möchte "USB-Stick" ins Datenfeld "Medium-Typ" schreiben.

Wie erkenne ich, daß der Driveletter "L" zu einem bestimmten USB-Stick gehört?

Bisher ist es mir nicht gelungen, über GetVolumeInformation_(), Win32_DiskDrive, Win32_LogicalDisk und Win32_PnPEntity eine entsprechende Kette aufzubauen. :oops:

Hat zufälligerweise jemand eine Proc dafür bei sich rumliegen?

mDv...
scholly

Verfasst: 11.11.2008 22:17
von RSBasic
Du kannst höchstens ermitteln, ob ein Datenträger entfernbar ist:
GetDriveType: http://www.purebasic.fr/german/viewtopi ... 550#212550

Verfasst: 11.11.2008 23:11
von Little John
Es gab schon mal einen ähnlichen Thread. Vielleicht nützt er Dir was.

Gruß, Little John

Verfasst: 11.11.2008 23:15
von X360 Andy
:lol: 2mal die gleichen links :mrgreen:

Verfasst: 11.11.2008 23:24
von Little John
X360 Andy hat geschrieben::lol: 2mal die gleichen links :mrgreen:
Ich hatte den Link von RSBasic nicht mit meinem verglichen. Na ja, kannste dran sehen dass wir beiden den andern Thread hier für relevant halten. :D

Gruß, Little John

Verfasst: 12.11.2008 00:03
von scholly
Nicht ganz, aber bei dem Stichwort "RemovableDrives" hat meine linke hintere Gehirnzelle Alarm geschlagen und ich hab eventuell einen Weg über Win32_LogicalDisk gefunden.

Werde ich morgen mal mit USB-Stick, USB-HDD und USB-Card-Rerader (für SD und so) austesten.

:allright: für den schubs...

Verfasst: 12.11.2008 17:51
von Xaby
Kann dir gleich sagen, dass es bei Windows schwer sein wird.

Windows vergibt eher zufällig die Laufwerksbuchstaben.
Ich habe mehrere Wechselfestplatten. Es hängt davon ab, welche zuerst angeschaltet wird, welchen USB-Port sie benutzen und eventuell noch, welche virtuellen Laufwerke du gerade zusätzlich installiert hast.

Und wenn du zwei Baugleiche USB-Sticks hast, die zu unterscheiden wird auch nicht einfach.

Bei NO-Nameherstellern möchte ich sogar behaupten, dass die alle die
gleichen IDs intern haben.

Einfachsten ist es, wenn du eine Datei auf jedem Datenträger, den
du benutzen möchtest erstellst. Dann schauste dort einfach nach,
was drin steht :?

Die Memory-Stick-Software von Sony funktioniert auch so.

Da kannste einfach ne Memory-Stick-Datei auf irgendein anderes Laufwerk
kopieren und schon ist das auch ein Memory-Stick :mrgreen:

Verfasst: 12.11.2008 18:25
von sibru
versuch´s mal hiermit:

Code: Alles auswählen

;+-------------------------------------------------------------------------+
;|         PureBasic-QuellCode "USB_DriveList" mit allen ModulBody´s       |
;| erstellt durch Programm "PB_Mod2Body", Vers. 8A08a am 12.11.2008, 17:24 |
;+-------------------------------------------------------------------------+


;==========  Begin Modul "C:\ALSTERSOFT\PB4.20\MODULE\DRIVELIST.PBI"  ==========
;==========  Begin Modul "C:\ALSTERSOFT\PB4.20\MODULE\DRIVETYP.PBI"  ==========
Global DriveTyp
#DRIVE_REMOVABLE = 2
#DRIVE_FIXED = 3
#DRIVE_REMOTE = 4
#DRIVE_CDROM = 5
#DRIVE_RAMDISK = 6
Procedure.s DriveTyp(DriveKz$)
  DriveTyp = GetDriveType_(@DriveKz$)
  Select DriveTyp
    Case 0
      ProcedureReturn      "nicht vorhanden"
    Case 1
      ProcedureReturn      "Leer (kein HauptVerzeichniss)"
    Case #DRIVE_REMOVABLE
      ProcedureReturn      "Wechsel-Datenträger"
    Case #DRIVE_FIXED
      ProcedureReturn      "Festplatte"
    Case #DRIVE_REMOTE
      ProcedureReturn      "Netzwerk-Laufwerk"
    Case #DRIVE_CDROM
      ProcedureReturn      "CD-ROM"
    Case #DRIVE_RAMDISK
      ProcedureReturn      "RAM Disk"
    Default
      ProcedureReturn      "unbekannter Laufwerks-Typ"
  EndSelect
EndProcedure
;==========  Ende Modul "C:\ALSTERSOFT\PB4.20\MODULE\DRIVETYP.PBI"  ==========
Structure DriveEntryType
  Kenn$
  Media$
  Typ$
  Typ.l
EndStructure
Global NewList DriveListe.DriveEntryType()
Procedure DriveList()
  Protected Drives_Byte, i, Buffer$, Media$, Drive_KZ$, Drive_Type
  Protected TotalBytes.ULARGE_INTEGER, FreeBytes.ULARGE_INTEGER, UserBytes.ULARGE_INTEGER
  ClearList(DriveListe())
  Drives_Byte.l = GetLogicalDrives_()
  For i = 0 To 31
    If Drives_Byte & 1<<i
      AddElement(DriveListe())
      DriveListe()\Kenn$ = Chr(65 + i) + ":"
      Drive_KZ$ = Chr(65 + i) + ":\"
      Buffer$ = Space(255)
      Media$ = ""
      GetVolumeInformation_(Drive_KZ$, Media$, 255, 0, 0, 0, Buffer$, 255)
      DriveListe()\Typ$ = DriveTyp(Drive_KZ$)
      DriveListe()\Typ = GetDriveType_(@Drive_KZ$)
      If Trim(Media$) = "" : Media$ = "[leer]" : EndIf
      DriveListe()\Media$ = Media$
      GetDiskFreeSpaceEx_(DriveListe()\Kenn$, UserBytes, TotalBytes, FreeBytes)
      EndIf
    Next i
  ResetList(DriveListe())
EndProcedure
;==========  Ende Modul "C:\ALSTERSOFT\PB4.20\MODULE\DRIVELIST.PBI"  ==========
;==========  Begin Modul "C:\ALSTERSOFT\PB4.20\MODULE\DRIVESERIENNR.PBI"  ==========
Procedure.s DriveSerienNr(DriveKz$)
  Protected lpVolumeNameBuffer.s, lpVolumeSerialNumber.l
  DriveKz$ = left(drivekz$,1)+":\"
  lpVolumeNameBuffer.s = Space(#MAX_PATH +1)
  GetVolumeInformation_(@DriveKz$, @lpVolumeNameBuffer, #MAX_PATH +1, @lpVolumeSerialNumber, 0,0,0,0)
  ProcedureReturn Hex(PeekW(@lpVolumeSerialNumber + 2) & $FFFF) + "-" + Hex(PeekW(@lpVolumeSerialNumber) & $FFFF)
EndProcedure
;==========  Ende Modul "C:\ALSTERSOFT\PB4.20\MODULE\DRIVESERIENNR.PBI"  ==========




  DriveList()
  While NextElement(DriveListe())
    If DriveListe()\Typ = 2  ;Wechsel-Datenträger ?
      SNR$ = DriveSerienNr(DriveListe()\Kenn$)
      ;If SNR$<>"0-0"  ;USB-Stick ohne SerienNr ignorieren !!!
        Debug DriveListe()\Kenn$ + " " + DriveListe()\Typ$ + " " + Chr(34) + DriveListe()\Media$ + Chr(34) + " SN=" + SNR$
      EndIf
    ;EndIf
  Wend

Verfasst: 12.11.2008 18:29
von RSBasic
@sibru
Bei mir kommt eine merkwürdige Fehlermeldung:
Windows hat geschrieben: Exception Processing Message c0000013 Parameters 75b0bf7c 4 75b0bf7c 75b0bf7c

Verfasst: 12.11.2008 18:36
von sibru
Ähm... nur für Windows!!! (wg. API-Call´s...)

[edit]
seh´ grad, du hast ja WinXP... Also, bei uns läuft die Routine schon
einige Zeit bei diversen Kunden problemlos (User-Identifizierung via
USB-Stick). Evt. kannste noch die DriveSerienNr rausschmeißen
(kann mich da dunkel an Prob´s mit billigen noName-USB´s erinnern,
und die Prüfung hab´ ich geRemt...)

Gruss SiBru