erster freier laufwerksbuchstabe unter windows

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
BigBo
User
Beiträge: 18
Registriert: Mittwoch 5. September 2007, 13:16
Wohnort: Friedrichshafen
Kontaktdaten:

hallo zusammen,

ich wette ich bin bei weitem nicht der erste der vor diesem problem steht und micht wundert grad echt derb warum man wirklich NIRGENDS was dazu findet.

aber zu meinem problem:
ich verwende windows und will dynamisch zur laufzeit ein neues laufwerk mounten, dazu sollte ich aber wissen welche laufwerksbuchstaben überhaupt noch frei sind...wer kann mir da ne hilfe geben ???

mfg
BigBo
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

BigBo hat geschrieben:dazu sollte ich aber wissen welche laufwerksbuchstaben überhaupt noch frei sind
Hallo BigBo!

Vielelicht ist hier etwas für dich darunter:
- http://timgolden.me.uk/python/wmi_cookbook.html
- http://www.microsoft.com/technet/script ... x?mfr=true
- http://www.microsoft.com/technet/script ... x?mfr=true

EDIT 1:

Ja, es ist etwas dabei: :-)

Code: Alles auswählen

import win32com.client
strComputer = "."
objWMIService = win32com.client.Dispatch("WbemScripting.SWbemLocator")
objSWbemServices = objWMIService.ConnectServer(strComputer,"root\cimv2")
colItems = objSWbemServices.ExecQuery("Select * from Win32_LogicalDisk")
for objItem in colItems:
    #print "Caption: ", objItem.Caption
    #print "Description: ", objItem.Description
    #print "Device ID: ", objItem.DeviceID
    print "Name: ", objItem.Name
Mit so einem ähnlichen Code, musst du noch die Netzlaufwerke herausfinden.

Vielleicht gibt es sogar einen eigenen Befehl um die freien Laufwerksbuchstaben heraus zu finden, aber den kenne ich nicht.

EDIT 2:

Wer sagt's denn: ;-)

Code: Alles auswählen

>>> import win32api
>>> win32api.GetLogicalDriveStrings()
'A:\\\x00C:\\\x00H:\\\x00J:\\\x00P:\\\x00T:\\\x00U:\\\x00W:\\\x00'
>>> print win32api.GetLogicalDriveStrings()
A:\
>>> print win32api.GetLogicalDriveStrings().split(chr(0))
['A:\\', 'C:\\', 'H:\\', 'J:\\', 'P:\\', 'T:\\', 'U:\\', 'W:\\', '']
>>> print [ item for item in win32api.GetLogicalDriveStrings().split(chr(0)) if item ]
['A:\\', 'C:\\', 'H:\\', 'J:\\', 'P:\\', 'T:\\', 'U:\\', 'W:\\']
>>> print win32api.GetLogicalDriveStrings().rstrip(chr(0)).split(chr(0))
['A:\\', 'C:\\', 'H:\\', 'J:\\', 'P:\\', 'T:\\', 'U:\\', 'W:\\']
>>> import string
>>> string.ascii_uppercase[2:]
'CDEFGHIJKLMNOPQRSTUVWXYZ'
>>> set(string.ascii_uppercase[2:]).difference(set(item[0] for item in win32api.GetLogicalDriveStrings().rstrip(chr(0)).split(chr(0))))
set(['E', 'D', 'G', 'F', 'I', 'K', 'M', 'L', 'O', 'N', 'Q', 'S', 'R', 'V', 'Y', 'X', 'Z'])
>>>
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BigBo
User
Beiträge: 18
Registriert: Mittwoch 5. September 2007, 13:16
Wohnort: Friedrichshafen
Kontaktdaten:

gerold hat geschrieben:Vielleicht gibt es sogar einen eigenen Befehl um die freien Laufwerksbuchstaben heraus zu finden, aber den kenne ich nicht.
ja mit win32api.getLogicalDriveStrings() bekomm ich die schon belegten laufwerke...aber wie iteriere ich am blödsten in ner schleife zum ersten freien möglichst OHNE manuell ne liste mit allen buchstaben von a-z anzulegen? ich denk sowas zu machen wäre unschöner code ;-)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

BigBo hat geschrieben:mit allen buchstaben von a-z anzulegen? ich denk sowas zu machen wäre unschöner code ;-)
...finde ich nicht. ;-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BigBo
User
Beiträge: 18
Registriert: Mittwoch 5. September 2007, 13:16
Wohnort: Friedrichshafen
Kontaktdaten:

also ich habs nun so gelöst:

Code: Alles auswählen

        for letter in 'DEFGHIJKLMNOPQRSTUVWXYZ':
            if letter in (win32api.GetLogicalDriveStrings().rstrip(chr(0)).split(chr(0))):
                continue
            else:
                freeDrive = letter
                break
wenn jemand was besseres weiss bitte melden, ich find die lösung ziemlich hässlich aber mir fällt keine andere ein

und gerold ich bin dir mal wieder zu vielem dank verpflichtet...du hast mich auf gute ideen gebracht wie ich mein problem lösen könnte :-)
BlackJack

Ich weiss nicht was `win32api.GetLogicalDriveStrings()` macht, aber muss man das wirklich für jeden Buchstaben aufrufen!?
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Hab ich schonmal erwähnt, dass ich Laufwerksbuchstaben für eine strohdumme Idee halte?
TUFKAB – the user formerly known as blackbird
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

blackbird hat geschrieben:Hab ich schonmal erwähnt, dass ich Laufwerksbuchstaben für eine strohdumme Idee halte?
Wo zum Teufel ist B? Und warum heißt meine Platte heute E nachdem sie gestern noch D war? ;)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
lunar

Das traurige ist ja, dass der NT Kernel eigentlich gar keine Laufwerksbuchstaben mehr braucht. Intern werden Laufwerke wie bei udev über IDs angesprochen. Im Kernel sind die Laufwerksbuchstaben nur noch Mountpoints, die mit dem Laufwerk nichts mehr zu tun haben.

Bei Windows XP (afaik auch schon bei 2000) kann man ja NTFS Partitionen in beliebige Verzeichnisse einhängen (genau wie bei "mount"). Ebenso kann man Laufwerksbuchstaben frei zuweisen. Es würde auch ohne gehen...

... nur hängt die behämmerte Shell an den Laufwerksbuchstaben, und MS mag das scheints nicht ändern, ein normaler Windows-User ist ja so gutes Design gar nicht gewöhnt... :roll:
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

lunar hat geschrieben:Im Kernel sind die Laufwerksbuchstaben nur noch Mountpoints, die mit dem Laufwerk nichts mehr zu tun haben.
Jup. Deswegen kann man auch leicht in der REG bei HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices die Laufwerkbuchstaben wieder anders zuordnen, wenn Windows sich über den normalen Weg sträubt.

Mit dieser kleinen Batch-Datei kommt man direkt in regedit an die richtige stelle:

Code: Alles auswählen

set Key=HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit
set LastKey=HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices

reg add %Key% /f /v "LastKey" /d %LastKey%

start regedit.exe
Zum ursprünglichen Problem: Man könnte doch einfach durchprobieren mit os.path.exists, wann ein Buchstabe frei ist.
EDIT: Wobei ich nicht weiß, was bei CD-/DVD-Laufwerken passiert, wenn keine CD/DVD eingelegt ist. Also vielleicht keine gute Idee ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten