[gelöst] USB-Stick eindeutig erkennen?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

[gelöst] USB-Stick eindeutig erkennen?

Beitrag 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
Zuletzt geändert von scholly am 20.11.2008 13:08, insgesamt 1-mal geändert.
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

Du kannst höchstens ermitteln, ob ein Datenträger entfernbar ist:
GetDriveType: http://www.purebasic.fr/german/viewtopi ... 550#212550
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Little John

Beitrag von Little John »

Es gab schon mal einen ähnlichen Thread. Vielleicht nützt er Dir was.

Gruß, Little John
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Beitrag von X360 Andy »

:lol: 2mal die gleichen links :mrgreen:
Little John

Beitrag 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
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag 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...
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag 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:
Kinder an die Macht http://scratch.mit.edu/
sibru
Beiträge: 265
Registriert: 15.09.2004 18:11
Wohnort: hamburg

Beitrag 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
Bild Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

@sibru
Bei mir kommt eine merkwürdige Fehlermeldung:
Windows hat geschrieben: Exception Processing Message c0000013 Parameters 75b0bf7c 4 75b0bf7c 75b0bf7c
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
sibru
Beiträge: 265
Registriert: 15.09.2004 18:11
Wohnort: hamburg

Beitrag 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
Bild Bild
Antworten