Что нового

[Файловая система] FileDelete не удаляет файлы на Win7

Nescoffe

Новичок
Сообщения
4
Репутация
0
Доброго времени суток.
На основании темы - http://autoit-script.ru/index.php?topic=1440.0
переделал под себя код для удаления временных файлов в папке %temp%
Но почему то файлы FileDelete($aReturn[$i]) не удаляет.
Хотя в переменной $aReturn[$i] - передается вроде верный путь.
Операционная система Windows 7.
Код:
;Интерфейс
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
;Файловая система
#include <Date.au3>
#include <File.au3>

;Постоим интерфейс программы
#Region ### START Koda GUI section ### Form=C:\Distr\Administrator\Script\AutoIT\GUI\koda_1.7.3.0\Forms\Optimize.kxf
$Optimize = GUICreate("Optimize", 261, 261, 192, 124)
$txtAuthor = GUICtrlCreateLabel("Panov D.A.", 200, 0, 59, 17)
$GroupClear = GUICtrlCreateGroup("Очистить", 8, 16, 233, 177)
$chRecycle = GUICtrlCreateCheckbox("Корзина", 16, 40, 73, 17)
$chTempFiles = GUICtrlCreateCheckbox("Врем. файлы", 16, 72, 89, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$btnRun = GUICtrlCreateButton("Выполнить", 96, 224, 75, 25)
$btnExit = GUICtrlCreateButton("Выход", 176, 224, 75, 25)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###



$Recycle = 0
$TempFiles = 0
;Проверка версии ОС
If @OSVersion = "WIN_7" Then
   #RequireAdmin ;если у Вас Windows 7, то раскомментируйте для системных папкок.
ElseIf @OSVersion = "WIN_XP" Then
Else
	  MsgBox(4096, "Error", "Данная программа предназначена только для Windows XP и Windows 7")
EndIf
   
;Переменные для чистки временных файлов
$path1 = @TempDir ;папка %temp% для очистки.
If @OSVersion = "WIN_7" Then ;Пока что недоделано
   $path2 = 1
EndIf
$delta = "5" ; кол-во дней, старше которых удаляем.
$flag = 1 ; 0-дата последнего изменения, 1-дата создания, 2-дата последнего открытия.

;Проверка версии ОС



;Вечный цикл получения событий
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		 Case $GUI_EVENT_CLOSE
			Exit
		 Case $btnExit
			Exit
		 Case $btnRun ;Нажатие кнопки "Выполнить"
			If $Recycle = 1 Then ;Очистка корзины 
			   FileRecycleEmpty()
			EndIf
			If $TempFiles = 1 Then
			   _TempFilesRemove()
			EndIf
			MsgBox(4096, "Info", "Задачи выполненны")
		 Case $chTempFiles ;Очистка временных папок Windows
			$TempFiles = BitAnd(GUICtrlRead($chTempFiles),$GUI_CHECKED)
		 Case $chRecycle
			$Recycle = BitAnd(GUICtrlRead($chRecycle),$GUI_CHECKED)
	EndSwitch
WEnd

Func _TempFilesRemove()
   $aReturn = _FileSearch($path1, '*.*')
   
    For $i = 1 To UBound($aReturn) - 1
	  $aTime = FileGetTime($aReturn[$i], $flag)
	  If _DateDiff('D', $aTime[0] & '/' & $aTime[1] & '/' & $aTime[2], _NowCalc()) > $delta Then
		 FileDelete($aReturn[$i])
		 ;MsgBox(4096, "Info", $aReturn[$i])
	  EndIf
   Next

   _DirRemoveEmptyTime($path1)
EndFunc		;==>_TempFilesRemove

Func _FileSearch($sPath, $sFileMask)
    Local $sOut = StringToBinary("0" & @CRLF, 2), $aOut
    Local $hDir = Run(@ComSpec & ' /U/C DIR "' & $sPath & '\' & $sFileMask & '" /S/B/A-D', @SystemDir, @SW_HIDE, 6)

    While 1
        $sOut &= StdoutRead($hDir, False, True)
        If @error Then ExitLoop
    WEnd

    $aOut = StringRegExp(BinaryToString($sOut, 2), "[^\r\n]+", 3)
    If @error Then Return SetError(1)

    $aOut[0] = UBound($aOut) - 1
    Return $aOut
EndFunc   ;==>_FileSearch

Func _DirRemoveEmptyTime($sDIR)
    Local $iPRC, $aDIR = _FileListToArray($sDIR, '*', 2)
    If IsArray($aDIR) Then
        For $i = 1 To $aDIR[0]
            _DirRemoveEmptyTime($sDIR & "\" & $aDIR[$i])
        Next
    EndIf
    If DirGetSize($sDIR) = 0 Then
        $aTimeDIR = FileGetTime($sDIR, $flag)
        If _DateDiff('D', $aTimeDIR[0] & '/' & $aTimeDIR[1] & '/' & $aTimeDIR[2], _NowCalc()) > $delta Then
            DirRemove($sDIR)
        EndIf
    EndIf
EndFunc   ;==>_DirRemoveEmptyTime
 

Arei

Скриптер
Сообщения
938
Репутация
115
На своей 7 я тоже мучался, до того как поставил права доступа и использовать скрипит от алина, т.к UAC может блокировать ваши действия.
С уважением, Arei.
 

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
попробуй это. у меня работает ( на семерке)

Код:
$aReturn = _FileSearch(@TempDir, "*")
For $id = 1 To $aReturn[0]
	FileDelete($aReturn[$id])
	DirRemove($aReturn[$id],1)
	Next
ShellExecute(@TempDir)

Func _FileSearch($sPath, $sFileMask = "*", $iFlag = 0, $iSubDir = 1, $iSort = 0)
    Local $sOutBin, $sOut, $aOut, $sRead, $hDir, $sAttrib, $sFiles

    If Not StringInStr(FileGetAttrib($sPath), "D") Then
        Return SetError(1, 0, 0)
    EndIf

    If $iSubDir = 1 Then
        $sAttrib &= ' /S'
    EndIf

    If $iSort = 1 Then
        $sAttrib &= ' /O:N'
    EndIf

    Switch $iFlag
        Case 1
            $sAttrib &= ' /A-D'
        Case 2
            $sAttrib &= ' /AD'
        Case Else
            $sAttrib &= ' /A'
    EndSwitch

    $sOut = StringToBinary('0' & @CRLF, 2)
    $sPath = StringRegExpReplace($sPath, '\\+$', '')
    $sFileMask = StringRegExpReplace($sFileMask, '^;+|;+$', '')
    $sFileMask = StringRegExpReplace($sFileMask, ';{2,}', ';')
    $aMasks = StringSplit($sFileMask, ';')

    For $i = 1 To $aMasks[0]
        If StringStripWS($aMasks[$i], 8) = "" Then
            ContinueLoop
        EndIf

        $sFiles &= '"' & $sPath & '\' & $aMasks[$i] & '"'

        If $i < $aMasks[0] Then
            $sFiles &= ';'
        EndIf
    Next

    $hDir = Run(@ComSpec & ' /U /C DIR ' & $sFiles & ' /B' & $sAttrib, @SystemDir, @SW_HIDE, 6)

    While 1
        $sRead = StdoutRead($hDir, False, True)

        If @error Then
            ExitLoop
        EndIf

        If $sRead <> "" Then
            $sOut &= $sRead
        EndIf
    Wend

    $aOut = StringRegExp(BinaryToString($sOut, 2), '[^\r\n]+', 3)

    If @error Or UBound($aOut) < 2 Then
        Return SetError(2, 0, 0)
    EndIf

    $aOut[0] = UBound($aOut)-1
    Return $aOut
EndFunc
 
Верх