- Offizieller Beitrag
Hi,
hiermit lassen sich Ordner-Pfade zu Virtuellen Laufwerken verknüpfen. Die so erstellten Laufwerke werden nicht in der Registry verewigt und sind nur für die Dauer der Sitzung gültig. Nach einem Neustart ist wieder alles 'normal'.
Edit 27.12.08:
Hab das noch etwas erweitert:
- Standardmäßig wird jetzt der erste freie Laufwerksbuchstabe verwendet
- der Verknüpfungspfad ist jetzt vorbelegt mit '@MyDocumentsDir' ( aber nur, weil ich die Parameterreihenfolge nicht ändern wollte )
- bei Erfolg wird der Buchstabe des erstellten od. gelöschten Laufwerks zurückgegeben.
Edit 28.12.08:
Die Prüfung auf Existenz der Lw mit FileExists() funktioniert nicht bei leeren CD/DVD-Lw. Dadurch konnte bei Verknüpfung ohne Lw-Angabe dem CD-Lw der Buchstabe 'geklaut' werden :D. Habe den Abfragemodus geändert und auch die empfohlenen Änderungen von progandy und Oscar eingebunden - Dank an Euch.
Edit 28.12.08 #2
Dank eurer Hinweise wird die Funktion immer professioneller
Habe jetzt eingefügt, dass zum Löschen nicht mehr der Pfad angegeben werden muss. Den sucht sich die Funktion jetzt selbst raus.
Zum Löschen reicht nun: _PartialDrive([Lw:], -1, 1)
Edit 29.12.08
Für all jene, die nicht nur vergessen haben, mit welchem Pfad verknüpft wurde, sondern auch welches Lw ertsellt wurde, habe ich noch eine Zusatzfunktion erstellt, die (sofern vorhanden) alle partiellen Laufwerke mit Lw-Buchstaben und verknüpftem Pfad als 2D-Array [Lw][Pfad] ausgibt.
Das ließe sich natürlich auch noch mit in die erste Funktion integrieren (z.B. mit Lw-Parameter '0' als erste Abfrage in der Func).
_PartialDrive()
; 'c:\test' als Laufwerk 'Q:'erstellen
If _PartialDrive('Q:', 'c:\test') Then
MsgBox(0, '', 'Partielles Laufwerk erstellt.')
Else
MsgBox(0, '', 'Erstellung Partielles Laufwerk fehlgeschlagen.')
EndIf
; Laufwerk 'Q:' wieder löschen
If _PartialDrive('Q:', -1, 1) Then
MsgBox(0, '', 'Partielles Laufwerk gelöscht.')
Else
MsgBox(0, '', 'Löschen Partielles Laufwerk fehlgeschlagen.')
EndIf
; Verknüpfung mit 'Eigene Dateien' auf erstes freies Laufwerk
Local $newDrive = _PartialDrive()
If Not @error Then
MsgBox(0, '', 'Neues Laufwerk: ' & $newDrive)
Else
MsgBox(0, '', 'Fehler')
EndIf
; Verknüpfung mit 'Eigene Dateien' wieder löschen
_PartialDrive($newDrive, -1, 1)
If Not @error Then
MsgBox(0, '', 'Laufwerk gelöscht: ' & $newDrive)
Else
MsgBox(0, '', 'Fehler')
EndIf
;==================================================================================================
; Function Name: _PartialDrive($sDeviceName=-1, $sTargetPath=-1, $iDelete=0)
; Description:: Erstellt od. löscht ein Virtuelles Laufwerk. Das Laufwerk wird
; beim Herunterfahren des PC automatisch gelöscht.
; Parameter(s): $sDeviceName Buchstabe des zu erstellenden/löschenden Laufwerks
; -1 erster freier Lw-Buchstabe (Standard)
; $sTargetPath Verknüpfungspfad, -1= Erstellen: @MyDocumentsDir (Standard)
; Löschen: der mit dem Laufwerk verknüpfte Pfad wird automatisch zugeordnet
; optional: $iDelete 0=Erstellen (Standard); 1=Löschen des Laufwerks
; Return Value(s): Erfolg Lw-Buchstabe des erstellten/gelöschten Laufwerks
; Fehler 0 @error=1 übergebener Lw-Buchstabe existiert bereits (nur Erstellen)
; @error=2 kein freier Lw-Buchstabe vorhanden (nur Erstellen)
; @error=3 kein gültiger Verknüpfungspfad
; @error=4 Aktion fehlgeschlagen
; @error=5 kein gültiges Lw zum Löschen angegeben
; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
;==================================================================================================
Func _PartialDrive($sDeviceName=-1, $sTargetPath=-1, $iDelete=0)
If $sDeviceName = -1 And $iDelete = 0 Then
Local $aDrives = DriveGetDrive("ALL")
Local $oDrives = ObjCreate("System.Collections.ArrayList")
For $i = 1 To UBound($aDrives) -1
$oDrives.Add(Asc(StringLeft($aDrives[$i],1)))
Next
Local $j = 100
While $oDrives.Contains($j)
$j += 1
If $j > 122 Then Return SetError(2,0,0)
WEnd
$sDeviceName = Chr($j) & ':'
ElseIf ($sDeviceName = -1 Or Not FileExists($sDeviceName)) And $iDelete = 1 Then
Return SetError(5,0,0)
ElseIf $sTargetPath = -1 And $iDelete = 1 Then
Local $ret = DllCall("kernel32.dll", "long", "QueryDosDeviceA", "str", $sDeviceName, "str", "", "long", 260)
If $ret[0] = 0 Then
Return SetError(4,0,0)
Else
$sTargetPath = StringRegExpReplace($ret[2], '(\W*)([a-zA-Z].*)', '$2')
EndIf
EndIf
$sDeviceName = StringRegExpReplace(StringLower($sDeviceName), '(.*)([a-z]{1}:)(.*)', '$2')
If $iDelete = 0 And FileExists($sDeviceName) Then Return SetError(1,0,0)
If $sTargetPath = -1 Then $sTargetPath = @MyDocumentsDir
If Not FileExists($sTargetPath) Then Return SetError(3,0,0)
Local $iFlag = 0x0
If $iDelete <> 0 Then $iFlag = 0x2
Local $ret = DllCall('kernel32.dll', 'long', 'DefineDosDeviceA', _
'long', $iFlag, 'str', $sDeviceName, 'str', $sTargetPath)
If $ret[0] = 0 Then
Return SetError(4,0,0)
Else
Return $sDeviceName
EndIf
EndFunc ;==>PartialDrive
_PartialDriveGet()
#include<array.au3>
$a = _PartialDriveGet()
_ArrayDisplay($a)
;===============================================================================
; Function Name: _PartialDriveGet()
; Description:: Ermittelt partiell erstellte Laufwerke
; Return Value(s): 2D-Array mit (sofern vorhanden) Lw-Buchstabe und Verknüpfungspfad
; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
;===============================================================================
Func _PartialDriveGet()
Local $aFixed = DriveGetDrive('FIXED')
Local $aOut[1][2] = [['Lw','Pfad']]
For $i = 1 To UBound($aFixed) -1
Local $ret = DllCall("kernel32.dll", "long", "QueryDosDeviceA", "str", $aFixed[$i], "str", "", "long", 260)
Local $path = StringRegExpReplace($ret[2], '(\W*)([a-zA-Z].*)', '$2')
If StringRegExp($path, '[a-zA-Z]:.*') Then
ReDim $aOut[UBound($aOut)+1][2]
$aOut[UBound($aOut)-1][0] = $aFixed[$i]
$aOut[UBound($aOut)-1][1] = $path
EndIf
Next
Return $aOut
EndFunc ;==>_PartialDriveGet