Главная » Язык программирования C#

Удаление определенных файлов с FTP сервера на C#

В ходе расследования по поводу того, что WordPress генерирует слишком большое количество различных thumbnail(уменьшенных изображений) для каждого изображения, которое вы загружаете на сервер, через интерфейс данной CMS. Так вот эти самые уменьшенные изображения, который как правило вообще не используются в работе вашего сайта, просто занимают место на вашем сервере. В ходе очередной ревизии по настройка CMS и отдельных плагинов для того чтобы они перестали генерировать этот ненужный бред(будет отдельная статья), я решил что пора весь этот мусор вычистить из сервера и освободить его немного. Но для удаления файлов по FTP вручную, особенно если считать что изображений там у меня набралось over 40 тысяч, ушло бы очень много времени и сил. Но благо мы умеем программировать!

Удаляем файлы с FTP сервера

Первым делом нам необходимо скачать вот эти две DLL — файлы для работы с FTP:

https://yadi.sk/d/QlagpSfekErxt

https://yadi.sk/d/N8rkMu1DkErxv

Они судя по всему самописные, но наткнувшись на них один раз, я не стал переучиваться на использование стандартной библиотеки System.Net. Естественно эти dll-ки нужно подсунуть в проект и прицепить к нашему классу. По правде говоря для наших целей хватит и одной из них:

using BytesRoad.Net.Ftp;

Подцепив их, желательно открыть новый класс, где будут хранится данные для подключения к Вашему FTP-серверу:

public static string FtpServer = "адрес ftp сервера";
public static int FtpPort = 21;//может быть другой порт, но 21 - это основной порт для FTP
public static int FtpTimeout;
public static string Username = "ваш логин для ftp подключений";
public static string Password = "пароль";

Остальной код должен вызывать либо сразу после начала программы, либо для удобства по нажатию кнопки, как у меня:

private void button1_Click(object sender, EventArgs e)
{
   int count = 0;
   try
   {
      FtpProxyInfo pinfo = new FtpProxyInfo();
      client.Connect(MainParams.FtpTimeout * 1000, MainParams.FtpServer, MainParams.FtpPort);
      client.Login(MainParams.FtpTimeout * 1000, MainParams.Username, MainParams.Password);
      string path = "www/site.ru/wp-content/uploads/";  // у каждого свой путь!
      foreach (FtpItem i in client.GetDirectoryList(MainParams.FtpTimeout * 1000, path))
      {
         if (i.Name.Contains("-120x178") || i.Name.Contains("-120x144") || i.Name.Contains("-120x138") || i.Name.Contains("-144x144") || i.Name.Contains("-121x178") || i.Name.Contains("-121x138") || i.Name.Contains("-121x144") || i.Name.Contains("-121x172") || i.Name.Contains("-150x150") || i.Name.Contains("-300x125") || i.Name.Contains("-300x188") || i.Name.Contains("-644x320") || i.Name.Contains("-225x300"))
         {
            count++;
            client.DeleteFile(MainParams.FtpTimeout * 1000, path+i.Name);
         }
         if (count > 5000)
            break;
         }
         MessageBox.Show("Удаление окончено!");
      }
      catch (Exception ex)
      {
         MessageBox.Show("Ошибка: " + ex.Message);
      }
}

Далее немного объясню код работы. В первых строчках идет само подключение к FTP серверу и там вам не придется что-либо менять. Начать редактировать нужно с пути на сервере, где лежат ваши изображения. По умолчанию я поставил путь, по которому обычно и хранятся изображения в WordPress.

Далее мы получаем список всех файлов и директорий по этому пути и проверяем имя каждого из них. Так как при генерации изображений WordPress добавляет к их именам такие окончания как 150×150 или 121×178(у каждого они могут быть различны, в зависимости от настроек системы), то наши клиенты в своих именах имеют именно такие обозначения, по которым мы и определяем их, после чего удаляем. Список таких вы сможете составить пару раз взглянув на свою папку на FTP сервере.

Так же в коде имеется незначительная переменная count(которую можете вовсе убрать). Её я использовал для тестирования программки(удаляет не удаляет?), которая служит неким ограничителем.

Вот собственно и все! Таким довольно несложным образом нам удалось удалить определенные файлы с FTP сервера, используя язык программирования C#.

UPDATE: Все таки на практике было решено, что использование заранее заданных масок уменьшенных изображений, вида

-644x320

хоть и является довольно простым, не оказывается не столь удобным на практике. Все же лучше употреблять в коде регулярные выражения. Посему код был несколько переписан и ниже я приведу его вам.

private void button1_Click(object sender, EventArgs e)
{
   int count = 0;
   try
   {
      FtpProxyInfo pinfo = new FtpProxyInfo();
      client.Connect(MainParams.FtpTimeout * 1000, MainParams.FtpServer, MainParams.FtpPort);
      client.Login(MainParams.FtpTimeout * 1000, MainParams.Username, MainParams.Password);
      string path = "www/about-windows.ru/wp-content/uploads/2015/11/";
      foreach (FtpItem i in client.GetDirectoryList(MainParams.FtpTimeout * 1000, path))
      {
         string pat = @"(.*?)-(\d\d\d)x(\d\d\d).(.*?)";
         Regex regex = new Regex(pat);
         Match match = regex.Match(i.Name);
         while (match.Success)
         {
            count++;
            if (match.Groups[2].Value != "150" && match.Groups[3].Value != "150")
            {
               client.DeleteFile(MainParams.FtpTimeout * 1000, path + i.Name);
            }
            match = match.NextMatch();
         }

         string pat1 = @"(.*?)-(\d\d)x(\d\d).(.*?)";
         Regex regex1 = new Regex(pat1);
         Match match1 = regex1.Match(i.Name);
         while (match1.Success)
         {
            count++;
            client.DeleteFile(MainParams.FtpTimeout * 1000, path + i.Name);
            match1 = match1.NextMatch();
         }

         if (count > 1000)
         break;
      }
      MessageBox.Show("все " +Convert.ToString(count));
   }
   catch (Exception ex)
   {
      MessageBox.Show("Ошибка: " + ex.Message);
   }
}

Если кратко по коду, то метод находит все уменьшенные изображения в размере вида YYxYY и YYYxYYY(пишу и понимаю что можно еще ввести размеры YYYxYY) и удаляет их. Лично для себя я оставил уменьшенные изображения размера 150х150, которые используются одним из плагинов.

Добавить комментарий

Ваш комментарий появится после модерации.