Что нового

[Сеть, интернет] удаления файлов старше определённой даты с FTP сервера

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
У Вас время создания и редактирования файла равно "0", есть только время последней записи -5 и 6 элемент массива. Если Вас устроит сравнивайте с датой последней записи.
Замените в двух строках на
Код:
If _DateDiff('D', _FTP_FileTimeLoHiToStr($aNextFile[5], $aNextFile[6],1), _NowCalc()) > $delta Then
 
Автор
K

Ksenz44

Новичок
Сообщения
32
Репутация
0
Так попробовал поставить 5-6 не получилось поставил 6-7 что то удалил пока не понял что))) хотя нет не чего не удалил( :'( :'(
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Ах, да , конечно 6,7 извините ошибся. Поставьте для откатки
Код:
MsgBox(0,$aFile[10],_FTP_FileTimeLoHiToStr($aFile[6], $aFile[7],1))
_FTP_FileDelete($hConn, $sDir & $aFile[10]);Эту строку можно закоментировать, для отладки, что-бы лишнего не удалить
и смотрите, что он выбирает
 
Автор
K

Ksenz44

Новичок
Сообщения
32
Репутация
0
Вот что случается) поставил 0 -1 удалил все)))) если беру другую папку с файлами и запускаю с 6-7 и окошком вывода то он дает сообщения с именем 1 файла с верху и датой по редине дата имя правильное совпадает с датой создания изменения доступа) это окошко с одним и тем же значением он выдает раз 5-7, удалил фалы 1 и 2 числа того месяца и 10 числа этого месяца все остальные не тронул) если еше раз запустить с изменением количества дней не чего не происходит даже сообщение не выдает.
 

Вложения

  • Безымянный1.png
    Безымянный1.png
    3.8 КБ · Просмотры: 11

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Всё верно, вверху имя файла, посредине - дата его последнего изменения.Должно появиться столько раз, сколько у Вас файлов в выбранной папке.
если еше раз запустить с изменением количества дней не чего не происходит даже сообщение не выдает
Смотрите, где у Вас MsgBox расположен, если не появляется, значит скрипт до него не доходит, он в условии стоит, которое не выполняется !
 
Автор
K

Ksenz44

Новичок
Сообщения
32
Репутация
0
В том и смысл что то странное он выдает раз 6 хотя фалов больше + еще он не меняет не имя не дату то есть выдает один и тот же файл, если запустить 2 раз он их не выдает следовательно это условие после 1 раза перестаёт выполнятся. Из этого следует если поле 1 раза он удаляет 1 файл в паке то условие перестаёт выполнятся. что за хрень))) :stars:
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Переделал с графическим интерфейсом для наглядности, попробуйте
Код:
#include <FTPEx.au3>
#include <Date.au3>
#include <Array.au3>
#include <GUIConstants.au3>
#include <GuiListView.au3>


Global $sPassive = "0"
Global $sPort = "21"
Global $sServer = "ftp.csx.cam.ac.uk"
Global $sUserName = ""
Global $sPassword = ""
Global $sDir = "/pub/software/programming/pcre/";Здесь путь к папке, где искать файлы
Global $aArray

Dim $aArray[1][3]






$hMain = GUICreate('Все файлы FTP сервера', 500, 350)
Global $ListView = GUICtrlCreateListView('Имя файла|Дата последнего изменения|Прошло дней', 5, 5, 490, 290)
GUICtrlCreateLabel('Удалить файлы старше ', 10, 310, 175, 25)
GUICtrlSetFont(-1, 12)
$dDay = GUICtrlCreateInput('2', 190, 308, 30, 25)
GUICtrlSetFont(-1, 12)
GUICtrlCreateLabel('дней', 230, 310, 40, 25)
GUICtrlSetFont(-1, 12)
$DelButton = GUICtrlCreateButton('Удалить', 280, 302, 120, 40)
GUICtrlSetFont(-1, 12, 600)
_FindFile()
GUISetState(@SW_SHOW, $hMain)



While 1
	$msg = GUIGetMsg()
	Select
		Case $msg = $GUI_EVENT_CLOSE

			Exit
		Case $msg = $DelButton
			_DelFile()
			_GUICtrlListView_DeleteAllItems($ListView)
			$aArray = 0
			Dim $aArray[0][3]
			_FindFile()
	EndSelect
WEnd


Func _DelFile()
	$NowData = @YEAR & "/" & @MDAY & "/" & @MON & " " & @HOUR & ":" & @MIN & ":" & @SEC
	$hOpen = _FTP_Open('MyFTP Control')
	If @error Then
		MsgBox(16, "Супер FTP клиент", "Не удалось создать сессию! Код ошибки: " & @error & "")
		;GUIDelete ( $hWnd )
		;GuiEnable($hGui)
		;Return SetError(1,0,0)
	EndIf


	$hConn = _FTP_Connect($hOpen, $sServer, $sUserName, $sPassword, $sPassive, $sPort)
	If @error Then
		MsgBox(16, "Супер FTP клиент", "Не удалось подключиться к серверу! Код ошибки: " & @error & "")
	EndIf


	$delta = GUICtrlRead($dDay)
	For $i = 0 To UBound($aArray) - 1
		If _DateDiff('D', $aArray[$i][1], $NowData) > $delta Then
			_FTP_FileDelete($hConn, $sDir & $aArray[$i][0])
		EndIf
	Next


	_FTP_Close($hOpen)

EndFunc   ;==>_DelFile


Func _FindFile()

	$NowData = @YEAR & "/" & @MDAY & "/" & @MON & " " & @HOUR & ":" & @MIN & ":" & @SEC
	$hOpen = _FTP_Open('MyFTP Control')
	If @error Then
		MsgBox(16, "Супер FTP клиент", "Не удалось создать сессию! Код ошибки: " & @error & "")
		;GUIDelete ( $hWnd )
		;GuiEnable($hGui)
		;Return SetError(1,0,0)
	EndIf


	$hConn = _FTP_Connect($hOpen, $sServer, $sUserName, $sPassword, $sPassive, $sPort)
	If @error Then
		MsgBox(16, "Супер FTP клиент", "Не удалось подключиться к серверу! Код ошибки: " & @error & "")
	EndIf



	$n = 0

	Local $h_Handle
	Local $aFile = _FTP_FindFileFirst($hConn, $sDir, $h_Handle)
	If Not @error Then

		ReDim $aArray[$n + 1][3]
		$aArray[$n][0] = $aFile[10]
		$aArray[$n][1] = _FTP_FileTimeLoHiToStr($aFile[6], $aFile[7], 1)
		$aArray[$n][2] = _DateDiff('D', $aArray[$n][1], $NowData)
		GUICtrlCreateListViewItem($aArray[$n][0] & '|' & $aArray[$n][1] & '|' & $aArray[$n][2], $ListView)
		$n += 1
	EndIf



	While 1
		$aNextFile = _FTP_FindFileNext($h_Handle)

		If @error Then
			ExitLoop
		Else
			ReDim $aArray[$n + 1][3]
			$aArray[$n][0] = $aNextFile[10]
			$aArray[$n][1] = _FTP_FileTimeLoHiToStr($aNextFile[6], $aNextFile[7], 1)
			$aArray[$n][2] = _DateDiff('D', $aArray[$n][1], $NowData)
			GUICtrlCreateListViewItem($aArray[$n][0] & '|' & $aArray[$n][1] & '|' & $aArray[$n][2], $ListView)
			$n += 1

		EndIf

	WEnd

	_FTP_Close($hOpen)


EndFunc   ;==>_FindFile
 
Автор
K

Ksenz44

Новичок
Сообщения
32
Репутация
0
последний код вставляю таким то выдает ошибку
Код:
Dim $aArray[0][3]
Dim $aArray[^ ERROR
 
Автор
K

Ksenz44

Новичок
Сообщения
32
Репутация
0
изменил с 0 на 1 все запустилось прога заработала только количество дней везде 0 в двух местах - 9)
вот по этому у меня нечего не удаляет
Второй скрин с вашего сервера
 

Вложения

  • Безымянный3.png
    Безымянный3.png
    26.1 КБ · Просмотры: 12
  • Безымянный4.png
    Безымянный4.png
    23.3 КБ · Просмотры: 9

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Извините, что сразу не ответил, отбывал 3-х дневный бан :shok:
количество дней везде 0
Так у Вас на сервере дата в формате Год/Число/Месяц , а системную дату получаете в формате Год/Месяц/Число , вот ерунда и получается при сравнении. Исправил в последнем скрипте с GUI.
Код:
_NowCalc() ; Убрать
;поставить 
 @YEAR & "/" & @MDAY & "/" & @MON & " " & @HOUR & ":" & @MIN & ":" & @SEC

Изменил и в первом варианте, без GUI
 
Автор
K

Ksenz44

Новичок
Сообщения
32
Репутация
0
Попробовал исправленный показывает на моём сервере просто 0.
 

Вложения

  • Безымянный.png
    Безымянный.png
    34.6 КБ · Просмотры: 11

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Ах, конечно, в этом случае не будет работать функция
Код:
_DateDiff
, спешил, не подумал :-[ . Нужно под себя переделать дату записи файла на сервере.
Может так ?
Код:
#include <FTPEx.au3>
#include <Date.au3>
#include <Array.au3>
#include <GUIConstants.au3>
#include <GuiListView.au3>


Global $sPassive = "0"
Global $sPort = "21"
Global $sServer = "ftp.csx.cam.ac.uk"
Global $sUserName = ""
Global $sPassword = ""
Global $sDir = "/pub/software/programming/pcre/";Здесь путь к папке, где искать файлы
Global $aArray

Dim $aArray[1][3]






$hMain = GUICreate('Все файлы FTP сервера', 500, 350)
Global $ListView = GUICtrlCreateListView('Имя файла|Дата последнего изменения|Прошло дней', 5, 5, 490, 290)
GUICtrlCreateLabel('Удалить файлы старше ', 10, 310, 175, 25)
GUICtrlSetFont(-1, 12)
$dDay = GUICtrlCreateInput('2', 190, 308, 30, 25)
GUICtrlSetFont(-1, 12)
GUICtrlCreateLabel('дней', 230, 310, 40, 25)
GUICtrlSetFont(-1, 12)
$DelButton = GUICtrlCreateButton('Удалить', 280, 302, 120, 40)
GUICtrlSetFont(-1, 12, 600)
_FindFile()
GUISetState(@SW_SHOW, $hMain)



While 1
	$msg = GUIGetMsg()
	Select
		Case $msg = $GUI_EVENT_CLOSE

			Exit
		Case $msg = $DelButton
			_DelFile()
			_GUICtrlListView_DeleteAllItems($ListView)
			$aArray = 0
			Dim $aArray[0][3]
			_FindFile()
	EndSelect
WEnd


Func _DelFile()

	$hOpen = _FTP_Open('MyFTP Control')
	If @error Then
		MsgBox(16, "Супер FTP клиент", "Не удалось создать сессию! Код ошибки: " & @error & "")
		;GUIDelete ( $hWnd )
		;GuiEnable($hGui)
		;Return SetError(1,0,0)
	EndIf


	$hConn = _FTP_Connect($hOpen, $sServer, $sUserName, $sPassword, $sPassive, $sPort)
	If @error Then
		MsgBox(16, "Супер FTP клиент", "Не удалось подключиться к серверу! Код ошибки: " & @error & "")
	EndIf


	$delta = GUICtrlRead($dDay)
	For $i = 0 To UBound($aArray) - 1
		If _DateDiff('D', $aArray[$i][1], _NowCalc()) > $delta Then
			_FTP_FileDelete($hConn, $sDir & $aArray[$i][0])
		EndIf
	Next


	_FTP_Close($hOpen)

EndFunc   ;==>_DelFile


Func _FindFile()


	$hOpen = _FTP_Open('MyFTP Control')
	If @error Then
		MsgBox(16, "Супер FTP клиент", "Не удалось создать сессию! Код ошибки: " & @error & "")
		;GUIDelete ( $hWnd )
		;GuiEnable($hGui)
		;Return SetError(1,0,0)
	EndIf


	$hConn = _FTP_Connect($hOpen, $sServer, $sUserName, $sPassword, $sPassive, $sPort)
	If @error Then
		MsgBox(16, "Супер FTP клиент", "Не удалось подключиться к серверу! Код ошибки: " & @error & "")
	EndIf



	$n = 0

	Local $h_Handle
	Local $aFile = _FTP_FindFileFirst($hConn, $sDir, $h_Handle)
	If Not @error Then
			$FileData=StringSplit(_FTP_FileTimeLoHiToStr($aFile[6], $aFile[7], 1),' ')
			$Data=StringSplit($FileData[1],'/')
		ReDim $aArray[$n + 1][3]
		$aArray[$n][0] = $aFile[10]
		$aArray[$n][1] =  $Data[1]&'/'&$Data[3]&'/'&$Data[2]&' '&$FileData[2]
		$aArray[$n][2] = _DateDiff('D', $aArray[$n][1], _NowCalc())
		GUICtrlCreateListViewItem($aArray[$n][0] & '|' & $aArray[$n][1] & '|' & $aArray[$n][2], $ListView)
		$n += 1
	EndIf



	While 1
		$aNextFile = _FTP_FindFileNext($h_Handle)

		If @error Then
			ExitLoop
		Else
			$FileData=StringSplit(_FTP_FileTimeLoHiToStr($aNextFile[6], $aNextFile[7], 1),' ')
			$Data=StringSplit($FileData[1],'/')
			ReDim $aArray[$n + 1][3]
			$aArray[$n][0] = $aNextFile[10]
			$aArray[$n][1] = $Data[1]&'/'&$Data[3]&'/'&$Data[2]&' '&$FileData[2]
			$aArray[$n][2] = _DateDiff('D', $aArray[$n][1], _NowCalc())
			GUICtrlCreateListViewItem($aArray[$n][0] & '|' & $aArray[$n][1] & '|' & $aArray[$n][2], $ListView)
			$n += 1

		EndIf

	WEnd

	_FTP_Close($hOpen)


EndFunc   ;==>_FindFile
 
Автор
K

Ksenz44

Новичок
Сообщения
32
Репутация
0
ra4o :laugh: :laugh: :laugh: :laugh: :laugh: работает ааа)спс спс спс)
Ещё вопрос реально сделать чтоб он это делал рекурсивно по папкам на сервере?
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Конечно, возможно, только нужно уточнить : Вы имеете в виду, что сейчас скрипт работает с одной папкой, путь к которой указан в переменной $sDir , а нужно искать в нескольких папках или перебирать все вложенные папки ?
 
Автор
K

Ksenz44

Новичок
Сообщения
32
Репутация
0
Перебирать все папки на сервере в определённой папке и из них удалять.
 
Автор
K

Ksenz44

Новичок
Сообщения
32
Репутация
0
Ну работать должно лучше без) ну уровень вложения /ftp_shares/Backup1c/BackUpSQL/ в этой папке папок 10 и уже в них лежат файлы. надо чтоб он по этим 10 папкам пробежался и удалил в них файлы, внутри папок папок нет)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Вот пример на эту тему.
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Без GUI , переписал всё по-другому
Код:
#include <FTPEx.au3>
#include <Date.au3>
#include <Array.au3>

Local $sPassive = "0"
Local $sPort = "21"
Local $sServer = "ftp.csx.cam.ac.uk"
Local $sUserName = ""
Local $sPassword = ""
Local $delta = "2" ; кол-во дней, старше которых удаляем.
Local $sDir = "/pub/software/";Здесь путь к папке, где искать файлы

Local $hOpen = _FTP_Open('MyFTP Control')
If @error Then
	MsgBox(16, "Супер FTP клиент", "Не удалось создать сессию! Код ошибки: " & @error & "")
	Exit
EndIf

Local $hConn = _FTP_Connect($hOpen, $sServer, $sUserName, $sPassword, $sPassive, $sPort)
If @error Then
	MsgBox(16, "Супер FTP клиент", "Не удалось подключиться к серверу! Код ошибки: " & @error & "")
	Local $Ftpc = _FTP_Close($hOpen)
	Exit
EndIf



_FTP_DirSetCurrent($hConn, $sDir)
If @error Then
	MsgBox(16, "Супер FTP клиент", "Не удалось установить" & _
			"текущий каталог на FTP сервере." & @CRLF & "в каталоге " & $sDir & @CRLF & " Код ошибки: " & @error & "")
	Local $Ftpc = _FTP_Close($hOpen)
	Exit
EndIf

Local $aFolder = _FTP_ListToArray($hConn, 1);Получение названия всех папок по пути $sDir
_ArrayDisplay($aFolder, "Каталоги в " & $sDir)
For $i = 1 To $aFolder[0];Перебор всех папок
	_FTP_DirSetCurrent($hConn, $sDir & $aFolder[$i]);Устанавка текущего каталога
	If @error Then
		MsgBox(16, "Супер FTP клиент", "Не удалось установить" & "текущий каталог на FTP сервере." & @CRLF & "в каталоге " & $sDir & $aFolder[$i] & @CRLF & " Код ошибки: " & @error & "")
		Local $Ftpc = _FTP_Close($hOpen)
		Exit
	EndIf

	Local $aFile = _FTP_ListToArrayEx($hConn, 2);Получение данных по файлам в текущей папке
	If IsArray($aFile) Then
		_ArrayDisplay($aFile, "Файлы в " & $sDir & $aFolder[$i])
		For $y = 1 To $aFile[0][0]
			$FileData = StringSplit($aFile[$y][3], ' ')
			$Data = StringSplit($FileData[1], '/')
			$NewFileData = $Data[1] & '/' & $Data[3] & '/' & $Data[2] & ' ' & $FileData[2];Замена местами дня с месяцем изменения файла
			If _DateDiff('D', $NewFileData, _NowCalc()) > $delta Then;Удаление файла,еси дата изменения > $delta
				_FTP_FileDelete($hConn, $sDir & $aFolder[$i] & '/' & $aFile[$y][0])
				If @error Then
					MsgBox(16, "Супер FTP клиент", "Ошибка удаления файла " & @CRLF & $sDir & $aFolder[$i] & '/' & $aFile[$y][0] & "" & @CRLF & "Код ошибки: " & @error & "")
				EndIf

			EndIf
		Next;Сдедующий файл в текущей папке
	EndIf
Next;Следующая папка в $sDir

Local $Ftpc = _FTP_Close($hOpen)
 
Автор
K

Ksenz44

Новичок
Сообщения
32
Репутация
0
Попробовал последний код сначала пытался сделать в одной папке без папок не отработал)потом как говорил в папке с папками выдал ошибку
Код:
>"C:\Users\Stas.TRADE\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "D:\Script\Удаление c Ftp.au3"    
D:\Script\???????? c Ftp.au3 (35) : ==> Subscript used with non-Array variable.:
For $y = 1 To $aFile[0][0]
For $y = 1 To $aFile^ ERROR
>Exit code: 1    Time: 20.342
 
Верх