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

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

В этой статье я рассказал о том, как мы можем создать инструмент для переименования файлов на основе CLI с помощью Golang, и в этой статье мы дополнительно расширим функциональные возможности, чтобы копировать, перемещать и сжимать файлы и в в то же время мы рассмотрим, как стандартная библиотека Golang может помочь нам достичь того, чего мы хотим.

Функция копирования

Для функции копирования нам нужен исходный путь, в котором находится исходный файл, и целевой путь. Обратите внимание, что если по целевому пути есть существующий файл, существующий файл будет заменен.

  1. Строка 7: os.Open() открывает файл для чтения по указанному пути
  2. Строка 15: os.Stat()Проверить, существует ли папка назначения, и если она не существует, она войдет в цикл if
  3. Строка 16: os.MkdirAll()создает каталог, включая все необходимые родительские каталоги. os.ModePerm — это файловый режим и разрешение для каталога, эквивалентное Chmod 777.
  4. Строка 21: os.Create() создает файл по указанному пути. Если файл существует по пути, он будет усечен
  5. Строка 27: io.Copy() копирует файл из источника в место назначения, пока не будет достигнут EOF в исходном файле.

Функция перемещения

Подобно функции копирования, мы проверим, существует ли целевой каталог, и если это не так, мы создадим целевой каталог вместе с его родительскими каталогами (при необходимости).

  1. Строка 14: os.Rename() переименовывает весь путь к исходному файлу, что фактически перемещает файл в новое место.

Функция сжатия

Существует ZIP-пакет archive/zip, обеспечивающий поддержку чтения и записи ZIP-архивов. В следующем коде мы передадим имя ZIP-файла, а также файлы, которые должны быть заархивированы.

  1. Строка 9: os.Create() создает файл с заданным именем, которое мы передаем
  2. Строка 15: zip.NewWriter() создает экземпляр модуля записи zip-файла.
  3. Строка 19–23: поскольку папка может быть входом, который вводит пользователь, нам нужно изменить текущий рабочий каталог на указанную папку через os.Chdir(). Затем мы возвращаем корневой путь, соответствующий текущему рабочему каталогу в os.Getwd().
  4. Строка 29–34: Перебирая каждый файл, мы используем filepath.Rel(), чтобы получить путь к файлу относительно базового пути, это делается для того, чтобы мы могли сохранить структуру файлов, когда позже захотим поместить их в zip-архив. Затем с помощью относительного пути мы формируем путь в filepath.Join()
  5. Строка 35: После формирования пути вызываем функцию addFileToArchive() для помещения файлов в zip
  6. Строка 59: fileToZip.Stat() возвращает структуру FileInfo, описывающую файл.
  7. Строка 64–70: с помощью FileInfo из строки 59 zip.FileInfoHeader() создает частично заполненный FileHeader, который описывает файл в zip-архиве. Указываем название и метод сжатия (deflate) в строке 69 и 70
  8. Строка 72: zipWriter.CreateHeader() добавляет файл в zip и возвращает writer, который будет использоваться для записи содержимого файла.
  9. Строка 76: os.Copy() копирует содержимое из источника в файл в формате zip.

Вот и все основные функции инструмента управления файлами. Полный исходный код вы можете посмотреть на https://github.com/wilsontwm/filezy, где я создал инструмент управления файлами на основе CLI.

Спасибо и ура!