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.
BigBo
User
Beiträge: 18
Registriert: Mittwoch 5. September 2007, 13:16
Wohnort: Friedrichshafen
Kontaktdaten:

erster freier laufwerksbuchstabe unter windows

Beitragvon BigBo » Mittwoch 12. September 2007, 12:29

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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: erster freier laufwerksbuchstabe unter windows

Beitragvon gerold » Mittwoch 12. September 2007, 12:35

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:

Beitragvon BigBo » Mittwoch 12. September 2007, 12:57

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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Mittwoch 12. September 2007, 13:16

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:

Beitragvon BigBo » Mittwoch 12. September 2007, 13:19

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

Beitragvon BlackJack » Mittwoch 12. September 2007, 19:10

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

Beitragvon mitsuhiko » Mittwoch 12. September 2007, 20:38

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

Beitragvon Leonidas » Mittwoch 12. September 2007, 21:31

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 Modvoice
lunar

Beitragvon lunar » Mittwoch 12. September 2007, 21:52

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
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Donnerstag 13. September 2007, 07:39

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=]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[/code]

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 ;)

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd

Wer ist online?

Mitglieder in diesem Forum: de_tom