Golang существует ли файл

Обновлено: 04.07.2024

Есть ли встроенная функция для этого на языке go? Я погуглил, но безуспешно.

Я мог бы использовать некоторую хеш-функцию в пакете hash/crc32 , но это больше работы, чем приведенный выше код Python.

Я не уверен, что эта функция делает то, что вы думаете. Из документов,

Если не задано значение shallow и значение false, файлы с идентичными подписями os.stat () считаются равными.

Ваш вызов сравнивает только подпись >, который включает только:

  1. Файловый режим
  2. Измененное время
  3. Размер

Вы можете изучить все три вещи в Go с помощью функции os.Stat . Это действительно только означало бы, что это буквально один и тот же файл, или символические ссылки на один и тот же файл, или копию этого файла.

Если вы хотите углубиться, вы можете открыть оба файла и сравнить их (версия python читает 8 КБ за раз).

Как насчет использования bytes.Equal ?

Чтобы завершить ответ @captncraig, если вы хотите узнать, являются ли два файла одинаковыми, вы можете использовать SameFile ( fi1, fi2 FileInfo) из пакета ОС.

SameFile сообщает, описывают ли fi1 и fi2 один и тот же файл. Например, в Unix это означает, что поля устройства и inode двух нижележащих структур идентичны;

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

Пример:

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

Эта реализация предполагает, что вызов Read () не вернет N> 0 (прочитано несколько байтов) одновременно с ошибкой! = Nil. Так ведет себя os.File, но не так, как могут вести себя другие реализации Read, такие как net.TCPConn.

os.SameFile должен примерно делать то же самое, что и Python filecmp.cmp(f1, f2) (т.е. shallow=true , то есть сравнивать только информацию о файлах, полученную с помощью stat).

func SameFile(fi1, fi2 FileInfo) bool

SameFile сообщает, описывают ли fi1 и fi2 один и тот же файл. Например, в Unix это означает, что поля устройства и inode двух нижележащих структур идентичны; в других системах решение может быть основано на именах путей. SameFile применяется только к результатам, возвращаемым статом этого пакета. В остальных случаях возвращает false.

Но если вы действительно хотите сравнить содержимое файла, вам придется сделать это самостоятельно.

Go не имеет функции, предназначенной только для проверки наличия файла или нет (например, Python os.path.exists ). Что такое идиоматический способ сделать это?

Чтобы проверить, не существует ли файл, эквивалентный Python, if not os.path.exists(filename) :

Чтобы проверить, существует ли файл, эквивалентный Python, if os.path.exists(filename) :

Отредактировано: за последние комментарии

Ответа на этот вопрос Caleb Spare в gonuts.

ответил(а) 2014-03-18T17:54:00+04:00 7 лет, 8 месяцев назад

Вы должны использовать функции os.Stat() и os.IsNotExist() как в следующем примере:

Пример user11617 неверен; он сообщит, что файл существует даже в тех случаях, когда его нет, но произошла ошибка какого-либо другого рода.

Подпись должна быть Exists (string) (bool, error). И тогда, как это бывает, сайты вызовов не лучше.

Код, который он написал, будет лучше:

Но я предлагаю это вместо:

ответил(а) 2014-03-18T02:19:00+04:00 7 лет, 8 месяцев назад ответил(а) 2017-06-29T05:58:00+03:00 4 года, 4 месяца назад ответил(а) 2017-12-11T08:51:00+03:00 3 года, 11 месяцев назад

Давайте сначала рассмотрим несколько аспектов: обе функции, предоставляемые пакетом os golang - это не утилиты, а средства проверки ошибок. golang этим я подразумеваю, что они являются просто оболочкой для обработки ошибок на кроссплатформенной платформе.

Таким образом, в основном, если os.Stat если эта функция не os.Stat никакой ошибки, что означает, что файл существует, если вам нужно проверить, какая это ошибка, здесь используются две эти функции: os.IsNotExist и os.IsExist ,

Это может быть понято как Stat ошибки выброса файла, потому что это не существует, или это ошибка выброса, потому что это существует, и есть некоторая проблема с этим.

Параметр, который принимают эти функции, имеет тип error , хотя вы можете передать ему nil но это не имеет смысла.

Это также указывает на тот факт, что IsExist is not same as !IsNotExist , это две разные вещи.

Так что теперь, если вы хотите знать, существует ли данный файл в go, я бы предпочел лучший способ:


Чтение с диска и запись на диск, а также перемещение по файловой системе — это основной элемент в любом языке. Узнаем, как все это делать в Go с помощью пакета os, который позволяет взаимодействовать с функциональностью операционной системы.

Создание и открытие файлов

Создание файлов происходит с помощью os.Create , а открытие — с помощью os.Open . И там и там принимается путь к файлу и возвращается структура File , а в случае неуспеха — ошибка с nil .

Когда os.Create вызывается в существующем файле, он этот файл обрезает: данные файла стираются. В то же время вызов os.Open в несуществующем файле приводит к ошибке.

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

После взаимодействия с возвращенным файлом закрываем его с помощью File.Close .

Чтение файлов

Один из способов обработки файла — прочитать сразу все содержащиеся в нем данные. Делается это с использованием os.ReadFile . Вводимые данные — это путь к файлу, а выходные данные — это байтовый массив данных файла и ошибка в случае неуспеха.

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

Имейте в виду, что os.ReadFile прочитает весь файл и загрузит его данные в память. И чем больше файл, тем больший объем памяти будет потребляться при использовании os.ReadFile .

Эффективный с точки зрения потребления памяти подход связан с пофрагментной обработкой файла, осуществляемой с помощью os.Open .

После открытия файла происходит многократный вызов File.Read до EOF (конца файла).

File.Read принимает байтовый массив b и загружает до len(b) байтов из файла в b . А затем возвращает количество прочитанных байтов bytesRead и ошибку, если что-то пойдет не так. При bytesRead равным 0 нажимаем EOF и заканчиваем обработку файла.

В приведенном выше коде из файла загружается максимум 10 байтов. Они обрабатываются, и этот процесс повторяется до EOF (конца файла).

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

Запись и добавление в файлы

Для записи байтов в файл существует аналогичная os.ReadFile функция os.WriteFile .

Что следует учесть при использовании os.WriteFile :

  • Обязательно преобразуйте данные для записи в []byte , прежде чем передавать их в os.WriteFile .
  • Биты полномочий необходимы для создания файла, если он еще не существует. Но на них заострять внимание не стоит.
  • Если путь к файлу уже существует, os.WriteFile переопределит исходные данные в файле с помощью новых записываемых данных.

os.WriteFile хорош для создания нового файла или его переопределения. Но он не работает, когда нужно сделать добавление к имеющемуся содержимому файла. Для добавления в файл нужно задействовать os.OpenFile .

Согласно документации, os.OpenFile — это более обобщенная версия os.Open и os.Create . И os.Create , и os.Open внутренне вызывают его.

Кроме пути к файлу, os.OpenFile принимает флаги int и perm (биты полномочий) и возвращает структуру File . Для выполнения таких операций, как чтение и запись, в os.OpenFile должна быть указана правильная комбинация флагов .

O_APPEND и O_WRONLY объединяют с побитовым ИЛИ и передают в os.OpenFile для получения структуры File . После этого при вызове File.Write с любыми передаваемыми данными эти данные будут добавлены в конец файла.

Удаление файлов

os.Remove принимает путь к файлу или пустому каталогу и удаляет этот файл/каталог. Если файл не существует, будет возвращена ошибка с nil .

Освоив основы работы с файлами, перейдем теперь к каталогам.

Создание каталогов

Для создания нового каталога используется os.Mkdir . Эта функция принимает имя каталога и биты полномочий, и так создается новый каталог. Если os.Mkdir не создаст каталог, будет возвращена ошибка с nil .

В некоторых ситуациях бывают нужны временные каталоги, которые существуют только во время выполнения программы. Для создания таких каталогов используется os.MkdirTemp .

os.MkdirTemp снабжает создаваемые временные каталоги уникальными именами, даже когда происходят вызовы от нескольких горутин или программ (источник). Закончив работу с временным каталогом, обязательно удалите вместе с его содержимым с помощью os.RemoveAll .

Чтение каталогов и перемещение по ним

Сначала с помощью os.Getwd получим текущий рабочий каталог:

В добавок к изменению рабочего каталога у нас есть возможность получить дочерний каталог. Делается это с помощью os.ReadDir . Эта функция принимает путь к каталогу и возвращает массив структур DirEntry и ошибку c nil в случае неуспеха.

Вот пример использования:

Пройдемся по каталогу

filepath.WalkDir принимает каталог root , из которого мы стартуем, и функцию обратного вызова fn следующего типа:

fn будет вызываться в каждом файле и подкаталоге каталога root . Вот пример подсчета всех файлов в корневом каталоге:

Как проверить наличие файла или каталога в R, Python и Bash?

Для этого примера мы создали файл myfile.txt и каталог my_test_folder .

Как проверить наличие файла?

Наличие файла легко проверить с помощью команды file.exists() из базового пакета. Посмотрите следующий пример:

Попробуем теперь с файлом, которого не существует:

Обратите внимание, что выражение if not file exists записывается также и с добавлением ! внутри оператора if вот таким образом:

Кроме того, при необходимости создать пустой файл выполняется такая команда:

Как проверить наличие каталога?

По аналогии с проверкой наличия файла, при которой используется file.exists() , наличие каталогов проверяется с помощью команды dir.exists() . Например:

Теперь выполним следующее упражнение. Проверим, есть ли каталог. Если его нет, создадим новый:

Папка my_new_folder создается в нашем рабочем каталоге.

Проверка наличия файла или каталога в Python

Для этого примера опять же используем файл myfile.txt и каталог my_test_folder .

Как проверить наличие файла?

Здесь мы будем работать с модулем os :

Кроме того, здесь задействуется модуль pathlib :

В Python есть возможность создать пустой файл с помощью команды with open(filename.txt, 'w') . Например:

При открытии файла помните о следующих режимах:

Как проверить наличие каталога?

Это, опять же, аналогично проверке наличия файла:

Каталог создается следующим образом:

Чтобы проверить, существует ли объект Path независимо или является файлом/каталогом, используется exists() :

Или с помощью модуля os :

Проверка наличия файла или каталога в Bash

Как проверить наличие файла?

Для этого примера снова используем файл myfile.txt и каталог my_test_folder . Здесь мы будем работать с флагом -f , с помощью которого проверяется наличие обычного файла, а не каталога.

Задействуем скрипт mycheck.sh , который выглядит следующим образом:


Как и ожидалось, файл существует. Теперь при необходимости создать пустой скрипт выполняется такая команда:

Как проверить наличие каталога?

Здесь используем флаг -d . Задействуем скрипт dircheck.sh :


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

Отметим также, что выражение if not содержит символ ! :

И в завершение приведем перечень необходимых флагов для проверки файлов и каталогов в Bash:

Golang, широко известный как Go, - это процедурный язык программирования, разработанный Google в 2009 году как язык программирования с открытым исходным кодом.

Язык основан на языке программирования C. Такие крупные компании, как IBM, Twitter, Facebook, Youtube и BBC, уже активно используют этот язык. Сейчас программист Golang один из самых популярных запросов на найм.

  • Язык имеет простой синтаксис и структуру, что облегчает его изучение для начинающих.
  • Компилируется очень быстро, что экономит время и деньги.
  • Он не зависит от платформы и без проблем работает на разных платформах, таких как Windows, UNIX, LINUX.
  • Он является параллельным, и несколько процессов могут легко работать вместе.
  • Не существует средства ручного управления памятью, которое могло бы создать проблемы при сборке мусора и приостановить процесс программирования.
  • Поскольку язык относительно новый, многие библиотеки по-прежнему недоступны для пользователей.
  • Обработка ошибок в языке неэффективна.
  • Безопасность языка во время выполнения не гарантируется.

Как добавить строку в существующий файл в Golang?
Чтобы добавить строку в файл в Golang, необходимо использовать функцию OpenFile . Эта функция имеет функцию os.O_APPEND, которая помогает открыть файл в режиме добавления. Это делает файл готовым к добавлению. Функция WriteString используется для добавления строки текста в конец файла.

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

Что такое структура в Go?
Структуры - это определяемые пользователем типы, представляющие собой набор именованных полей или свойств. Он используется для группировки похожих полей. Обычно они применяются для представления сущностей реального мира, содержащих набор свойств.

Каков контекст Голанга?
Контекст - это пакет в Golang, который используется для определения типа контекста. Этот тип используется для передачи сигналов отмены, значений области действия и крайних сроков запроса. Запросы, которые принимаются сервером, должны создавать контекст, а исходящие вызовы должны приниматься контекстом.

Что такое Flag на Голанге?
У Golang есть пакет Flag, который используется для базового анализа флагов командной строки. Объявления флагов доступны для целых, строковых и логических значений. Это аргумент, передаваемый программе Go. Они определяются с помощью flag.String (), int () и Bool ().

Как получить ввод от пользователя в Golang?
Чтобы получить ввод пользователя в Golang, необходимо импортировать библиотеку fmt . В этой библиотеке есть функция под названием scanf, которая будет использоваться для чтения ввода с консоли. Новый читатель может быть создан с помощью функции bufio.NewReader (os.Stdin), и пользователю может быть предоставлен текст подсказки. Для получения данных можно использовать функцию ReadString в библиотеке fmt .

Как отлаживать Golang?
Go Окунитесь Debugger можно использовать для отладки кода в Golang, который является продолжением визуального кодекса.

Что такое руна Golang?
Руна - это конечная точка Unicode, которая в основном является литералом для 32-битных целых чисел. Их можно изменить, если они являются нетипизированными константами.
Он может представлять собой следующее:
Целочисленное значение от 0 до 2 ^ 32-1 .
Характер.
Ключевое слово руны типа Голанг. Это псевдоним типа int32 .

Объясните разницу между переключением и выбором в Golang?
Ключевое слово switch используется вместе с конкретными типами данных. Они используются, когда дела имеют одно значение, которое передается в одной строке с ключевым словом Switch. Ключевое слово select выберет несколько вариантов случайным образом. Для каждого случая выборка может использовать несвязанные инструкции.

Какую сборку мусора использует Golang?
Сборщик мусора Go основан на трехцветной метке и алгоритме очистки. Этот алгоритм позволяет Go собирать мусор во время выполнения программы и запускаться одновременно. Это снижает вероятность остановки во время выполнения программы. Если есть какие-либо проблемы с планировщиком, его можно настроить для запуска сборки мусора в течение коротких периодов времени.

Почему у Golang есть указатели?
В Golang нельзя переназначить ссылки, но можно назначить указатели. Поэтому там, где нельзя использовать ссылки, используются указатели. Они также помогают программистам повысить эффективность памяти, контролируя структуру памяти. Пользователь также может создать распределитель пула, используя эти указатели.

Какие лучшие IDE для Golang?
Лучшими IDE для Golang являются Gogland, Visual Studio Code, Atom, Eclipse и Sublime Text .

Что такое рекурсия в Golang?
Рекурсия в Golang - это процесс многократного повторения одного и того же кода или инструкций с помощью функции. В этом процессе функция написана таким образом, что она может вызывать себя несколько раз, пока достигается желаемый результат. Такие программы, как поиск факториала числа и печать ряда Фибоначчи, являются типичными примерами использования рекурсии.

Что такое GOROOT и GOPATH?
GOPATH является переменной средой , которая используется для перечисления мест для поиска для Go кода. Он определяет каталоги, которые находятся за пределами GOROOT и имеют исходный код. GOROOT является переменной среды , которая определяет каталог , в котором установлен Golang.

Что такое FMT Golang?
Fmt в Golang - это пакет, который используется для обработки ввода, полученного от пользователя. Он имеет функции для приема данных и может отображать их в другом месте. У него есть такие функции, как Printf, Println, Scanf и т. д. У него есть шаблоны формата, чтобы предоставить пользователю некоторые подсказки о тексте, который они должны ввести.

Надеемся, что данные вопросы смогут вам помочь в собеседовании и найти программиста для вашего проекта быстро! Дополнительно рекомендуем к прочтению статью Что такое оценка компетенций - все, что вам нужно знать, где собраны основные поинты для оценки сотрудников и соискателей.

Читайте также: