Что нового

Удаление всех файлов кроме указанных

Tempo

Скриптер
Сообщения
568
Репутация
181
Версия AutoIt: 3.3.14.2

Описание: Удаление всех файлов и папок кроме указанных в списке.

Примечания: То есть кидаешь скрипт в папку и он удаляет все лишнее.
 

ra4o

AutoIT Гуру
Сообщения
1 101
Репутация
223
Список в каком виде ? Пример дайте.
 

ra4o

AutoIT Гуру
Сообщения
1 101
Репутация
223
Придётся гадать... Список -это обычный текстовый файл, где каждый файл в новой строке, так-же , учитывая , что Вы скрипт будете запускать из той папки, в которой будут удаляться файлы, то значение имеет только имя файла, например для Вашего примера файл "test.dll" попадёт в исключения и удаляться не будет. Верно ? Так-же, что-бы исключить лишние диалоги выбора файла списка он (список) должен иметь какое-то узнаваемое имя...
Можно так :
Код:
#include <Array.au3>
#include <File.au3>

Local $ListFile = 'Список.txt';Имя файла исключений

If FileExists(@ScriptDir & '\' & $ListFile) Then
	;Чтение имён файлов исключений в массив
	Local $aFiles = FileReadToArray(@ScriptDir & '\' & $ListFile)
	;Оставляем в массиве только имя файла без пути
	For $i = 0 To UBound($aFiles) - 1
		$aFiles[$i] = StringRegExpReplace($aFiles[$i], '^.*\\', '')
	Next

	;Получение в массив всех файлов в папке со скриптом
	Local $aAllFiles = _FileListToArray(@ScriptDir)
	;перебор всех файлов в папке со скриптом и если файла нет в массиве исключений и это не сам файл с исключениями и не файл скрипта, то удаляем этот файл
	For $j = 1 To $aAllFiles[0]
		If _ArraySearch($aFiles, $aAllFiles[$j]) < 0 And $aAllFiles[$j] <> $ListFile And $aAllFiles[$j] <> @ScriptName Then
			;Определение атрибута файла (файл или папка)
			If StringInStr(FileGetAttrib($aAllFiles[$j]), 'D') Then
				DirRemove(@ScriptDir & '\' & $aAllFiles[$j],1);Удаление папки
			Else
				FileDelete(@ScriptDir & '\' & $aAllFiles[$j]);Удаление файла
			EndIf

		EndIf
	Next

Else
	MsgBox(48, 'Ошибка !', 'Не найден файл списка исключений !', 3)
EndIf
Копируете этот скрипт в папку, запускаете его и он удалит все файлы из этой папки , кроме тех, что в списке исключений (не удалится сам список и исполняемый скрипт, даже если их нет в списке ).
 
Автор
Tempo

Tempo

Скриптер
Сообщения
568
Репутация
181
Но ведь если test.dll будет не в папке систем его тоже хотелось бы удалить и еще можно записать список в скрипт? Просто 1 файл удобней)) Большое спасибо и за это приду домой опробую
 

ra4o

AutoIT Гуру
Сообщения
1 101
Репутация
223
Изменил скрипт - теперь удаляет и файлы и папки
Но ведь если test.dll будет не в папке систем его тоже хотелось бы удалить
тогда нужно записывать полный путь к файлу, ведь папка систем может быть где угодно
можно записать список в скрипт?
Можно, по-этому я сразу и просил
Список в каком виде ? Пример дайте.
что-бы не гадать.
С этим скриптом работайте аккуратно, что-бы не удалить чего лишнего. Файлы после удаления скриптом в корзину не попадают и восстановить их будет сложно !
Давайте точнее определимся с задачей :
- Список файлов и папок исключения записать в тело скрипта (например массивом)
- каждый элемент списка это полный путь к файлу
- все папки и файлы , которые находятся в дирректории скрипта и их нет в массиве исключений - удалятся

Так ?
Страшный скрипт получится !Случайный запуск не в той дирректории приведёт к печальным последствиям !
 
Автор
Tempo

Tempo

Скриптер
Сообщения
568
Репутация
181
Все верно но ведь можно сделать стартовый запрос если Вы так переживаете))
 
Автор
Tempo

Tempo

Скриптер
Сообщения
568
Репутация
181
Пути я не могу сейчас написать так как на работе еще 3 часа сидеть и названий не помню просто для примера напишите пару путей, а я уже свои потом допишу. Я так понимаю они должны быть такими @scriptdir\system\test.dll?
 

ra4o

AutoIT Гуру
Сообщения
1 101
Репутация
223
Не обязательно относительно расположения скрипта, может быть путь , например "C:\Windows\Temp" итп
Мне не нужно конкретные пути, важно понять что там должно быть, формат записи. Свои пути уже вставите в скрипт сами.
Вот вариант без дополнительного файла списка:
Код:
#include <Array.au3>
#include <File.au3>

;Массив исключений
Local $aFiles[3] = [@ScriptDir & '\BackUp', @ScriptDir & '\AutoIt v3 Script.au3', @ScriptDir & '\C_USER0.DAT']

;Получение в массив всех файлов в папке со скриптом
Local $aAllFiles = _FileListToArray(@ScriptDir)
;перебор всех файлов в папке со скриптом и если файла нет в массиве исключений и это не сам файл скрипта, то удаляем этот файл
For $j = 1 To $aAllFiles[0]
	If _ArraySearch($aFiles, @ScriptDir & '\' & $aAllFiles[$j]) < 0 And $aAllFiles[$j] <> @ScriptName Then
		;Определение атрибута файла (файл или папка)
		If StringInStr(FileGetAttrib($aAllFiles[$j]), 'D') Then
			DirRemove(@ScriptDir & '\' & $aAllFiles[$j], 1);Удаление папки
		Else
			FileDelete(@ScriptDir & '\' & $aAllFiles[$j]);Удаление файла
		EndIf

	EndIf
Next
 

joiner

Модератор
Локальный модератор
Сообщения
3 350
Репутация
577
мой вариант до кучи :smile:

Код:
_FSD('Полный путь к папке', 'имя папки|имя файла с расширением', 1)

; Параметры...............: $sPath - Путь поиска(строка)
;                           $sExt - Имя и расширение|имя папки. Пишем только имена без путей. разделяем знаком |
;                          $iDepth - Глубина поиска(число)
;                                |0 - Поиск во всех папках
;                                |1 - Поиск на первом уровне
Func _FSD($sPath, $sExt = '', $iDepth = 0)
	$sPath = StringStripWS($sPath, 3)
	$iDepth = Number($iDepth)
	If StringCompare(StringRight($sPath, 1), '\') Then $sPath = $sPath & '\'
	Local $sFileList
	__FSD($sFileList, $sPath, $iDepth)
	If @error Then Return SetError(1)
	$sFileList = StringTrimRight($sFileList, 1)
	If Not $sFileList Then Return SetError(2)
	$sFileList = StringSplit($sFileList, '|', 1)
	Local $sDelim = StringSplit($sExt, '|', 1)
	Local $gn
	For $o = 1 To $sDelim[0]
		For $i = 1 To $sFileList[0]
			$gn = StringRegExpReplace($sFileList[$i], '.*\\', '')
			If Not StringCompare($sDelim[$o], $gn) Then $sFileList[$i] = ''
		Next
	Next
	For $i = 1 To $sFileList[0]
		If $sFileList[$i] Then
			If Not FileDelete($sFileList[$i]) Then DirRemove($sFileList[$i], 1)
		EndIf
	Next
EndFunc   ;==>_FSD

Func __FSD(ByRef $sFileList, $sPath, $iDepth = 0)
	Local $sFile = '', $hFirstFile = FileFindFirstFile($sPath & '*')
	If $hFirstFile = -1 Then Return SetError(1)
	While 1
		$sFile = FileFindNextFile($hFirstFile)
		If @error Then ExitLoop
		If @extended Then
			$sFileList &= $sPath & $sFile & '|'
			If Not $iDepth Then __FSD($sFileList, $sPath & $sFile & '\', $iDepth)
		Else
			$sFileList &= $sPath & $sFile & '|'
		EndIf
	WEnd
	FileClose($hFirstFile)
EndFunc   ;==>__FSD
 
Автор
Tempo

Tempo

Скриптер
Сообщения
568
Репутация
181
ra4o сказал(а):
Не обязательно относительно расположения скрипта, может быть путь , например "C:\Windows\Temp" итп
Мне не нужно конкретные пути, важно понять что там должно быть, формат записи. Свои пути уже вставите в скрипт сами.
Вот вариант без дополнительного файла списка:
Код:
#include <Array.au3>
#include <File.au3>

;Массив исключений
Local $aFiles[3] = [@ScriptDir & '\BackUp', @ScriptDir & '\AutoIt v3 Script.au3', @ScriptDir & '\C_USER0.DAT']

;Получение в массив всех файлов в папке со скриптом
Local $aAllFiles = _FileListToArray(@ScriptDir)
;перебор всех файлов в папке со скриптом и если файла нет в массиве исключений и это не сам файл скрипта, то удаляем этот файл
For $j = 1 To $aAllFiles[0]
	If _ArraySearch($aFiles, @ScriptDir & '\' & $aAllFiles[$j]) < 0 And $aAllFiles[$j] <> @ScriptName Then
		;Определение атрибута файла (файл или папка)
		If StringInStr(FileGetAttrib($aAllFiles[$j]), 'D') Then
			DirRemove(@ScriptDir & '\' & $aAllFiles[$j], 1);Удаление папки
		Else
			FileDelete(@ScriptDir & '\' & $aAllFiles[$j]);Удаление файла
		EndIf

	EndIf
Next
Спасибо всем за помощь вариант от ra4o прекрасно работает))


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

Появилась одна проблема, а есть ли ограничение на количество файлов?


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

Больше 89 выдает ошибку с обрезком макроса и ошибка неизвестный макрос)) Извините что не сказал сразу что файлов много около 250
 

ra4o

AutoIT Гуру
Сообщения
1 101
Репутация
223
250 - это совсем не много... попробуйте проверить чтение содержимого папки в массив , дописав
Код:
Local $aAllFiles = _FileListToArray(@ScriptDir)
;Добавить следующую строку (временно для проверки)
_ArrayDisplay($aAllFiles)
 
Автор
Tempo

Tempo

Скриптер
Сообщения
568
Репутация
181
Извиняюсь плохо описал проблему ошибка возникает когда добавить слишком много исключений если больше 89 ошибка наверно из за того что слишком много текста в 1 строке)) Есть 250 файлов которые не надо удалять
 

ra4o

AutoIT Гуру
Сообщения
1 101
Репутация
223
для массива 250 элементов тоже мелочь, попробуйте записывать массив не в одну строку, а переносить знаком "_" с пробелом перед ним , например так :
Код:
Local $aFiles[4] = ['Исключение 1' , _
'Исключение 2', _
'Исключение 3', _
'Исключение 4']
 
Автор
Tempo

Tempo

Скриптер
Сообщения
568
Репутация
181
Спасибо все хорошо ошибки нет но как я понимаю
Код:
$aAllFiles = _FileListToArray(@ScriptDir)
не возвращает того что находиться в подкаталогах проверяемого каталога поэтому я сделал проверку каждого подкаталога отдельно вроде работает))
 

joiner

Модератор
Локальный модератор
Сообщения
3 350
Репутация
577
Tempo [?]
не возвращает того что находиться в подкаталогах проверяемого каталога поэтому я сделал проверку каждого подкаталога отдельно вроде работает))
Tempo
для этого есть функция
Код:
_FileListToArrayRec

выше я давал функцию, которая имеет два параметра поиска - поиск в одной папке и поиск во всех вложенных папках
к тому же, функция сразу удаляет нужные файлы и папки
 

ra4o

AutoIT Гуру
Сообщения
1 101
Репутация
223
не возвращает того что находиться в подкаталогах проверяемого каталога
Нет, не возвращает.
Код:
$aAllFiles = _FileListToArray(@ScriptDir)
Эта функция возвращает список файлов и каталогов в директории со скриптом и удалит всё, будь то файл или каталог, если его нет в списке исключений, без просмотра содержимого вложенных каталогов. Если необходим поиск в подкаталогах, лучше переделать, воспользовавшись советом от joiner.
 

RitaHog

Новичок
Сообщения
4
Репутация
0
Не нашел в документации ответа на вопрос: возможно ли удалить файл на который есть ссылка в записи по триггеру на удаление записи ?
Подобной встроенной функции не нашел.
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
RitaHog

Предупреждение За нарушение общих правил (пункт В.4):
Не лепите несколько вопросов разной тематики в один пост. По типу "Ребят, а ещё такой вопрос...". Каждый вопрос в свою тему.


С уважением, ваш Глобальный модератор.
 
Верх