Что нового

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

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Хм.. даже при ошибке , судя по мануалам в "$aFile[0][0]" должен быть "0". Добавил проверок на ошибки и отображение всех массивов для контроля. Если всё нормально, просто закоментируйте строки с
Код:
_ArrayDisplay(...)
 
Автор
K

Ksenz44

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

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
добавил проверку, что "$aFile" является массивом.
 
Автор
K

Ksenz44

Новичок
Сообщения
32
Репутация
0
:laugh: :laugh: ай яй яй красава всё как часы) :ok: Тему можно считать решённой)
Хочу предложить еще одну доработку ели будет интересно нужно сделать чтоб она не трогала 1 и последний файл каждого месяца ) ;)
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Ок, попробую. Только уточните - все файлы первых и последних чисел всех месяцев ?
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Добавил проверку не первого и не последнего дня в месяце
Код:
#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
	
		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 And Not _LastDay($Data) And $Data[2] > 1 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)

Func _LastDay($Data)

$MaxDay = _DateDaysInMonth($Data[1], $Data[3])

	If $MaxDay = $Data[2] Then
		Return True
	Else
		Return False
	EndIf

EndFunc   ;==>_LastDay
Только учтите, что проверка выполняется только : если дата не 1 число месяца и не Последнее , то файл удалится.
 
Автор
K

Ksenz44

Новичок
Сообщения
32
Репутация
0
то есть если 1 файл в папке 1 или поладнее чило дальше проверка не пойдёт?
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Нет , я не проверяю какой файл самый ранний и поздний в месяце, например, если 1-го числа не было никаких файлов, а был 2-го, то он удалится , так-же и с последним файлом в месяце, если был файл 30-м числом , а 31-го не было ничего, то он удалится тоже. Надеюсь получилось у меня объяснить :-\
 
Автор
K

Ksenz44

Новичок
Сообщения
32
Репутация
0
А сделать так что б если нет 1 то он брал 2 если второго нет то 3 и так пока не найдет 1 из них и также можно с последним( но не критично)
 

ra4o

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

Ksenz44

Новичок
Сообщения
32
Репутация
0
Если не много перестроить задачу , не трогать первый файл в месяце ,без разнице какова он числа . Если просто в момент перебора файлов по дням (старше определённого срока) проверять условие пока не найдёт ранее число .
 

ra4o

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

Ksenz44

Новичок
Сообщения
32
Репутация
0
а если как варинт создать папку и скидывать их туда первые файлы за каждый месяц ( папочки создать в каждой папке) так я думаю проще будет и эту папку не проверять
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Я что-то постараюсь придумать, только быстро не обещаю, сейчас завал на работе, а вечером уже не соображаю особо :stars:
 
Автор
K

Ksenz44

Новичок
Сообщения
32
Репутация
0
ra4o доброго времени суток ну что не че интересного не придумали? :smile:
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Пробуйте этот вариант
Код:
#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);Получение данных по файлам в текущей папке
	_ArrayDisplay($aFile,'Файлы в '&$sDir & $aFolder[$i])
    If IsArray($aFile) Then

        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 And Not _LastDay($Data,$y,$aFile) And Not _FirstDay($Data,$y,$aFile) 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)

Func _LastDay($Data,$Poz,$FileArray)

			$FileYear=$Data[1]
			$FileMonth=$Data[3]
			$FileDay=$Data[2]
$MaxDay = _DateDaysInMonth($Data[1], $Data[3])

    If $MaxDay = $Data[2] Then
        Return True
    Else
      For $j=0 to UBound($FileArray)-1
		  If $j<>$Poz Then
            $NextFileData = StringSplit($FileArray[$j][3], ' ')
            $NextData = StringSplit($FileData[1], '/')
			$NextFileYear=$NextData[1]
			$NextFileMonth=$NextData[3]
			$NextFileDay=$NextData[2]
			  if $NextFileYear=$FileYear and $NextFileMonth=$FileMonth and $NextFileDay>$FileDay Then Return False

		  EndIf
      Next
        Return True
    EndIf

EndFunc   ;==>_LastDay

Func _FirstDay($Data,$Poz,$FileArray)

			$FileYear=$Data[1]
			$FileMonth=$Data[3]
			$FileDay=$Data[2]


    If $FileDay = 1 Then
        Return True
    Else
      For $j=0 to UBound($FileArray)-1
		  If $j<>$Poz Then
            $NextFileData = StringSplit($FileArray[$j][3], ' ')
            $NextData = StringSplit($FileData[1], '/')
			$NextFileYear=$NextData[1]
			$NextFileMonth=$NextData[3]
			$NextFileDay=$NextData[2]
			  if $NextFileYear=$FileYear and $NextFileMonth=$FileMonth and $NextFileDay<$FileDay Then Return False

		  EndIf
      Next
        Return True
    EndIf

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

Ksenz44

Новичок
Сообщения
32
Репутация
0
С наступающим новым годом! Шас смог проверить последнюю вашу корректировку не работает нашел помарку.
Код:
if $NextFileYear=$FileYear and $NextFileMonth=$FileMonth and $NextFileDay>$FileDay Then False True

поправил на
Код:
if $NextFileYear=$FileYear and $NextFileMonth=$FileMonth and $NextFileDay>$FileDay Then Return False

не знаю правильно ли.
и во вторых не работает опять как понял я даты )
 

Вложения

  • Безымянный6.png
    Безымянный6.png
    31.4 КБ · Просмотры: 10

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Да, верно поправили, изменил ещё недочёты , пробуйте.
 
Автор
K

Ksenz44

Новичок
Сообщения
32
Репутация
0
Доброго времени суток нашел недочет во втором массиве не поставлено $ перед j , и он не отрабатывает все папки проверяет выдает каждую но я так понимаю не правильно дата и не удаляет просто по ним пробегается. ошибок не выдает.
 

Вложения

  • 1.png
    1.png
    31.3 КБ · Просмотры: 7
Верх