- Offizieller Beitrag
Hier mal eine Funktion, um eine Datei vom Anwender umbenennen zu lassen.
Man übergibt den Dateinamen (Pfad kann man auch relativ übergeben, wird von der Funktion umgewandelt) und die Funktion übernimmt die Interaktion mit dem Anwender.
AutoIt
$sTestfile = @ScriptDir & '\test.txt'
$hFile = FileOpen($sTestfile, 2)
If $hFile <> -1 Then
FileWrite($hFile, 'abc')
FileClose($hFile)
EndIf
TraySetState(2)
$hGui = GUICreate('Hauptfenster', 640, 480)
GUISetState(@SW_SHOW, $hGui)
$sNewFilename = _FileRenameBox('test.txt', Default, $hGui)
ConsoleWrite('error: ' & @error & @CR & 'Neuer Dateiname: "' & $sNewFilename & '"' & @CR)
While True
Switch GUIGetMsg()
Case -3
Exit
EndSwitch
WEnd
;===============================================================================
; Function Name: _FileRenameBox($sOldFilename[, $sTitle = Default][, $hParent = 0])
; Description: Hiermit kann man eine Datei umbenennen (mit Anwender-Interaktion)
; Parameter(s): $sOldFilename = die Datei, die umbenannt werden soll (muss existieren)
; $sTitle = Ein Text, der als Titelzeile für das Fenster verwendet wird (optional)
; $hParent = das Handle zum Parent-Fenster (optional)
; Requirement(s): -
; Return Value(s): Im Erfolgsfall wird der neue Dateiname zurückgegeben.
; ansonsten: wird ein Leerstring zurückgegeben und
; @error = 1 -> FileMove schlug fehl (z.B. Rechteproblem)
; @error = 2 -> Der Anwender hat das umbenennen abgebrochen
; @error = 3 -> Die Datei existiert nicht
; Author(s): oscar (www.autoit.de)
;===============================================================================
Func _FileRenameBox($sOldFilename, $sTitle = Default, $hParent = 0)
$sOldFilename = FileGetLongName($sOldFilename, 1) ; evtl. vorhandenen relativen Pfad umwandeln
If Not FileExists($sOldFilename) Then Return SetError(3, 0, '') ; wenn die Datei nicht existiert, dann Funktion abbrechen
If $sTitle = Default Or $sTitle = '' Then $sTitle = 'Datei umbenennen...'
Local $sPath = StringRegExpReplace($sOldFilename, '(.+\\).+', '$1') ; nur der Pfad vom alten Dateinamen
Local $sFilename = StringRegExpReplace($sOldFilename, '.+\\(.+)', '$1') ; nur der Dateiname
Local $iError = 0 ; Variable zur Fehlerbehandlung
; nachfolgend ein paar lokale Konstanten deklarieren, falls diese im Hauptscript nicht deklariert wurden
If Not IsDeclared('GUI_EVENT_CLOSE') Then Local Const $GUI_EVENT_CLOSE = -3
If Not IsDeclared('WS_SYSMENU') Then Local Const $WS_SYSMENU = 0x00080000
If Not IsDeclared('WS_CAPTION') Then Local Const $WS_CAPTION = 0x00C00000
If Not IsDeclared('ES_READONLY') Then Local Const $ES_READONLY = 0x0800
If Not IsDeclared('ES_AUTOHSCROLL') Then Local Const $ES_AUTOHSCROLL = 0x0080
If Not IsDeclared('GUI_DISABLE') Then Local Const $GUI_DISABLE = 0x80
If Not IsDeclared('GUI_ENABLE') Then Local Const $GUI_ENABLE = 0x40
If Not IsDeclared('GUI_FOCUS') Then Local Const $GUI_FOCUS = 0x100
If Not IsDeclared('WS_EX_STATICEDGE') Then Local Const $WS_EX_STATICEDGE = 0x00020000
Local $sNewFilename = $sFilename, $fFileExists = False
Local $iWidth = 480, $iHeight = 260, $iLeft = -1, $iTop = -1
If IsHWnd($hParent) Then ; wenn ein Parent-Fenster vorhanden ist, dann...
Local $aPos = WinGetPos($hParent) ; die Position des Fensters holen
If $aPos[0] <> -32000 Then ; wenn das Fenster nicht minimiert ist, dann...
$iLeft = $aPos[0] + $aPos[2] / 2 - $iWidth / 2 ; die Box relativ zu diesem ausrichten
$iTop = $aPos[1] + $aPos[3] / 2 - $iHeight / 2
EndIf
GUISetState(@SW_DISABLE, $hParent) ; das Parent-Fenster deaktivieren
Else
TraySetState(2) ; wenn kein Parent-Fenster vorhanden, dann das Tray-Icon ausblenden
EndIf
Local $iOldOpt = Opt('GUIOnEventMode', 0) ; auf MessageLoop-Modus schalten und alten Zustand merken
Local $hGui = GUICreate($sTitle, $iWidth, $iHeight, $iLeft, $iTop, BitOR($WS_SYSMENU, $WS_CAPTION), Default, $hParent)
GUISetFont(9, 400, 0, 'Tahoma', $hGui, 5)
GUISetBkColor(0xE0E0E0, $hGui)
GUISetIcon('shell32.dll', -24, $hGui)
GUICtrlCreateGroup('Pfad:', 10, 10, 460, 52)
GUICtrlCreateInput($sPath, 20, 30, 440, 23, BitOR($ES_READONLY, $ES_AUTOHSCROLL))
GUICtrlSetFont(-1, 10, 400, 0, 'Tahoma', 5)
GUICtrlSetBkColor(-1, 0xFFFFD0)
GUICtrlCreateGroup('', -99, -99, 1, 1)
GUICtrlCreateGroup('Dateiname (alt):', 10, 70, 460, 52)
GUICtrlCreateLabel('"' & $sFilename & '"', 20, 92, 440, 24)
GUICtrlSetFont(-1, 10, 400, 0, 'Tahoma', 5)
GUICtrlCreateGroup('', -99, -99, 1, 1)
GUICtrlCreateGroup('Dateiname (neu):', 10, 130, 460, 56)
Local $idNewFilename = GUICtrlCreateInput($sNewFilename, 20, 152, 440, 24)
GUICtrlSetFont(-1, 10, 400, 0, 'Tahoma', 5)
GUICtrlCreateGroup('', -99, -99, 1, 1)
Local $idRename = GUICtrlCreateButton('Umbenennen', 240, 200, 120, 25)
Local $idCancel = GUICtrlCreateButton('Abbrechen', 370, 200, 100, 25)
Local $idStatus = GUICtrlCreateLabel(' Bitte den neuen Dateinamen eingeben...', -2, 240, 484, 20, -1, $WS_EX_STATICEDGE)
GUICtrlSetFont(-1, 10, 400, 0, 'Tahoma', 5)
GUICtrlSetState($idNewFilename, $GUI_FOCUS)
GUISetState(@SW_SHOW, $hGui)
While True
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE, $idCancel
$iError = 2
ExitLoop
Case $idRename
$sNewFilename = StringRegExpReplace(GUICtrlRead($idNewFilename), '.*\\(.+)', '$1') ; evtl. eingegebenen Pfad abtrennen
If Not FileExists($sPath & $sNewFilename) Then ; nur umbenennen, wenn bisher keine Datei mit dem neuen Namen existiert
$iError = FileMove($sOldFilename, $sPath & $sNewFilename) = 0 ; $iError bekommt hier den Wert "1", wenn das umbenennen nicht geklappt hat
ExitLoop ; While-Schleife verlassen
EndIf
EndSwitch
$sNewFilename = GUICtrlRead($idNewFilename)
If $sNewFilename <> StringRegExpReplace($sNewFilename, '.*\\(.+)', '$1') Then GUICtrlSetData($idNewFilename, StringRegExpReplace($sNewFilename, '.*\\(.+)', '$1'))
If $sNewFilename <> '' And $sPath & $sNewFilename <> $sOldFilename Then ; wenn ein neuer Dateiname eingegeben wurde, dann...
If BitAND(GUICtrlGetState($idRename), $GUI_DISABLE) Then
If FileExists($sPath & $sNewFilename) Then
If Not $fFileExists Then GUICtrlSetData($idStatus, ' Achtung! Es existiert bereits eine Datei mit diesem Namen!')
$fFileExists = True
Else
GUICtrlSetState($idRename, $GUI_ENABLE) ; den "Umbenennen"-Button aktivieren
GUICtrlSetData($idStatus, ' Bitte den neuen Dateinamen eingeben...')
$fFileExists = False
EndIf
EndIf
Else
If $fFileExists Then GUICtrlSetData($idStatus, ' Bitte den neuen Dateinamen eingeben...')
$fFileExists = False
If BitAND(GUICtrlGetState($idRename), $GUI_ENABLE) Then
GUICtrlSetState($idRename, $GUI_DISABLE) ; sonst deaktivieren
GUICtrlSetData($idStatus, ' Bitte den neuen Dateinamen eingeben...')
EndIf
EndIf
WEnd
If IsHWnd($hParent) Then GUISetState(@SW_ENABLE, $hParent) ; das Parent-Fenster wieder aktivieren
GUIDelete($hGui) ; das Eingabefenster löschen
Opt('GUIOnEventMode', $iOldOpt) ; und den alten Zustand wiederherstellen
If $iError Then Return SetError($iError, 0, '')
Return SetError(0, 0, $sPath & $sNewFilename)
EndFunc
Alles anzeigen
Screenshot:
_FileRenameBox.png