Что нового

FileDelete не удаляет файлы.

Radik

Новичок
Сообщения
71
Репутация
1
Искал, не нашел. Если просмотрел, ткните носом.
Хотел автоматизировать чистку куков. Все просто:
Код:
FileDelete("C:\Users\Admin\Cookies\*.txt")

Но файлы почему-то не удаляются. С папки Cookies снял
атрибуты системная, скрытая. Windows 7, 32 бит.
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
У себя проверил эту папку на Handles с помощью Unlocker: вывод - папка используется как минимум программой Explorer.exe(у меня на файл Index.dat). У вас вероятно то же к файлам привязаны хэндлы.
 
Автор
R

Radik

Новичок
Сообщения
71
Репутация
1
Explorer закрыт, index.dat не трогаю, тока *.txt, руками удаляются без проблем.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Radik
смотришь в справке пользовательскую функцию _FO_FileSearch
ищешь по маске и удаляешь все файлы txt. код будет строчек пять. со снятием атрибутов чтения и системный
 
Автор
R

Radik

Новичок
Сообщения
71
Репутация
1
Спасибо, конечно. Но! Почему не прокатывает мой вариант?
И потом, сделал:
Код:
#Include <FileOperations.au3>
$s = _FO_FileSearch("C:\Users\Admin\Cookies\")
MsgBox(0, '', $s)

Выдал пустую форму.
 

erlik

Продвинутый
Сообщения
317
Репутация
84
Radik
Попробуй указать путь как
Код:
@UserProfileDir&'\Cookies\*.txt'.

PS: Указывать точные пути - не очень хороший стиль программирования. Они могут различаться на разных компьютерах, к тому же в семерке полно виртуальных папок - которые в проводнике определяются одним образом, а реально имеют совершенно иной путь\имя.
У меня XP и все удаляется нормально через FileDelete.
----------------------------------------------
Правильный путь до 'печенек' в семерке
Код:
@UserProfileDir&'\AppData\Roaming\Microsoft\Windows\Cookies'

а тот, что в проводнике - это символьная ссылка.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Код:
#Include <FileOperations.au3>
$array = _FO_FileSearch('C:\Users\Admin\Cookies','*.txt')
For $i = 1 To $array[0]
	FileSetAttrib($array[$i],'-RSH')
	FileDelete($array[$i])
Next



Добавлено:
Сообщение автоматически объединено:

Radik [?]
Выдал пустую форму.
потому что
Код:
_FO_FileSearch
возвращает массив по умолчанию. я ж говорил, прочти справку


Добавлено:
Сообщение автоматически объединено:

удалить нельзя файл, если он используется или есть запрет в виде атрибута


Добавлено:
Сообщение автоматически объединено:

кстати, если система семерка, то папки
Код:
Cookies
нет. это всего лишь ссылка для спецслучаев - http://forum.softweb.ru/showpost.php?p=635653&postcount=2
 
Автор
R

Radik

Новичок
Сообщения
71
Репутация
1
Спасибо, Erlik! Все получилось в 1 строке.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Radik,
Полные пути ко многим папкам можно прочитать в реестре (и в ХР, и в 7). Ваш случай (для 32):
Код:
ConsoleWrite(RegRead('HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders', 'Cookies') & @LF)
Или с помощью API _WinAPI_ShellGetKnownFolderPath(), _WinAPI_ShellGetSpecialFolderPath() из WinAPIEx.au3, или см. на оф.форуме _WinAPI_SHGetFolderPath()
OffTopic:
Странно, что не нашел этой функции в WinAPIEx.au3. :scratch:
 

eus_deus

Новичок
Сообщения
118
Репутация
0
Всем привет!
Похожая проблема - не отрабатывает удаление файлов.
Код:
#Include <FileOperations.au3>

_deldub_arch()

Func _deldub_arch()
    Local $sPath, $aProgiFull, $a
    $sPath = 'd:\TC\Update\'
    $aProgiFull = _FO_FileSearch($sPath, '*,exe|*.rar|*.zip', True, 0, 1, 1, 1, '', '', '')
    Dim $aTableProgi[UBound($aProgiFull)][3] 
    For $i=1 To $aProgiFull[0]
        $aTableProgi[$i][0] = StringRegExpReplace ($aProgiFull[$i],'(?m)(^.*)\\(.*)$','\2')
         $aTableProgi[$i][1] = StringRegExpReplace ($aTableProgi[$i][0],'(.+)\_([\d+\.]+)(\_.+)?(\.zip|\.rar)','\1')
         $aTableProgi[$i][2] = StringRegExpReplace ($aTableProgi[$i][0],'(.+)\_([\d+\.]+)(\_.+)?(\.zip|\.rar)','\2')
    Next
    For $i=1 To UBound($aTableProgi)
        If $i = UBound($aTableProgi) - 1 Then ExitLoop
        If $aTableProgi[$i][1] = $aTableProgi[$i+1][1] Then 
            MsgBox(4096,'Дубликаты', 'Найдены дубликаты в строках '&$i &' и '&$i+1 )
            If  $aTableProgi[$i][2] > $aTableProgi[$i+1][2] Then
                $a &= $sPath&$aTableProgi[$i+1][0]&'|'
            Else
                $a &= $sPath&$aTableProgi[$i][0]&'|'
            EndIf 
        EndIf
    Next
    $a = StringTrimRight($a, 1)
    FileDelete ($a)
EndFunc
В задаче вообще - удалить архивы программами со старыми версиями. Вот версии определяю, а удаление не происходит. Причем, если на место переменной $a прописать полный путь, то удаление есть
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Код:
;Сам никогда ну удалял несколько файлов за один заход , го разве функция "FileDelete" поддерживает в качестве параметра пути к нескольким файлам с разделителем "|" ?
;Не проще ли удалять эти файлы сразу после того , как их нашли ?
    If $aTableProgi[$i][1] = $aTableProgi[$i + 1][1] Then
        MsgBox(4096, 'Дубликаты', 'Найдены дубликаты в строках ' & $i & ' и ' & $i + 1)
            If $aTableProgi[$i][2] > $aTableProgi[$i + 1][2] Then
                 FileDelete($sPath & $aTableProgi[$i + 1][0])
            Else
                FileDelete($sPath & $aTableProgi[$i][0])
            EndIf
    EndIf

Для проверки правильности составления пути к файлу напишите "ConsoleWrite" для пути перед удалением и увидитке, что там не так.
 
Последнее редактирование:

eus_deus

Новичок
Сообщения
118
Репутация
0
;Не проще ли удалять эти файлы сразу после того , как их нашли ?
Изначально так и было, это потом уже выносил в отдельную переменную.
В переменную в начало вставляется перенос строки. Решил так:
Код:
If $aTableProgi[$i][1] = $aTableProgi[$i + 1][1] Then
            MsgBox(4096, 'Дубликаты', 'Найдены дубликаты в строках ' & $i & ' и ' & $i + 1)
            If $aTableProgi[$i][2] > $aTableProgi[$i + 1][2] Then
                $aTableProgi[$i+1][0] = StringTrimLeft ($aTableProgi[$i+1][0], 1)
                FileDelete($sPath & $aTableProgi[$i + 1][0])
             Else
                $aTableProgi[$i][0] = StringTrimLeft ($aTableProgi[$i][0], 1)
                FileDelete($sPath & $aTableProgi[$i][0])
            EndIf
 
Последнее редактирование:
Верх