Alle Laufwerke ermitteln — OHNE API!

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Alle Laufwerke ermitteln — OHNE API!

Beitrag von AND51 »

Hallo!

al90 brachte mich auf die Idee, folgenden Code hier zu posten, damit alle was davon haben:

Code: Alles auswählen

For n=65 To 90 
   Debug FileSize(Chr(n)+":\") 
Next
Ihr wisst ja, dass FileSize() den Wert -2 zurückgibt, denn der übergebene Pfad in Wirklichkeit ein Ordner ist. Handelt es sich um eine Datei wird seine Größe in Bytes zurückgegeben.

Hier wird das einfach nur ausgenutzt, um Festzustellen, ob der Pfad ein Ordner (=Laufwerk) ist, oder nicht exisitiert.

Wichtiger Hinweis: TS-Soft meint, man sollte Diskettenlaufwerke nicht testen, das könne gefährlich werden. Meine Meinung: Wer braucht schon Diskettenlaufwerke? Wer sie nicht braucht, testet von 67-90, nicht wie im Code von 65-90. Außerdem kann mit dieser Methode nicht verhindert werden, dass die Meldung "Bitte legen Sie einen Datenträger in Laufwerk X ein", erscheint. Sollte diese Meldung erscheinen, ist es mit FileSize() nicht mögoch, diese Meldung zu unterdrücken.
Glücklicherweise ist bei mir (XP, SP2) diese Meldung noch nie erschienen, bei dieser Methode.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

@AND51
Ist schon sehr gut, aber da fehlen die Buchstaben. :D
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Alves
Beiträge: 1208
Registriert: 19.04.2006 18:24
Kontaktdaten:

Beitrag von Alves »

DAnn eben so:

Code: Alles auswählen

For n=65 To 90
   Debug chr(n) +"0" +  FileSize(Chr(n)+":\")
Next
mknjc
Beiträge: 217
Registriert: 09.09.2006 12:59

Beitrag von mknjc »

Das is ma was.
Auf einache Ideen kommt man also doch einfach.
Naja bin jetz aber zu faul meine Win Maschiene zu starten um zu gucken obs klappt müsste aber.

Mfg mknjc
Ich nutze PureBasic 4.02 unter Linux und Windows.

Momentane Projekte:
Das geheimste aller geheimen Projekte... FPBC
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Das ganze funktioniert sowieso nur unter Windows, warum also keine API?

Code: Alles auswählen

For i = 0 To 25
  Debug "Drive: " + Chr(i + 65)+ ": " + Str(DriveType_(i))
Next
Laufwerksbuchstaben gibts weder auf nem Mac noch unter Linux :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag von nco2k »

jep, seh ich genauso, aber man sollte GetDriveType_() anstelle von DriveType_() verwenden, da DriveType_() nicht kompatibel zu win9x systemen ist.

Code: Alles auswählen

For i = 0 To 25
  Debug "Drive: " + Chr(i + 65)+ ": " + Str(GetDriveType_(Chr(i + 65)+":\"))
Next
DriveType:
http://windowssdk.msdn.microsoft.com/en ... 47252.aspx

GetDriveType:
http://msdn.microsoft.com/library/defau ... vetype.asp

c ya,
nco2k
~|__/
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

nco2k hat geschrieben:jep, seh ich genauso, aber man sollte GetDriveType_() anstelle von DriveType_() verwenden, da DriveType_() nicht kompatibel zu win9x systemen ist.
:oops: , das kommt davon, wenn man in der MSDN nicht zuende liest.
Verspreche Besserung :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Danke für eure Kommentare!

In erster Linie wollte ich die Idee einfach mal posten, wozu mir al90 geraten hat. Außerdem ist diese lösung die einfachste Lösung für PureBasic-Anfänger, die ja noch keine API beherrschen oder noch nie davon gehört haben. :D
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Ligatur
Beiträge: 196
Registriert: 09.07.2006 00:41

Re: Alle Laufwerke ermitteln &#8212; OHNE API!

Beitrag von Ligatur »

AND51 hat geschrieben:Hallo!

al90 brachte mich auf die Idee, folgenden Code hier zu posten, damit alle was davon haben:

Code: Alles auswählen

For n=65 To 90 
   Debug FileSize(Chr(n)+":") 
Next
Ihr wisst ja, dass FileSize() den Wert -2 zurückgibt, denn der übergebene Pfad in Wirklichkeit ein Ordner ist. Handelt es sich um eine Datei wird seine Größe in Bytes zurückgegeben.

Hier wird das einfach nur ausgenutzt, um Festzustellen, ob der Pfad ein Ordner (=Laufwerk) ist, oder nicht exisitiert.

Wichtiger Hinweis: TS-Soft meint, man sollte Diskettenlaufwerke nicht testen, das könne gefährlich werden. Meine Meinung: Wer braucht schon Diskettenlaufwerke? Wer sie nicht braucht, testet von 67-90, nicht wie im Code von 65-90. Außerdem kann mit dieser Methode nicht verhindert werden, dass die Meldung "Bitte legen Sie einen Datenträger in Laufwerk X ein", erscheint. Sollte diese Meldung erscheinen, ist es mit FileSize() nicht mögoch, diese Meldung zu unterdrücken.
Glücklicherweise ist bei mir (XP, SP2) diese Meldung noch nie erschienen, bei dieser Methode.
Ebenso einfach geht das über Droopys Lib (http://www.purearea.net/pb/german/index.htm):

Code: Alles auswählen

MountListInit()
Repeat
	mt.s = MountList()
	If mt <> ""
		vn.s = GetMountVolName(mt)
		dt = RealDriveType(vn)
		Select dt
			Case #DRIVE_CDROM
				ty.s = "CD Rom"
			Case #DRIVE_FIXED
				ty = "Festplatte / Fest eingebautes Laufwerk"
			Case #DRIVE_NO_ROOT_DIR
				ty = "Kein Stammverzeichnis"
			Case #DRIVE_RAMDISK
				ty = "Ramdisk"
			Case #DRIVE_REMOTE
				ty = "Netzwerklaufwerk"
			Case #DRIVE_REMOVABLE
				ty = "Floppy / Wechseldatenträger"
			Case #DRIVE_UNKNOWN
				ty = "Unbekanntes Laufwerk"
			Default
				ty = "Typ nicht ermittelbar"
		EndSelect
		MessageRequester("Laufwerk", mt + #CRLF$ + vn + #CRLF$ + ty)
	EndIf
Until mt = "" 
Damit kann man dann auch gefahrlos Diskettenlaufwerke ermitteln.

Gruß,
Ligatur
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

So wie's aussieht, benutzt Droopy (bzw. einer der Autoren) in der Procedure einfach nur einen API-Aufruf. Ich kenne mich aber sleber schon gut mit API aus, sodass ich direkt darauf zugreifen kann und die Laufwerke auch ohne Hilfe durchzähle.

Droopy's Lib werde ich nicht mehr benutzen... :twisted: 5 Codestücke habe ich dem Typen im April und im Juni zugesand und welche hat er in die Lib übernommen? Keine. Stattdessen sieht die Lib aus, als wäre sie notdürftig nach PB 4 transferiert worden, sogar die Schreibfehler in der Hilfe sind noch die selben... :freak:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten