Вы когда-нибудь были в ситуации, когда вам нужно переименовать кучу файлов, которые находятся повсюду? Или вы были в ситуации, когда вы хотите скопировать файлы выборочно, но они находятся вместе с некоторыми другими файлами, и вы не можете просто выбрать все файлы?
В нашей жизни или на работе нам может понадобиться выполнять такие утомительные задачи, которые отнимают много времени, и лучше всего автоматизировать эти рутинные работы с помощью строк кода.
В этой статье я рассказал о том, как мы можем создать инструмент для переименования файлов на основе CLI с помощью Golang, и в этой статье мы дополнительно расширим функциональные возможности, чтобы копировать, перемещать и сжимать файлы и в в то же время мы рассмотрим, как стандартная библиотека Golang может помочь нам достичь того, чего мы хотим.
Функция копирования
Для функции копирования нам нужен исходный путь, в котором находится исходный файл, и целевой путь. Обратите внимание, что если по целевому пути есть существующий файл, существующий файл будет заменен.
- Строка 7:
os.Open()
открывает файл для чтения по указанному пути - Строка 15:
os.Stat()
Проверить, существует ли папка назначения, и если она не существует, она войдет в циклif
- Строка 16:
os.MkdirAll()
создает каталог, включая все необходимые родительские каталоги.os.ModePerm
— это файловый режим и разрешение для каталога, эквивалентноеChmod 777
. - Строка 21:
os.Create()
создает файл по указанному пути. Если файл существует по пути, он будет усечен - Строка 27:
io.Copy()
копирует файл из источника в место назначения, пока не будет достигнут EOF в исходном файле.
Функция перемещения
Подобно функции копирования, мы проверим, существует ли целевой каталог, и если это не так, мы создадим целевой каталог вместе с его родительскими каталогами (при необходимости).
- Строка 14:
os.Rename()
переименовывает весь путь к исходному файлу, что фактически перемещает файл в новое место.
Функция сжатия
Существует ZIP-пакет archive/zip
, обеспечивающий поддержку чтения и записи ZIP-архивов. В следующем коде мы передадим имя ZIP-файла, а также файлы, которые должны быть заархивированы.
- Строка 9:
os.Create()
создает файл с заданным именем, которое мы передаем - Строка 15:
zip.NewWriter()
создает экземпляр модуля записи zip-файла. - Строка 19–23: поскольку папка может быть входом, который вводит пользователь, нам нужно изменить текущий рабочий каталог на указанную папку через
os.Chdir()
. Затем мы возвращаем корневой путь, соответствующий текущему рабочему каталогу вos.Getwd()
. - Строка 29–34: Перебирая каждый файл, мы используем
filepath.Rel()
, чтобы получить путь к файлу относительно базового пути, это делается для того, чтобы мы могли сохранить структуру файлов, когда позже захотим поместить их в zip-архив. Затем с помощью относительного пути мы формируем путь вfilepath.Join()
- Строка 35: После формирования пути вызываем функцию
addFileToArchive()
для помещения файлов в zip - Строка 59:
fileToZip.Stat()
возвращает структуруFileInfo
, описывающую файл. - Строка 64–70: с помощью
FileInfo
из строки 59zip.FileInfoHeader()
создает частично заполненныйFileHeader
, который описывает файл в zip-архиве. Указываем название и метод сжатия (deflate) в строке 69 и 70 - Строка 72:
zipWriter.CreateHeader()
добавляет файл в zip и возвращаетwriter
, который будет использоваться для записи содержимого файла. - Строка 76:
os.Copy()
копирует содержимое из источника в файл в формате zip.
Вот и все основные функции инструмента управления файлами. Полный исходный код вы можете посмотреть на https://github.com/wilsontwm/filezy, где я создал инструмент управления файлами на основе CLI.
Спасибо и ура!