VB schnell herausfinden ob Diskette eingelegt

Hallo Wissende,

nachfolgend sind einige Testmakros in Excel-Vba um herauszufinden und aufzulisten, welche Laufwerke vorhanden sind und welche davon auch benutzbar sind (Disk eingelegt, CD eingelegt)

Was mich daran sehr stört, wenn ich ein Diskettenlaufwerk auf eingelegte Diskette überprüfe, so dauert das locker mindestens 5 Sekunden, man siehts auch am LED des Diskettenlaufwerkes.

Am liebsten wäre mir sowas wie eine API wie GetLogicalDrives, die dann halt GetUseableDrives oder so heißen müßte und schnell ist.

Irgendwie habe ich im Hinterkopf, daß DOS bei Diskettenlaufwerke mehrmals versucht zu lesen, erst wenn das mehrmalige nicht klappt kommt die Meldung „Gerät nicht bereit“ oder so.

Ich suche halt etwas was nur einmal versucht zu lesen, wenn es nicht klappt sofort sagt, „keine Disk eingelegt“, ob das jetzt stimmt oder nur ein Lesefehler vorliegt, der beim nächsten Lesen nicht auftritt, das soll entfallen.

(Die Kommentare im Code haben nix zu bedeuten, sie beziehen sich auf Fehler bei unterschiedlichen Excelversionen aber ich suche ja hier eine VB-Lösung. D.h ich starte eine mit Vb erstellte Exe und sie liefert mir einen String zurück, ACDF, oder schreibt den in eine Textdatei.)

Danke ^ Gruß
Reinhard

Option Explicit
Private Declare Function GetLogicalDrives Lib "kernel32" () As Long
'
Sub Test2()
Cells.Clear
Call Lesen2("C:\") ' Festplattenpartition
Call Lesen2("F:\") ' ein USB-Stick, 2 GB, ich glaube FAT-formatiert
End Sub
'
Sub Lesen2(lwk As String)
' beschriebener Fehler 5 kommt bei XL97, XL2000 nicht, aber Code dort dort endlos bei C:\ !?
Dim F As Long
With Application.FileSearch
 MsgBox Dir("F:\Artikelbaum4391923.txt") 'klappt problemlos
 .NewSearch
 .LookIn = lwk
 'On Error GoTo Ende 'Fehler bei .FileName bei F:, Stick !??
 .FileType = msoFileTypeAllFiles
 'Laufzeitfehler 5, Unzulässger Prozeduraufruf oder ungültiges Argument bei F:\
 .FileName = "Artikelbaum\*.txt" ' .FileName = "\*.txt" bringt gleichen Fehler
 'On Error GoTo 0
 .SearchSubFolders = True
 ' Es wird nix sortiert !??
 If .Execute(SortBy:=msoSortByFileName, \_
 SortOrder:=msoSortOrderAscending) \> 0 Then
 For F = 1 To .FoundFiles.Count
 Cells(F + 1, 1) = .FoundFiles(F)
 Cells(F + 1, 2) = Mid(.FoundFiles(F), InStr(.FoundFiles(F), "Artikelbaum"))
 Next F
 End If
End With
Ende:
End Sub
'
Sub test3()
Dim h, N
h = GetLogicalDrives()
' listet alle vorhandenen lw auf, unabhängig ob Disk oder CD eingelegt.
For N = 65 To 90
 If h And 2 ^ (N - 65) Then MsgBox Chr(N)
Next N
End Sub
'
Sub test4()
Dim N, Fs As New FileSystemObject
For N = 65 To 90
 ' kommt Fehler, Gerät nicht verfügbar bei B
 If Fs.GetDrive(Chr(N)).IsReady Then MsgBox Chr(N)
Next N
End Sub
'
Sub test5()
'von Ransi
Dim Fs As New FileSystemObject, lwk
' Set-Variante nicht gut weil keine IntelliSense kommt, besser Dim-Variante
'Set Fs = CreateObject("Scripting.filesystemobject")
' langsam, weil Überprüfung von A so lange daurt.
'MsgBox Fs.GetFolder("A:\")
For Each lwk In Fs.drives
 If lwk "A:" Then ' deshalb 2 If-Schleifen wegen Schnelleigkeit, d.h. A wird nicht gerprüft
 If lwk.IsReady Then MsgBox lwk & "\"
 End If
Next lwk
End Sub
'
Sub test6()
If Dir("e:\/nul") "" Then MsgBox "huhu"
End Sub

hallo

ist der windows script host kein thema? mit dem geht es relativ einfach:

Dim fs

set fs = WScript.CreateObject("Scripting.FileSystemObject")

If fs.DriveExists("A:") Then
 msgbox "laufwerk a exisitiert"
End If

lg
erwin

Hallo erwin,

Reinhard wollte prüfen, ob eine Diskette im Laufwerk liegt, ohne lange auf das Ergebnis warten zu müssen. Ich habe bis jetzt keine Lösung gefunden. :frowning:

Gruß, Rainer

Dim fs

set fs = WScript.CreateObject(„Scripting.FileSystemObject“)

If fs.DriveExists(„A:“) Then
msgbox „laufwerk a exisitiert“
End If

Hallo Erwin,
leider kriege ich auch da nur geliefert ob das Lw existiert, aber nicht ob eine Diskette eingelegt ist.

Und bei allen mir bekannten Versuchen herauszufinden ob eine Diskette eingelegt ist, dauert das mehr als 5 Sekunden.

Jetzt gab es aber früher bei Dos ein Programmpaket PcShell bzw. Pctools. Damit konnte man u.v.a. z.B. Backups via Diskette machen.
Es war in einem Punkt sehr gewöhnungsbedürftig, das Licht des Diskettenlaufwerkes brannte permanent, was mich irritierte weil ich es gewohnt war, wenn das Licht des Diskettenlaufwerkes brannte, NICHT auf den Auswurfknopf zu drücken.

Nun, während dieses Backups kam dann z.B. die Meldung, „legen Sie jetzt Diskette 3/27 ein“. Tat man dieses, also entfernte 2/27 und legte eine andere Diskette ein, so registrierte das PCshell/Pctools sofort, also ohne 5 Sekunden Wartezeit.

Sowas suche ich. Ob die Diskette beschreib/lesbar ist spielt in dem Moment keine Rolle, das wird später geprüft.

Gruß
Reinhard

Grüezi reinhard

Hallo Wissende,

…was Du wieder alles denkst… :wink:

Was mich daran sehr stört, wenn ich ein Diskettenlaufwerk auf
eingelegte Diskette überprüfe, so dauert das locker
mindestens5 Sekunden, man siehts auch am LED des
Diskettenlaufwerkes.

Am liebsten wäre mir sowas wie eine API wie GetLogicalDrives,
die dann halt GetUseableDrives oder so heißen müßte und
schnell ist.

Vielleicht hilft dir dolgendes weiter, ist zwar aus Delphi, aber das könnte man ev. anpassen:

http://delphi.about.com/od/beginners/a/floppy.htm


Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Gruezi Thomas,

Hallo Wissende,

…was Du wieder alles denkst… :wink:

ist doch nicht falsch gedacht wenn ich bei einigen hier, bei dir, bei anderen andernorts so mitlese.

Vielleicht hilft dir dolgendes weiter, ist zwar aus Delphi,
aber das könnte man ev. anpassen:

http://delphi.about.com/od/beginners/a/floppy.htm

*hmmh* so auf den ersten Blick ist mir noch unklar wie ich das zu Vba umschreiben kann, okay, werde ich nachher ausprobieren das umzubacken.

Ist zwar an sich ohne Deklarationen nur ein 2-Zeiler *glaub* aber irgendwie ist mir Delphi sehr fremd, dann gemischt mit mir suspektem API… :frowning:

Danke erstmal

Gruß
Reinhard

Hallo Thomas und Interessierte,
ich habe im Delphibrett eine Anfrage gestellt, mit der Bitte hier zu antworten. Einfach um herauszufinden ob diese Delphiroutine „schnell“ ist.
Wennn dem so ist, freue ich mich dass du mir das für Excel-Vba umschreibst :smile: bastle ich mir das selbst für Excel Vba um:frowning:

-))

Gruß
Reinhard

Grüezi Reinhard

Hallo Thomas und Interessierte,
ich habe im Delphibrett eine Anfrage gestellt, mit der Bitte
hier zu antworten. Einfach um herauszufinden ob diese
Delphiroutine „schnell“ ist.
Wennn dem so ist, freue ich mich dass du mir das für
Excel-Vba umschreibst :smile:

Hmmm, warum wundert es mich nicht, dass es darauf hinaus läuft…? :wink:

Schau mal ob dies hier tut - bei mir dauert es jedenfalls keine 5 Sekunden; vielleicht reicht dir das schon?

Private Declare Function GetDiskFreeSpaceEx Lib "kernel32" \_
 Alias "GetDiskFreeSpaceExA" \_
 (ByVal lpRootPathName As String, \_
 lpFreeBytesAvailableToCaller As Currency, \_
 lpTotalNumberOfBytes As Currency, \_
 lpTotalNumberOfFreeBytes As Currency) As Long

Sub TestDriveA()
 If GetDiskFreeSpaceEx("A:/", 0, 0, 0) = 0 Then
 MsgBox "Keine Diskette in LW A:/"
 Else
 MsgBox "Diskette in LW A:/ vorhanden"
 End If
End Sub

Hallo Thomas,

Hmmm, warum wundert es mich nicht, dass es darauf hinaus
läuft…? :wink:

Ist normal, gib mir den kleinen Finger, ich lechze nach der ganzen Hand:smile:

Schau mal ob dies hier tut - bei mir dauert es jedenfalls
keine 5 Sekunden; vielleicht reicht dir das schon?

"keine 5 Sekunden ist mir viel zu langsam *gg*

Private Declare Function GetDiskFreeSpaceEx Lib
„kernel32“ _
Alias
„GetDiskFreeSpaceExA“ _
(ByVal
lpRootPathName As String, _

lpFreeBytesAvailableToCaller As Currency, _

lpTotalNumberOfBytes As Currency, _

lpTotalNumberOfFreeBytes As Currency) As Long

Sub TestDriveA()
If GetDiskFreeSpaceEx(„A:/“, 0, 0, 0) = 0 Then
MsgBox „Keine Diskette in LW A:/“
Else
MsgBox „Diskette in LW A:/ vorhanden“
End If
End Sub

Übrigens gehört meine Anfrage dazu:

http://www.wer-weiss-was.de/cgi-bin/www/service.fpl?..

Mir doch wurscht was Jessica will. Ich bastle mir das mit vielen Features, Ausdrucken von Artikelbäumen usw.

Und als Start stellte ich mir eine UF vor, wo alle zugänglichen Laufwerke in Checkboxen auswählbar sind um sie nach Artikelbaum*.txt zu durchsuchen.

Ich habe das auch schon soweit dass in der UF alle verfügbaren Laufwerke angezeigt werden, man kann dann auswählen welche nach Dateien die Artikelbaum*.txt heißen, durchsucht werden.
Klappt auch alles *freu*

Naja, dann stellte ich halt das lange Dauern bei der Überprüfung von A: fest.

Was fehlt ist, beim Start der Uf sollen nur verfügbare (also keine Disk eingelegt=nicht) angezeigt werden.

Oder wenn man man auf der UF z.B. „A:“ ankreuzt, soll kurz und schnell gleich kommen, „keine Disk“ eingelegt" oder das Ankreuzen ist okay.

Ob dann auf der Diskette was lesbar ist, wird später abgeprüft.

Ich will nur fix wissen ob eine Diskette eingelegt ist.
Und 5 oder mehr Sekunden sind mir da zu lange :frowning:
Ja, ich weiß daß viele PCs kein Diskettenlaufwerk mehr haben, na und, bin da konservativ *gg*

Ich hoffe ich konnte mich verständlich machen, warum/wieso ich das brauche.

Lieben Gruß
Reinhard

Grüezi Reinhard

Hmmm, warum wundert es mich nicht, dass es darauf hinaus
läuft…? :wink:

Ist normal, gib mir den kleinen Finger, ich lechze nach der
ganzen Hand:smile:

…ja, genauso habe ich mir das vorgestellt :wink:

Schau mal ob dies hier tut - bei mir dauert es jedenfalls
keine 5 Sekunden; vielleicht reicht dir das schon?

"keine 5 Sekunden ist mir viel zu langsam *gg*

Das hat also nichts gebracht?
Schade…es war meine erste API, die ich selbst eingebunden habe :wink:

Übrigens gehört meine Anfrage dazu:

http://www.wer-weiss-was.de/cgi-bin/www/service.fpl?..

Dieser Link funktioniert hier nicht direkt - ich werde stets gebeten, mich doch auf der Startseite neu einzuloggen, auch wenn ich das unmittelbar vorher gemacht habe… :frowning:

Mir doch wurscht was Jessica will. Ich bastle mir das mit
vielen Features, Ausdrucken von Artikelbäumen usw.

…aber eine Suche nach ‚Artikelbaum‘ hat mich dann dennoch zum entsprechenden Thread geführt.

[Prijekt-Übersicht gesnippt]

Ich will nur fix wissen ob eine Diskette eingelegt ist.
Und 5 oder mehr Sekunden sind mir da zu lange :frowning:

Wie gesagt, dauert das Auslesen des ‚FreeSpace‘ hier wesentlich weniger lang.

Ja, ich weiß daß viele PCs kein Diskettenlaufwerk mehr haben,
na und, bin da konservativ *gg*

Willkommen im Club - das würde ich wohl genauso handhaben.

Ich hoffe ich konnte mich verständlich machen, warum/wieso
ich das brauche.

Doch, einigermassen verstehe ich dich :wink:


Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Hallo Thomas,

Schade…es war meine erste API, die ich selbst eingebunden
habe :wink:

Sie funktioniet ja auch bestens …*tröst*
…nur halt zu langsam, muß doch mal meinen 286er Rechner tunen lassen :smile:))

http://www.wer-weiss-was.de/cgi-bin/www/service.fpl?..

Dieser Link funktioniert hier nicht direkt - ich werde stets
gebeten, mich doch auf der Startseite neu einzuloggen, auch
wenn ich das unmittelbar vorher gemacht habe… :frowning:

Ja, geht mir genauso, k.A. warum. Ist mir noch nie vorkommen und ich habe schon mehr als 100mal Links innerhalb von w-w-w erstellt.

Ich will nur fix wissen ob eine Diskette eingelegt ist.
Und 5 oder mehr Sekunden sind mir da zu lange :frowning:

Wie gesagt, dauert das Auslesen des ‚FreeSpace‘ hier
wesentlich weniger lang.

Liegt wohl an der PC Hardware *vermut*

Andrerseits auch nicht, so einem Diskettenlaufwerk ist es doch egal in welchen Rechner es eingebaut wird, wenn dann vom PC der Befehl kommt schau mal auf die Diskette und melde zurück ob und was du lesen kannst, müßte das doch je Diskettenlaufwerksmodell immer gleich sein wielange das dauert, m.E. dann auch nur noch davon ob eine Diskette eingelegt ist oder nicht, aber nicht davon wie schnell der Recher getaktet ist usw. *grübel*

Ich sehe schon, „Diskette eingelegt? Frage des schnellen Daseins oder nicht Daseins“ wird nochma meine Doktorarbeit :smile:)

Gruß
Reinhard

Grüezi Reinhard

Schade…es war meine erste API, die ich selbst eingebunden
habe :wink:

Sie funktioniet ja auch bestens …*tröst*

Na, wenigstens etwas :smile:

…nur halt zu langsam, muß doch mal meinen 286er Rechner
tunen lassen :smile:))

Ach soooooo - Steinzeit trifft Hyperdrive oder so :wink:

Ich will nur fix wissen ob eine Diskette eingelegt ist.
Und 5 oder mehr Sekunden sind mir da zu lange :frowning:

Wie gesagt, dauert das Auslesen des ‚FreeSpace‘ hier
wesentlich weniger lang.

Liegt wohl an der PC Hardware *vermut*

Ja, vermutlich schon, hier steht nicht gerade ein 286-er, aber auch nicht das allerneuste Modell.

Andrerseits auch nicht, so einem Diskettenlaufwerk ist es doch
egal in welchen Rechner es eingebaut wird, wenn dann vom PC
der Befehl kommt schau mal auf die Diskette und melde zurück
ob und was du lesen kannst, müßte das doch je
Diskettenlaufwerksmodell immer gleich sein wielange das
dauert, m.E. dann auch nur noch davon ob eine Diskette
eingelegt ist oder nicht, aber nicht davon wie schnell der
Recher getaktet ist usw. *grübel*

Nunja, wenn der interne Bus langsamger getaktet ist und die Übertragung/Verarbeitung deswegen langsamer läuft, dann macht sich das halt schon bemerkbar.
Und gerade auf diesem Gebiet ist seit der 286-er Generation halt schon das eine oder andere verbessert worden.

Ich sehe schon, „Diskette eingelegt? Frage des schnellen
Daseins oder nicht Daseins“ wird nochma meine Doktorarbeit

-))

Ok, sagst Du wann es soweit ist, ich nenne dich dann:

„Dr. Disk“


Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Hallo Reinhard,

nun hatte ich mal langeweile :s
Bei welcher Zeit liegt denn bisher der Rekord?

Ich hab mal nen simplen Weg probiert und komme, je nachdem ob eine Disc eingelegt ist, ob Daten drauf sind oder nicht auf zeiten zwischen 980 bis 1200 ms. Waere das akzeptabel?

Wie immer der Code in VB, musst nur umschreiben :wink:

'Klasse Xtimer 'Nur zur Zeitmessung
Option Explicit

Private Type LARGE\_INTEGER
 Lo As Long
 Hi As Long
End Type

Private Declare Function QueryPerformanceCounter Lib "kernel32" ( \_
 lpPerformanceCount As LARGE\_INTEGER) As Long

Private Declare Function QueryPerformanceFrequency Lib "kernel32" ( \_
 lpFrequency As LARGE\_INTEGER) As Long

Dim dblCalibrieren As Double

Dim udtStart As LARGE\_INTEGER
Dim udtEnde As LARGE\_INTEGER
Dim udtFreq As LARGE\_INTEGER

Public Sub Calibrieren()
 Call QueryPerformanceCounter(udtStart)
 Call QueryPerformanceCounter(udtEnde)
 dblCalibrieren = (D(udtEnde) - D(udtStart)) / D(udtFreq) \* 1000
End Sub

Private Sub Class\_Initialize()
 Call QueryPerformanceFrequency(udtFreq)
End Sub

Public Sub Halt()
 Call QueryPerformanceCounter(udtEnde)
End Sub

Public Sub Start()
 Call QueryPerformanceCounter(udtStart)
End Sub

Public Property Get RunTime() As Double
 RunTime = (D(udtEnde) - D(udtStart)) / D(udtFreq) \* 1000 - \_
 dblCalibrieren
End Property

Private Function D(udtX As LARGE\_INTEGER) As Double
 Dim dblHigh As Double
 Dim dblLow As Double
 dblLow = udtX.Lo
 dblHigh = udtX.Hi
 If dblLow 

MfG Alex

Hallo Reinhard,

nun habe ich es nochmal mit der API GetDiskFreeSpaceEx probiert und komme dort auf die selbigen Ergebnisse :s

Adhock faellt mir noch ein anstatt Dir, die API FindFirst zu nehmen oder ein File auf die Disc zu schreiben. Aber was ist wenn die Disc voll ist? Also würde die Variante scheitern :s
Eine weitere Möglichkeit wäre den MBR der Disch auszulesen! Wie das geht hatte Rainer ja mal gepostet. Ist aber schon lange her.

Ansonsten faellt mir auf die schnelle nichts weiter ein S:

MfG Alex

Völlig OT

…nur halt zu langsam, muß doch mal meinen 286er Rechner
tunen lassen :smile:))

Ach soooooo - Steinzeit trifft Hyperdrive oder so :wink:

Hallo Thomas,
ja, neuere Geräte sind schon schneller.

Als mich die Excel-Logik mal wieder kurzfristig in den Wahnsinn trieb, habe ich meinen 386er Rechner und meinen 486er Rechner aus dem Fenster geschmissen.
Und es stimmt wirklich, der 486er war bedeutent schneller…

*kicher*

Gruß
Reinhard