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.
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

2mal die gleichen links

Verfasst: 11.11.2008 23:24
von Little John
X360 Andy hat geschrieben:
2mal die gleichen links

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.
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.

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

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