Содержание

1С:Предприятие — работа с файлами

Программа «1С:Предприятие — Работа с файлами» представляет собой отдельный программный продукт, который распространяется бесплатно. Она предназначена для просмотра и редактирования файлов 1С:Предприятия на тех компьютерах, где система 1С:Предприятие не установлена.

Поддерживаются следующие форматы файлов:

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

Работа с файлами в этой программе полностью аналогична работе с файлами в режиме «1С:Предприятие 8» — программа обеспечивает просмотр, редактирование и печать файлов. Также в программе доступны встроенные календарь и калькулятор.

Поддерживается запуск программы из командной строки. При этом существует возможность указать обрабатываемый файл. Например, для обработки файла «Остатки.mxl», достаточно выполнить команду:

«D:\Program Files\1cv82fv\bin\1cv8fv.exe» D:\FileWorkshop\Остатки.mxl

«1С:Предприятие — Работа с файлами» поддерживает режим сравнения файлов, аналогичный режиму, реализованному в системе 1С:Предприятие. Таким образом, например, пользователь может визуально сравнить два отчета об остатках:

1С:Предприятие — работа с файлами

Варианты поставки

Существует два варианта поставки программы 1С:Предприятие — Работа с файлами:

  • русскоязычный;
  • интернациональный.

Отличие интернациональной поставки от русскоязычной заключается в том, что в нее входят дополнительные языки интерфейса, те же самые, которые использует система «1С:Предприятие 8».

Также для интернациональной поставки может использоваться ключ командной строки /L для указания используемого языка интерфейса. Например, для обработки файла «Остатки.mxl» в программе с английским языком интерфейса (en), достаточно выполнить команду:

«D:\Program Files\1cv82fv\bin\1cv8fv.exe» /Len D:\FileWorkshop\Остатки.mxl

Загрузка 1С:Предприятие — Работа с файлами (8.3.17.1386)

Каждый из вариантов поставки программы «1С:Предприятие — Работа с файлами» можно скачать как в виде самораспаковывающегося архива, так и в формате ZIP.


Работа с файлами

Определение 1

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

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

Файл имеет имя и расширение. Имя файла придумывает пользователь. Расширение файла присваивается программой, при помощи которой этот файл создается. По расширению файла определяется формат данных в файле. Файлы могут содержать разнообразные виды и формы представления информации: числа, программы, тексты, рисунки, таблицы, чертежи и т.п. Особенности файлов определяются их форматом.

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

Готовые работы на аналогичную тему

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

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

Рисунок 1.

на панели инструментов.

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

Меню "Представления"

Рисунок 2. Меню «Представления»

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

Поиск файлов

Для автоматизации поиска файлов существует Поле поиска, где можно вписать критерии поиска.

Меню "Представления"

Рисунок 3.

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

Поиск файлов можно осуществлять при помощи фильтра поиска (например, по типу файла).

Копирование и перемещение файлов

Для изменения места хранения файлов на компьютере можно использовать контексное меню или воспользоваться методом перетаскивания.

Контекстное меню

Рисунок 4. Контекстное меню

Для использования метода перетаскивания необходимо открыть две папки, в одной должен находиться исходный файл, а в другую будет происходить перетаскивание. Левой кнопкой мыши файл выделяется и «тащится» в другую.

Контекстное меню

Рисунок 5.

При использовании метода перетаскивания иногда файл или папка копируются, а иногда перемещаются. Если перетаскивание происходит между папками одного жесткого диска, то файлы перемещаются. Таким образом файл останется только в одной папке, копия его не останется в папке из которой файл перетаскивался. Если перетаскивание происходит в папку сети или на съёмный носитель, то элемент файл копируется.

Создание и удаление файлов

Самый простой способ создать новый файл — воспользоваться установленной на компьютере программой. Например, можно создать текстовый документ в программе обработки текста Word Блокнот, либо создать рисунок в программе Paint.

Некоторые программы создают файл при запуске. Например, при запуске редактора WordPad открывается чистая страница. Она представляет собой пустой (и несохраненный) файл.

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

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

Удаляемый файл временно сохраняется в корзине – системной папки (файле). Корзину считают средством безопасности, позволяющей восстановить случайно удаленные файлы и папки.

Открытие существующего файла

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

работа с файловой системой / Блог компании RUVDS.com / Хабр

Сегодня, в девятой части перевода руководства по Node.js, мы поговорим о работе с файлами. В частности, речь пойдёт о модулях fs и path — о файловых дескрипторах, о путях к файлам, о получении информации о файлах, об их чтении и записи, о работе с директориями.

[Советуем почитать] Другие части циклаЧасть 1: Общие сведения и начало работы
Часть 2: JavaScript, V8, некоторые приёмы разработки
Часть 3: Хостинг, REPL, работа с консолью, модули
Часть 4: npm, файлы package.json и package-lock.json
Часть 5: npm и npx
Часть 6: цикл событий, стек вызовов, таймеры
Часть 7: асинхронное программирование
Часть 8: Руководство по Node.js, часть 8: протоколы HTTP и WebSocket
Часть 9: Руководство по Node.js, часть 9: работа с файловой системой
Часть 10: Руководство по Node.js, часть 10: стандартные модули, потоки, базы данных, NODE_ENV
Полная PDF-версия руководства по Node.js

Работа с файловыми дескрипторами в Node.js


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

Дескриптор можно получить, воспользовавшись для открытия файла асинхронным методом open()

из модуля fs:

const fs = require('fs')
fs.open('/Users/flavio/test.txt', 'r', (err, fd) => {
  //fd - это дескриптор файла
})

Обратите внимание на второй параметр, r, использованный при вызове метода fs.open(). Это — флаг, который сообщает системе о том, что файл открывают для чтения. Вот ещё некоторые флаги, которые часто используются при работе с этим и некоторыми другими методами:
  • r+ — открыть файл для чтения и для записи.
  • w+ — открыть файл для чтения и для записи, установив указатель потока в начало файла. Если файл не существует — он создаётся.
  • a — открыть файл для записи, установив указатель потока в конец файла. Если файл не существует — он создаётся.
  • a+ — открыть файл для чтения и записи, установив указатель потока в конец файла. Если файл не существует — он создаётся.

Файлы можно открывать и пользуясь синхронным методом fs.openSync(), который, вместо того, чтобы предоставить дескриптор файла в коллбэке, возвращает его:
const fs = require('fs')
try {
  const fd = fs.openSync('/Users/flavio/test.txt', 'r')
} catch (err) {
  console.error(err)
}

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

Данные о файлах


С каждым файлом связан набор данных о нём, исследовать эти данные можно средствами Node.js. В частности, сделать это можно, используя метод stat() из модуля fs.

Вызывают этот метод, передавая ему путь к файлу, и, после того, как Node.js получит необходимые сведения о файле, он вызовет коллбэк, переданный методу stat(). Вот как это выглядит:

const fs = require('fs')
fs.stat('/Users/flavio/test.txt', (err, stats) => {
  if (err) {
    console.error(err)
    return
  }
  //сведения о файле содержатся в аргументе `stats`
})

В Node.js имеется возможность синхронного получения сведений о файлах. При таком подходе главный поток блокируется до получения свойств файла:
const fs = require('fs')
try {
  const stats = fs.statSync ('/Users/flavio/test.txt')
} catch (err) {
  console.error(err)
}

Информация о файле попадёт в константу stats. Что это за информация? На самом деле, соответствующий объект предоставляет нам большое количество полезных свойств и методов:
  • Методы .isFile() и .isDirectory() позволяют, соответственно, узнать, является ли исследуемый файл обычным файлом или директорией.
  • Метод .isSymbolicLink() позволяет узнать, является ли файл символической ссылкой.
  • Размер файла можно узнать, воспользовавшись свойством .size.

Тут имеются и другие методы, но эти — самые употребимые. Вот как ими пользоваться:
const fs = require('fs')
fs.stat('/Users/flavio/test.txt', (err, stats) => {
  if (err) {
    console.error(err)
    return
  }
  stats.isFile() //true
  stats.isDirectory() //false
  stats.isSymbolicLink() //false
  stats.size //1024000 //= 1MB
})

Пути к файлам в Node.js и модуль path


Путь к файлу — это адрес того места в файловой системе, где он расположен.

В Linux и macOS путь может выглядеть так:

/users/flavio/file.txt

В Windows пути выглядят немного иначе:
C:\users\flavio\file.txt

На различия в форматах записи путей при использовании разных операционных систем следует обращать внимание, учитывая операционную систему, используемую для развёртывания Node.js-сервера.

В Node.js есть стандартный модуль path, предназначенный для работы с путями к файлам. Перед использованием этого модуля в программе его надо подключить:

const path = require('path')

▍Получение информации о пути к файлу


Если у вас есть путь к файлу, то, используя возможности модуля path, вы можете, в удобном для восприятия и дальнейшей обработки виде, узнать подробности об этом пути. Выглядит это так:
const notes = '/users/flavio/notes.txt'
path.dirname(notes) // /users/flavio
path.basename(notes) // notes.txt
path.extname(notes) // .txt

Здесь, в строке notes, хранится путь к файлу. Для разбора пути использованы следующие методы модуля path:
  • dirname() — возвращает родительскую директорию файла.
  • basename() — возвращает имя файла.
  • extname() — возвращает расширение файла.

Узнать имя файла без расширения можно, вызвав метод .basename() и передав ему второй аргумент, представляющий расширение:
path.basename(notes, path.extname(notes)) //notes

▍Работа с путями к файлам


Несколько частей пути можно объединить, используя метод path.join():
const name = 'flavio'
path.join('/', 'users', name, 'notes.txt') //'/users/flavio/notes.txt'

Найти абсолютный путь к файлу на основе относительного пути к нему можно с использованием метода path.resolve():
path.resolve('flavio.txt') 
//'/Users/flavio/flavio.txt' при запуске из моей домашней папки

В данном случае Node.js просто добавляет /flavio.txt к пути, ведущем к текущей рабочей директории. Если при вызове этого метода передать ещё один параметр, представляющий путь к папке, метод использует его в качестве базы для определения абсолютного пути:
path.resolve('tmp', 'flavio.txt')
// '/Users/flavio/tmp/flavio.txt' при запуске из моей домашней папки

Если путь, переданный в качестве первого параметра, начинается с косой черты — это означает, что он представляет собой абсолютный путь.
path.resolve('/etc', 'flavio.txt')
// '/etc/flavio.txt'

Вот ещё один полезный метод — path.normalize(). Он позволяет найти реальный путь к файлу, используя путь, в котором содержатся спецификаторы относительного пути вроде точки (.), двух точек (..), или двух косых черт:
path.normalize('/users/flavio/..//test.txt') 
// /users/test.txt

Методы resolve() и normalize() не проверяют существование директории. Они просто находят путь, основываясь на переданным им данным.

Чтение файлов в Node.js


Самый простой способ чтения файлов в Node.js заключается в использовании метода fs.readFile() с передачей ему пути к файлу и коллбэка, который будет вызван с передачей ему данных файла (или объекта ошибки):
fs.readFile('/Users/flavio/test.txt', (err, data) => {
  if (err) {
    console.error(err)
    return
  }
  console.log(data)
})

Если надо, можно воспользоваться синхронной версией этого метода — fs.readFileSync():
const fs = require('fs')
try {
  const data = fs.readFileSync('/Users/flavio/test.txt')
  console.log(data)
} catch (err) {
  console.error(err)
}

По умолчанию при чтении файлов используется кодировка utf8, но кодировку можно задать и самостоятельно, передав методу соответствующий параметр.

Методы fs.readFile() и fs.readFileSync() считывают в память всё содержимое файла. Это означает, что работа с большими файлами с применением этих методов серьёзно отразится на потреблении памяти вашим приложением и окажет влияние на его производительность. Если с такими файлами нужно работать, лучше всего воспользоваться потоками.

Запись файлов в Node.js


В Node.js легче всего записывать файлы с использованием метода fs.writeFile():
const fs = require('fs')
const content = 'Some content!'
fs.writeFile('/Users/flavio/test.txt', content, (err) => {
  if (err) {
    console.error(err)
    return
  }
  //файл записан успешно
})

Есть и синхронная версия того же метода — fs.writeFileSync():
const fs = require('fs')
const content = 'Some content!'
try {
  const data = fs.writeFileSync('/Users/flavio/test.txt', content)
  //файл записан успешно
} catch (err) {
  console.error(err)
}

Эти методы, по умолчанию, заменяют содержимое существующих файлов. Изменить их стандартное поведение можно, воспользовавшись соответствующим флагом:
fs.writeFile('/Users/flavio/test.txt', content, { flag: 'a+' }, (err) => {})

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

Присоединение данных к файлу


Метод fs.appendFile() (и его синхронную версию — fs.appendFileSync()) удобно использовать для присоединения данных к концу файла:
const content = 'Some content!'
fs.appendFile('file.log', content, (err) => {
  if (err) {
    console.error(err)
    return
  }
  //готово!
})

Об использовании потоков


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

Работа с директориями в Node.js


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

▍Проверка существования папки


Для того чтобы проверить, существует ли директория и может ли Node.js получить к ней доступ, учитывая разрешения, можно использовать метод fs.access().

▍Создание новой папки


Для того чтобы создавать новые папки, можно воспользоваться методами fs.mkdir() и fs.mkdirSync():
const fs = require('fs')
const folderName = '/Users/flavio/test'
try {
  if (!fs.existsSync(dir)){
    fs.mkdirSync(dir)
  }
} catch (err) {
  console.error(err)
}

▍Чтение содержимого папки


Для того чтобы прочесть содержимое папки, можно воспользоваться методами fs.readdir() и fs.readdirSync(). В этом примере осуществляется чтение содержимого папки — то есть — сведений о том, какие файлы и поддиректории в ней имеются, и возврат их относительных путей:
const fs = require('fs')
const path = require('path')
const folderPath = '/Users/flavio'
fs.readdirSync(folderPath)

Вот так можно получить полный путь к файлу:
fs.readdirSync(folderPath).map(fileName => {
  return path.join(folderPath, fileName)
}

Результаты можно отфильтровать для того, чтобы получить только файлы и исключить из вывода директории:
const isFile = fileName => {
  return fs.lstatSync(fileName).isFile()
}
fs.readdirSync(folderPath).map(fileName => {
  return path.join(folderPath, fileName)).filter(isFile)
}

▍Переименование папки


Для переименования папки можно воспользоваться методами fs.rename() и fs.renameSync(). Первый параметр — это текущий путь к папке, второй — новый:
const fs = require('fs')
fs.rename('/Users/flavio', '/Users/roger', (err) => {
  if (err) {
    console.error(err)
    return
  }
  //готово
})

Переименовать папку можно и с помощью синхронного метода fs.renameSync():
const fs = require('fs')
try {
  fs.renameSync('/Users/flavio', '/Users/roger')
} catch (err) {
  console.error(err)
}

▍Удаление папки


Для того чтобы удалить папку, можно воспользоваться методами fs.rmdir() или fs.rmdirSync(). Надо отметить, что удаление папки, в которой что-то есть, задача несколько более сложная, чем удаление пустой папки. Если вам нужно удалять такие папки, воспользуйтесь пакетом fs-extra, который весьма популярен и хорошо поддерживается. Он представляет собой замену модуля fs, расширяющую его возможности.

Метод remove() из пакета fs-extra умеет удалять папки, в которых уже что-то есть.

Установить этот модуль можно так:

npm install fs-extra

Вот пример его использования:
const fs = require('fs-extra')
const folder = '/Users/flavio'
fs.remove(folder, err => {
  console.error(err)
})

Его методами можно пользоваться в виде промисов:
fs.remove(folder).then(() => {
  //готово
}).catch(err => {
  console.error(err)
})

Допустимо и применение конструкции async/await:
async function removeFolder(folder) {
  try {
    await fs.remove(folder)
    //готово
  } catch (err) {
    console.error(err)
  }
}
const folder = '/Users/flavio'
removeFolder(folder)

Модуль fs


Выше мы уже сталкивались с некоторыми методами модуля fs, применяемыми при работе с файловой системой. На самом деле, он содержит ещё много полезного. Напомним, что он не нуждается в установке, для того, чтобы воспользоваться им в программе, его достаточно подключить:
const fs = require('fs')

После этого у вас будет доступ к его методам, среди которых отметим следующие, некоторые из которых вам уже знакомы:
  • fs.access(): проверяет существование файла и возможность доступа к нему с учётом разрешений.
  • fs.appendFile(): присоединяет данные к файлу. Если файл не существует — он будет создан.
  • fs.chmod(): изменяет разрешения для заданного файла. Похожие методы: fs.lchmod(), fs.fchmod().
  • fs.chown(): изменяет владельца и группу для заданного файла. Похожие методы: fs.fchown(), fs.lchown().
  • fs.close(): закрывает дескриптор файла.
  • fs.copyFile(): копирует файл.
  • fs.createReadStream(): создаёт поток чтения файла.
  • fs.createWriteStream(): создаёт поток записи файла.
  • fs.link(): создаёт новую жёсткую ссылку на файл.
  • fs.mkdir(): создаёт новую директорию.
  • fs.mkdtemp(): создаёт временную директорию.
  • fs.open(): открывает файл.
  • fs.readdir(): читает содержимое директории.
  • fs.readFile(): считывает содержимое файла. Похожий метод: fs.read().
  • fs.readlink(): считывает значение символической ссылки.
  • fs.realpath(): разрешает относительный путь к файлу, построенный с использованием символов . и .., в полный путь.
  • fs.rename(): переименовывает файл или папку.
  • fs.rmdir(): удаляет папку.
  • fs.stat(): возвращает сведения о файле. Похожие методы: fs.fstat(), fs.lstat().
  • fs.symlink(): создаёт новую символическую ссылку на файл.
  • fs.truncate(): обрезает файл до заданной длины. Похожий метод: fs.ftruncate().
  • fs.unlink(): удаляет файл или символическую ссылку.
  • fs.unwatchFile(): отключает наблюдение за изменениями файла.
  • fs.utimes(): изменяет временную отметку файла. Похожий метод: fs.futimes().
  • fs.watchFile(): включает наблюдение за изменениями файла. Похожий метод: fs.watch().
  • fs.writeFile(): записывает данные в файл. Похожий метод: fs.write().

Интересной особенностью модуля fs является тот факт, что все его методы, по умолчанию, являются асинхронными, но существуют и их синхронные версии, имена которых получаются путём добавления слова Sync к именам асинхронных методов.

Например:

  • fs.rename()
  • fs.renameSync()
  • fs.write()
  • fs.writeSync()

Использование синхронных методов серьёзно влияет на то, как работает программа.

В Node.js 10 имеется экспериментальная поддержка этих API, основанных на промисах.

Исследуем метод fs.rename(). Вот асинхронная версия этого метода, использующая коллбэки:

const fs = require('fs')
fs.rename('before.json', 'after.json', (err) => {
  if (err) {
    return console.error(err)
  }
  //готово
})

При использовании его синхронной версии для обработки ошибок используется конструкция try/catch:
const fs = require('fs')
try {
  fs.renameSync('before.json', 'after.json')
  //готово
} catch (err) {
  console.error(err)
}

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

Модуль path


Модуль path, о некоторых возможностях которого мы тоже уже говорили, содержит множество полезных инструментов, позволяющих взаимодействовать с файловой системой. Как уже было сказано, устанавливать его не нужно, так как он является частью Node.js. Для того чтобы пользоваться им, его достаточно подключить:
const path = require('path')

Свойство path.sep этого модуля предоставляет символ, использующийся для разделения сегментов пути (\ в Windows и / в Linux и macOS), а свойство path.delimiter даёт символ, используемый для отделения друг от друга нескольких путей (; в Windows и : в Linux и macOS).

Рассмотрим и проиллюстрируем примерами некоторые методы модуля path.

▍path.basename()


Возвращает последний фрагмент пути. Передав второй параметр этому методу можно убрать расширение файла.
require('path').basename('/test/something') //something
require('path').basename('/test/something.txt') //something.txt
require('path').basename('/test/something.txt', '.txt') //something

▍path.dirname()


Возвращает ту часть пути, которая представляет имя директории:
require('path').dirname('/test/something') // /test
require('path').dirname('/test/something/file.txt') // /test/something

▍path.extname()


Возвращает ту часть пути, которая представляет расширение файла:
require('path').extname('/test/something') // ''
require('path').extname('/test/something/file.txt') // '.txt'

▍path.isAbsolute()


Возвращает истинное значение если путь является абсолютным:
require('path').isAbsolute('/test/something') // true
require('path').isAbsolute('./test/something') // false

▍path.join()


Соединяет несколько частей пути:
const name = 'flavio'
require('path').join('/', 'users', name, 'notes.txt') //'/users/flavio/notes.txt'

▍path.normalize()


Пытается выяснить реальный путь на основе пути, который содержит символы, использующиеся при построении относительных путей вроде ., .. и //:
require('path').normalize('/users/flavio/..//test.txt') ///users/test.txt

▍path.parse()


Преобразует путь в объект, свойства которого представляют отдельные части пути:
  • root: корневая директория.
  • dir: путь к файлу, начиная от корневой директории
  • base: имя файла и расширение.
  • name: имя файла.
  • ext: расширение файла.

Вот пример использования этого метода:
require('path').parse('/users/test.txt')

В результате его работы получается такой объект:
{
  root: '/',
  dir: '/users',
  base: 'test.txt',
  ext: '.txt',
  name: 'test'
}

▍path.relative()


Принимает, в качестве аргументов, 2 пути. Возвращает относительный путь из первого пути ко второму, основываясь на текущей рабочей директории:
require('path').relative('/Users/flavio', '/Users/flavio/test.txt') //'test.txt'
require('path').relative('/Users/flavio', '/Users/flavio/something/test.txt') //'something/test.txt'

▍path.resolve()


Находит абсолютный путь на основе переданного ему относительного пути:
path.resolve('flavio.txt') 
//'/Users/flavio/flavio.txt' при запуске из моей домашней папки.

Итоги


Сегодня мы рассмотрели модули Node.js fs и path, которые используются для работы с файловой системой. В следующей части этой серии, на которой она завершается, мы обсудим модули os, events, http, поговорим о работе с потоками и с системами управления базами данных в Node.js.

Уважаемые читатели! Какими npm-пакетами вы пользуетесь при работе с файловой системой в Node.js?

Работа с файлами в 1С 8.3 (8.2)

В 1С 8.3 (8.2) для работы с файлами существует два объекта: Файл и ДиалогВыбораФайла.

Рассмотрим каждый по отдельности.

Объект 1С — файл

Объект Файл служит для управления параметрами файлов.

Сразу стоит заметить, что данный объект не предназначен для чтения и записи из файлов.

Например, прочитаем параметры некоторого файла, находящегося на диске C:

ПолноеИмяФайла = "C:\Работа с файлами\статья.txt";
ВыбранныйФайл = Новый Файл(ПолноеИмяФайла);
Если ВыбранныйФайл.Существует() Тогда
СтрокаПараметров = "Параметры файла:"+Символы.ПС +
"Полное имя файла: "+ ВыбранныйФайл.ПолноеИмя + Символы.ПС +
"Имя: "+ ВыбранныйФайл.Имя + Символы.ПС +
"Имя без расширения: "+ ВыбранныйФайл.ИмяБезРасширения+Символы.ПС+
"Расширение: "+ ВыбранныйФайл.Расширение+ Символы.ПС+
"Путь без имени: "+ ВыбранныйФайл.Путь+Символы.ПС+
"Размер: "+ ВыбранныйФайл.Размер()+ Символы.ПС+
"Это файл: "+ ВыбранныйФайл.ЭтоФайл()+ Символы.ПС+
"Изменен: "+ ВыбранныйФайл.ПолучитьВремяИзменения()+Символы.ПС+
"Только чтение: "+ ВыбранныйФайл.ПолучитьТолькоЧтение()+Символы.ПС+
"Невидимость: "+ ВыбранныйФайл.ПолучитьНевидимость();
Сообщить(СтрокаПараметров);
Иначе
Предупреждение("Файл не найден!");
КонецЕсли;

В результате мы получим следующую информацию (если файл найден):

Параметры файла:
Полное имя файла: C:\Работа с файлами\статья.txt
Имя: статья.txt
Имя без расширения: статья
Расширение: .txt
Путь без имени: C:\Работа с файлами\
Размер: 899
Это файл: Да
Изменен: 18.05.2015 16:21:28
Только чтение: Нет
Невидимость: Нет

Запись в файл

Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания — попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>

Теперь, когда мы выбрали и открыли файл, можно с ним работать, т.е. прочитать его содержимое или записать в него что-нибудь.
Рассмотрим пример:

Если ЗначениеЗаполнено(ПутьКФайлу) Тогда
ТекстовыйДокИзФайла = Новый ТекстовыйДокумент;
ТекстовыйДокИзФайла.Прочитать(ПутьКФайлу);
НашТекстИзФайла = ТекстовыйДокИзФайла.ПолучитьТекст();
Сообщить(НашТекстИзФайла);
КонецЕсли;


Чтение файла в 1С

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

Пример:

ПрочитанныйТекст = Новый ЧтениеТекста(ПутьКФайлу);
СтрокаТекстовогоФайла = ПрочитанныйТекст.ПрочитатьСтроку();
Сообщить(СтрокаТекстовогоФайла);
Пока СтрокаТекстовогоФайла <> Неопределено Цикл
СтрокаТекстовогоФайла = ПрочитанныйТекст.ПрочитатьСтроку();
Сообщить(СтрокаТекстовогоФайла);
КонецЦикла;

ПрочитанныйТекст.Закрыть();

Запись текста из 1С в файл

Если ЗначениеЗаполнено(ПутьКФайлу) Тогда

ТекстовыйДокИзФайла = Новый ТекстовыйДокумент;
ТекстовыйДокИзФайла.ДобавитьСтроку("В траве сидел кузнечик");
ТекстовыйДокИзФайла.ДобавитьСтроку("Совсем как огуречик");
ТекстовыйДокИзФайла.ДобавитьСтроку("Зелененький он был");
ТекстовыйДокИзФайла.Записать(ПутьКФайлу, КодировкаТекста.UTF8);

Конецесли;

Заметим, что при записи текстового файла можно установить кодировку.

Копирование файла

Здесь все очень просто

КопироватьФайл(ПутьКФайлуИсточнику, ПутьКФайлуПриемнику);

Перемещение

ПереместитьФайл(ПутьКФайлуИсточнику, ПутьКФайлуПриемнику);

Удаление

Попытка
УдалитьФайлы("C:\Работа с файлами\статья.txt");
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;

Диалог выбора файла

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

Объект ДиалогВыбораФайла служит для открытия файла (файлов), сохранения файла или выбора каталога в диалоге специального вида.

Например, выберем и откроем некоторый файл с расширением txt:
Задаем режим диалога выбора. Доступны три варианта: ВыборКаталога, Открытие, Сохранение

Режим = РежимДиалогаВыбораФайла.Открытие;

Создаем диалог

ДиалогОткрытия = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытия.ПолноеИмяФайла = "";
Фильтр = "Текст, *.txt|*.txt";
ДиалогОткрытия.Фильтр = Фильтр;
ДиалогОткрытия.МножественныйВыбор = Истина;
ДиалогОткрытия.Заголовок = "Выберите файлы";
Если ДиалогОткрытия.Выбрать() Тогда
МассивВыбранныхФайлов = ДиалогОткрытия.ВыбранныеФайлы;
Для Каждого ИмяВыбранногоФайла Из МассивВыбранныхФайлов Цикл
ВыбранныйФайл = Новый Файл(ИмяВыбранногоФайла);
Сообщить(ИмяВыбранногоФайла
+ "; Размер = "
+ ВыбранныйФайл.Размер());
КонецЦикла;
Иначе
Предупреждение("Нет выбранных файлов!");
КонецЕсли;

Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):

К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.

Работа с файлами | Компьютер для чайников

Даже если нет необходимости экономить место, программы-архиваторы — очень полезная вещь, так как позволяют компактно и без риска что-то потерять «по дороге», передавать, скажем, по электронной почте большое количество разнородных данных единым файлом. Ещё одно обстоятельство — передача исполняемых файлов (с расширением EXE, СОМ) в виде вложения в электронное письмо может блокироваться почтовыми сервисами как […]

Большинство начинающих пользователей компьютера при работе с текстом применяют стандартный прием копирования и вставки с использованием мыши, т.е. при зажатой левой кнопке выделяется курсором нужной фрагмент или весь текст, кликом правой кнопкой вызывается контекстное меню, где выбирается пункт «Копировать». Более продвинутые пользователи используют для этой цели только клавиатуру, что намного удобней и быстрее. В этом […]

При частой работе с какими-либо документами бывает удобней создать папку на рабочем столе для быстрого доступа к ним. Сделать это не сложно, однако, у начинающих пользователей данная операция может вызвать затруднение. В этом уроке мы рассмотрим, как сделать папку прямо на рабочем столе Windows. [contents Создаем папку на рабочем столе Пример этой операции будет рассмотрен […]

Рано или поздно начинающий пользователь компьютера сталкивается с таким понятием, как файловая система (ФС). Как правило, впервые знакомство с данным термином происходит при форматировании носителя информации: логические диски винчестера и подключаемые носители (флешки, карты памяти, внешний жесткий диск). Перед форматированием операционная система Windows предлагает выбрать вид файловой системы на носителе, размер кластера, способ форматирования (быстрое […]

Каждый файл на компьютере имеет набор своих индивидуальных свойств, которые делают его уникальным. В зависимости от формата файла набор свойств может быть разным: аудио файлы имеют одни свойства, видео – другие, текстовые документы – третье и т.д. В данной статье мы поговорим, как посмотреть свойства файлов, как их изменить или удалить на примере ОС Windows […]

Основы Windows: Работа с файлами

Урок 3: Работа с файлами

/ ru / windowsbasics / navigating-windows / content /

Работа с файлами

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

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


Что это за файл?

Существует много различных типов из файлов , которые вы можете использовать. Например, документы Microsoft Word, цифровые фотографии, цифровая музыка и цифровые видео — это все типы файлов. Вы можете даже думать о файле как о цифровой версии реальной вещи, с которой вы можете взаимодействовать на своем компьютере.Когда вы используете разные приложения, вы часто будете просматривать , создаете или редактируете файлы .

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

Что такое папка?

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

Проводник

Вы можете просматривать и систематизировать файлы и папки с помощью встроенного приложения, известного как File Explorer (которое называется Windows Explorer в Windows 7 и более ранних версиях).

Чтобы открыть проводник, щелкните значок File Explorer на панели задач или дважды щелкните любую папку на рабочем столе. Появится новое окно проводника. Теперь вы готовы начать работу со своими файлами и папками.

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

Обратите внимание, что вы также можете увидеть местоположение папки в адресной строке в верхней части окна.

Чтобы открыть файл:

Есть два основных способа открыть файл:

  • Найдите файл на своем компьютере и дважды щелкните его . Это откроет файл в его приложении по умолчанию .В нашем примере мы откроем документ Microsoft Word ( BdayInvites.docx ), который откроется в Microsoft Word .
  • Откройте приложение, затем используйте приложение, чтобы открыть файл . Когда приложение открыто, вы можете перейти в меню File вверху окна и выбрать Open .

Перемещение и удаление файлов

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

Чтобы переместить файл:

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

  1. Щелкните и перетащите файл в желаемое место.
  2. Отпустите мышь. Файл появится в новом месте.В этом примере мы открыли папку, чтобы увидеть файл в новом месте.

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

Для создания новой папки:
  1. В проводнике найдите и нажмите кнопку Новая папка . Вы также можете щелкнуть правой кнопкой мыши в том месте, где должна появиться папка, затем выберите Создать> Папка .
  2. Появится новая папка. Введите желаемое имя для папки и нажмите Введите . В нашем примере мы назовем его School Documents .
  3. Будет создана новая папка. Теперь вы можете перемещать файлы в эту папку.
Чтобы переименовать файл или папку:

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

  1. Щелкните файл или папку, подождите примерно одну секунду и щелкните еще раз.Появится редактируемое текстовое поле.
  2. Введите желаемое имя на клавиатуре и нажмите Введите . Имя будет изменено.
,

Основы macOS: Работа с файлами

Урок 3: Работа с файлами

/ ru / macosbasics / навигация-macos / content /

Основные сведения о файлах

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

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


Посмотрите видео ниже, чтобы узнать больше о macOS Finder.


Что это за файл?

Существует много различных типов из файлов , которые вы можете использовать. Например, документы Microsoft Word, цифровые фотографии, цифровая музыка и цифровые видео — это все типы файлов. Вы можете даже думать о файле как о цифровой версии реальной вещи, с которой вы можете взаимодействовать на своем компьютере.Когда вы используете разные приложения, вы часто будете просматривать , создаете или редактируете файлы .

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

Что такое папка?

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

Finder

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

Чтобы открыть Finder, щелкните значок Finder на Dock или дважды щелкните любую папку на рабочем столе. Появится новое окно Finder. Теперь вы готовы приступить к работе с файлами и папками.

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

Обратите внимание, что вы можете увидеть имя текущей папки в верхней части окна Finder.

Если боковая панель не отображается в левой части окна Finder, выберите Просмотр > Показать боковую панель на панели меню .

Чтобы открыть файл:

Есть два основных способа открыть файл:

  • Найдите файл на своем компьютере и дважды щелкните по нему .Это откроет файл в его приложении по умолчанию . В нашем примере мы откроем документ Microsoft Word ( сопроводительное письмо.docx ), который откроется в Microsoft Word .
  • Откройте приложение, затем используйте приложение, чтобы открыть файл . После открытия приложения вы можете перейти в меню File в верхнем левом углу экрана и выбрать Open .

Перемещение и удаление файлов

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

Чтобы переместить файл:

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

  1. Щелкните и перетащите fi
.

Работа с файлами в Go

  • Введение
  • Основные операции
  • Чтение и письмо
  • Архивирование (архивирование)
  • Сжатие
  • Разное

Все есть файл

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

Интерфейсы чтения и записи в Go — аналогичные абстракции. Мы просто читаем и записываем байты, без необходимости понимать, где и как читатель получает свои данные или куда писатель отправляет данные. Посмотрите в / dev чтобы найти доступные устройства. Некоторым потребуются повышенные привилегии для доступа.

Создать пустой файл

  основной пакет 

импорт (
"журнал"
"os"
)

var (
newFile * os.Файл
, ошибка
)

func main () {
newFile, err = os.Create ("test.txt")
if err! = Nil {
log.Fatal (err)
}
log.Println (newFile) )
newFile.Close ()
}

Обрезать файл

  package main 

import (
"log"
"os"
)

func main () {
// Обрезать файл до 100 байт. Если файл
// меньше 100 байтов, исходное содержимое останется
// в начале, а остальная часть пространства будет
// заполнена, и будут нулевые байты.Если он превышает 100 байт,
// Все, что превышает 100 байт, будет потеряно. В любом случае
// мы получим ровно 100 байт.
// Передаем 0 для усечения до полностью пустого файла

err: = os.Truncate ("test.txt", 100)
if err! = Nil {
log.Fatal (err)
}
}

Получить информацию о файле

  основной пакет 

импорт (
"fmt"
"журнал"
"os"
)

var (
fileInfo os.FileInfo
err error
)

func main () {
// Stat возвращает информацию о файле. Если файла нет, он вернет
// ошибку.
fileInfo, err = os.Stat ("test.txt")
if err! = Nil {
log.Fatal (err)
}
fmt.Println ("Имя файла:", fileInfo.Name ())
fmt .Println ("Размер в байтах:", fileInfo.Size ())
fmt.Println ("Разрешения:", fileInfo.Mode ())
fmt.Println ("Последнее изменение:", fileInfo.ModTime ())
FMT.Println ("Is Directory:", fileInfo.IsDir ())
fmt.Printf ("Тип системного интерфейса:% T \ n", fileInfo.Sys ())
fmt.Printf ("Информация о системе:% + v \ n \ n ", fileInfo.Sys ())
}

Переименовать и переместить файл

  основной пакет 

импорт (
"журнал"
"os"
)

func main () {
originalPath: = "test.txt"
newPath: = "test2.txt"
err: = os.Rename ( originalPath, newPath)
if err! = nil {
журнал.Неустранимая ошибка (ошибка)
}
}

Удалить файл

  основной пакет 

импорт (
"журнал"
"os"
)

func main () {
err: = os.Remove ("test.txt")
if err! = Nil {
log.Fatal ( err)
}
}

Открытие и закрытие файлов

  package main 

import (
"log"
"os"
)

func main () {
// Простое открытие только для чтения.Мы рассмотрим фактическое чтение
// и запись в файлы в примерах ниже на странице
файл, err: = os.Open ("test.txt")
if err! = Nil {
log.Fatal (err)
}
file.Close ()

// OpenFile с дополнительными параметрами. Последний параметр - это режим разрешения
// Второй параметр - это атрибуты при открытии файла
, err = os.OpenFile ("test.txt", os.O_APPEND, 0666)
if err! = Nil {
log.Fatal (err )
}
файл.Close ()

// Используйте эти атрибуты по отдельности или вместе
// с OR для второго аргумента OpenFile ()
// например, os.O_CREATE | os.O_APPEND
// или os.O_CREATE | os.O_TRUNC | os.O_WRONLY

// os.O_RDONLY // Только чтение
// os.O_WRONLY // Только запись
// os.O_RDWR / / Чтение и запись
// os.O_APPEND // Добавить в конец файла
// os.O_CREATE // Создать не существует
// os.O_TRUNC // Обрезать файл при открытии
}

Проверить, существует ли файл

  основной пакет 

импорт (
"журнал"
"os"
)

var (
fileInfo * os.FileInfo
err error
)

func main () {
// Stat возвращает информацию о файле. Если файла нет, он вернет
// ошибку.
fileInfo, err: = os.Stat ("test.txt")
if err! = Nil {
if os.IsNotExist (err) {
log.Fatal ("Файл не существует.")
}
}
log.Println ("Файл существует. Информация о файле:")
log.Println (fileInfo)
}

Проверить права на чтение и запись

  package main 

import (
"log"
"os"
)

func main () {
// Тестовые разрешения на запись.Возможно, файл
// не существует, и он вернет другую ошибку
//, которую можно проверить с помощью файла os.IsNotExist (err)
, err: = os.OpenFile ("test.txt", os. O_WRONLY, 0666)
if err! = Nil {
if os.IsPermission (err) {
log.Println ("Ошибка: отказано в разрешении на запись.")
}
}
file.Close ()

// Тест чтения permissions
file, err = os.OpenFile ("test.txt", os.O_RDONLY, 0666)
if err! = nil {
if os.IsPermission (err) {
log.Println ("Ошибка: отказано в разрешении на чтение.")
}
}
file.Close ()
}

Изменение разрешений, прав собственности и отметок времени

  package main 

import (
"log"
"os"
"time"
)

func main () {
// Изменение разрешений в стиле Linux
err: = os.Chmod ("test.txt", 0777)
if err! = Nil {
log.Println (err)
}

// Смена владельца
err = os.Chown ("test.txt", os.Getuid (), os.Getgid ())
if err! = Nil {
log.Println (err)
}

// Изменить временные метки
twoDaysFromNow: = time.Now ( ) .Add (48 * time.Hour)
lastAccessTime: = twoDaysFromNow
lastModifyTime: = twoDaysFromNow
err = os.Chtimes ("test.txt", lastAccessTime, lastModifyTime)
if err! = Nil {
log.Println (
log.Println )
}
}

Жесткие ссылки и символические ссылки

Типичный файл — это просто указатель на место на жестком диске, называемое индексным дескриптором.Жесткая ссылка создает новый указатель на то же место. Файл будет удален с диска только после удаления всех ссылок. Жесткие ссылки работают только в одной файловой системе. Жесткая ссылка — это то, что вы можете считать «нормальной» ссылкой.

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

  package main 

import (
"os"
"log"
"fmt"
)

func main () {
// Создайте жесткую ссылку
// У вас будет два имени файла, которые указывают на одно и то же содержимое
// Изменение содержимого одного приведет к изменению другого
// Удаление / переименование одного не повлияет на другое
err: = os.Link ("original.txt", "original_also.txt")
if err! = Nil {
log.Fatal (err)
}

fmt.Println ("create sym")
// Создать символическую ссылку
err = os.Symlink ("original.txt", "original_sym.txt")
if err! = nil {
log.Fatal (err)
}

// Lstat вернет информацию о файле, но если это на самом деле
// символическая ссылка, он вернет информацию о символической ссылке.
// Он не будет переходить по ссылке и предоставлять информацию
// о реальном файле
// Символьные ссылки не работают в Windows
fileInfo, err: = os.Lstat ("original_sym.txt")
if err! = Nil {
log.Fatal (err)
}
fmt.Printf ("Link info:% + v", fileInfo)

// Изменить владельца только символической ссылки
// а не файл, на который он указывает
err = os.Lchown ("original_sym.txt", os.Getuid (), os.Getgid ())
if err! = Nil {
log.Fatal (err)
}
}

Копировать файл

  package main 

import (
"os"
"log"
"io"
)

// Копировать файл
func main () {
// Открыть исходный файл
originalFile, err: = os.Open ("test.txt")
if err! = Nil {
log.Fatal (err)
}
defer originalFile.Close ()

// Создать новый файл
newFile, err: = os.Create ("test_copy .txt ")
if err! = nil {
log.Fatal (err)
}
defer newFile.Close ()

// Копируем байты в место назначения из источника
bytesWritten, err: = io.Copy (newFile, originalFile)
if err! = nil {
log.Fatal (err)
}
log.Printf ("Copied% d bytes.", BytesWritten)

// Сохранение содержимого файла
// Сбрасывает память на диск
err = newFile.Sync ()
if err! = Nil {
log.Fatal (err)
}
}

Искать позиции в файле

  основной пакет 

импорт (
"os"
"fmt"
"log"
)

func main () {
file, _: = os.Open ("test.txt")
defer file.Close ( )

// Смещение - это сколько байтов нужно переместить
// Смещение может быть положительным или отрицательным
var offset int64 = 5

// Отсюда точка отсчета для смещения
// 0 = Начало файла
// 1 = Текущая позиция
// 2 = Конец файла
var откуда int = 0
newPosition, err: = file.Seek (смещение, откуда)
if err! = Nil {
log.Fatal (err)
}
fmt.Println ("Только что перемещено на 5:", newPosition)

// Вернуться на 2 байта от текущей позиции
newPosition , err = file.Seek (-2, 1)
if err! = nil {
log.Fatal (err)
}
fmt.Println ("Только что переместился на два назад:", newPosition)

// Находим текущий position путем получения
// возвращаемого значения из Seek после перемещения 0 байтов
currentPosition, err: = file.Seek (0, 1)
fmt.Println ("Текущая позиция:", currentPosition)

// Перейти к началу файла
newPosition, err = file.Seek (0, 0)
if err! = Nil {
log .Fatal (err)
}
fmt.Println ("Позиция после поиска 0,0:", newPosition)
}

Запись байтов в файл

Вы можете писать, используя только пакет ОС, который уже нужен для открытия файла. Поскольку все исполняемые файлы Go представляют собой статически связанные двоичные файлы, каждый импортируемый пакет увеличивает размер вашего исполняемого файла.Другие пакеты, такие как io , ioutil и bufio , предоставляют дополнительную помощь, но в них нет необходимости.

  package main 

import (
"os"
"log"
)

func main () {
// Откройте новый файл для записи только
файл, err: = os.OpenFile (
"test.txt" ,
os.O_WRONLY | os.O_TRUNC | os.O_CREATE,
0666,
)
if err! = Nil {
log.Fatal (err)
}
defer file.Close ()

// Записываем байты в файл
byteSlice: = [] byte ("Bytes! \ N")
byteWritten, err: = file.Write (byteSlice)
if err! = Nil {
log.Fatal ( err)
}
log.Printf ("Записано% d байтов. \ n", bytesWritten)
}

Быстрая запись в файл

В пакете ioutil есть полезная функция, которая называется WriteFile () , который будет обрабатывать создание / открытие, запись фрагмента байтов и закрытие.Это полезно, если вы просто нужен быстрый способ сбросить кусок байтов в файл.

  основной пакет 

импорт (
"io / ioutil"
"журнал"
)

func main () {
err: = ioutil.WriteFile ("test.txt", [] byte ("Hi \ n") , 0666)
if err! = Nil {
log.Fatal (err)
}
}

Использовать буфер записи

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

  основной пакет 

импорт (
"журнал"
"os"
"bufio"
)

func main () {
// Открыть файл для записи
файла, err: = os.OpenFile ("test.txt", os.O_WRONLY, 0666)
if err! = Nil {
log.Fatal (err)
}
defer file.Close ()

// Создаем буферизованный писатель из файла
bufferedWriter : = bufio.NewWriter (file)

// Запись байтов в буфер
bytesWritten, err: = bufferedWriter.Write (
[] byte {65, 66, 67},
)
if err! = nil {
log. Fatal (err)
}
log.Printf ("Байт записано:% d \ n", bytesWritten)

// Записать строку в буфер
// Также доступны WriteRune () и WriteByte ()
bytesWritten, err = bufferedWriter ,WriteString (
"Буферизованная строка \ n",
)
if err! = Nil {
log.Fatal (err)
}
log.Printf ("Байт записано:% d \ n", bytesWritten)

// Проверка сколько хранится в ожидающем буфере
unflastedBufferSize: = bufferedWriter.Buffered ()
log.Printf ("Bytes buffered:% d \ n", unflastedBufferSize)

// Посмотрите, сколько буфера доступно
bytesAvailable: = bufferedWriter.Available ()
if err! = Nil {
log.Fatal (err)
}
log.Printf ("Доступный буфер:% d \ n", bytesAvailable)

// Записать буфер памяти на диск
bufferedWriter.Flush ()

// Отменить любые изменения, сделанные в буфере, который имеет
// еще не записано в файл с помощью Flush ()
// Мы только что сбросили, поэтому нет никаких изменений для возврата
// Писатель, который вы передаете в качестве аргумента
// - это то место, куда буфер будет выводить, если вы хотите, чтобы
// изменился на новый писатель
bufferedWriter.Reset (bufferedWriter)

// Посмотрите, сколько буфера доступно.
bytesAvailable = bufferedWriter.Available ()
if err! = Nil {
log.Fatal (err)
}
log.Printf ("Доступный буфер:% d \ n ", bytesAvailable)

// Изменить размер буфера. Первый аргумент - это устройство записи
//, куда должен выводиться буфер. В этом случае
// мы используем тот же буфер. Если мы выбрали номер
, // который был меньше существующего буфера, например 10
//, мы не вернем буфер размером 10, мы получим
// обратно буфер размером с исходный с
// он уже был достаточно большим (по умолчанию 4096)
bufferedWriter = bufio.NewWriterSize (
bufferedWriter,
8000,
)

// Проверяем доступный размер буфера после изменения размера
bytesAvailable = bufferedWriter.Available ()
if err! = Nil {
log.Fatal (err)
}
log.Printf (" Доступный буфер:% d \ n ", bytesAvailable)
}

Прочитать до n байтов из файла

Тип os.File обеспечивает несколько основных функций. Пакеты io , ioutil и bufio предоставляют дополнительные функции для работы с файлами.

  package main 

import (
"os"
"log"
)

func main () {
// Открыть файл для чтения
файла, err: = os.Open ("test.txt")
if err ! = nil {
log.Fatal (err)
}
defer file.Close ()

// Чтение до len (b) байтов из файла
// Записанные нулевые байты означают конец файла
// Конец file возвращает тип ошибки io.EOF
byteSlice: = make ([] byte, 16)
bytesRead, err: = file.Прочитать (byteSlice)
if err! = Nil {
log.Fatal (err)
}
log.Printf ("Число прочитанных байтов:% d \ n", bytesRead)
log.Printf ("Данные прочитаны:% s \ n ", byteSlice)
}

Прочитано ровно n байтов

  package main 

import (
"os"
"log"
"io"
)

func main () {
// Открыть файл для чтения
файла, err: = os.Open ("test.txt" )
if err! = Nil {
log.Fatal (err)
}

// Функция file.Read () успешно прочитает крошечный файл в большой
// байтовый сегмент, но io.ReadFull () вернет ошибку
//, если файл меньше байтового среза.
byteSlice: = make ([] byte, 2)
numBytesRead, err: = io.ReadFull (file, byteSlice)
if err! = Nil {
log.Fatal (err)
}
log.Printf ("Количество прочитано байтов:% d \ n ", numBytesRead)
log.Printf (" Данные прочитаны:% s \ n ", byteSlice)
}

Прочитано не менее n байтов

  основной пакет 

импорт (
"os"
"журнал"
"io"
)

func main () {
// Открыть файл для чтения
файла, err: = os.Open ("test.txt")
if err! = Nil {
log.Fatal (err)
}

byteSlice: = make ([] byte, 512)
minBytes: = 8
// io.ReadAtLeast () вернет ошибку, если не может
// найти хотя бы minBytes для чтения. Он будет читать как
// сколько байтов может вместить byteSlice.
numBytesRead, err: = io.ReadAtLeast (file, byteSlice, minBytes)
if err! = Nil {
log.Fatal (err)
}
log.Printf ("Число прочитанных байтов:% d \ n", numBytesRead )
лог.Printf ("Данные прочитаны:% s \ n", byteSlice)
}

Прочитать все байты файла

  package main 

import (
"os"
"log"
"fmt"
"io / ioutil"
)

func main () {
// Открыть файл для чтения
файла, err: = os.Open ("test.txt")
if err! = nil {
log.Fatal (err)
}

// os.File.Read (), io.ReadFull () и
// io.ReadAtLeast () все работают с фиксированным
// байтовым фрагментом, который вы создаете перед чтением

// ioutil.ReadAll () прочитает каждый байт
// из считывающего устройства (в данном случае файл),
// и вернет фрагмент неизвестных данных фрагмента
, err: = ioutil.ReadAll (file)
if err! = Nil {
log.Fatal (err)
}

fmt.Printf ("Данные в шестнадцатеричном виде:% x \ n", данные)
fmt.Printf ("Данные в виде строки:% s \ n", данные)
fmt.Println («Число прочитанных байтов:», len (данные))
}

Быстрое чтение всего файла в память

  package main 

import (
"log"
"io / ioutil"
)

func main () {
// Чтение файла в байтовый срез данных
, err: = ioutil.ReadFile ("test.txt")
if err! = Nil {
log.Fatal (err)
}

log.Printf ("Данные прочитаны:% s \ n", данные)
}

Использовать буферизованный считыватель

Создание буферизированного считывателя сохранит буфер памяти с некоторым содержимым. Буферизованный Читатель также предоставляет некоторые дополнительные функции, которые недоступны в типе os.File или io.Reader . Размер буфера по умолчанию — 4096, минимальный — 16.

  package main 

import (
"os"
"log"
"bufio"
"fmt"
)

func main () {
// Откройте файл и создайте буферизованный читатель поверх
файла, err: = Операционные системы.Open ("test.txt")
if err! = Nil {
log.Fatal (err)
}
bufferedReader: = bufio.NewReader (file)

// Получение байтов без продвижения указателя
byteSlice: = make ([ ] byte, 5)
byteSlice, err = bufferedReader.Peek (5)
if err! = nil {
log.Fatal (err)
}
fmt.Printf ("Посмотрел 5 байтов:% s \ n", byteSlice )

// Чтение и продвижение указателя
numBytesRead, err: = bufferedReader.Read (byteSlice)
if err! = Nil {
log.Fatal (err)
}
fmt.Printf ("Прочитано% d байтов:% s \ n", numBytesRead, byteSlice)

// Готов 1 байт. Ошибка, если нет байта для чтения
myByte, err: = bufferedReader.ReadByte ()
if err! = Nil {
log.Fatal (err)
}
fmt.Printf ("Прочитать 1 байт:% c \ n", myByte )

// Чтение до разделителя включительно
// Возвращает байтовый фрагмент
dataBytes, err: = bufferedReader.ReadBytes ('\ n')
if err! = Nil {
log.Fatal (err)
}
fmt.Printf ("Прочитать байты:% s \ n", dataBytes)

// Чтение до разделителя включительно
// Возвращает строку
dataString, err: = bufferedReader.ReadString ('\ n ')
if err! = nil {
log.Fatal (err)
}
fmt.Printf ("Прочитать строку:% s \ n", dataString)

// В этом примере читается несколько строк, поэтому test.txt
// для правильной работы должно быть несколько строк текста
}

Читать с помощью сканера

Сканер является частью пакета bufio .Это полезно для ходьбы через файлы с определенными разделителями. Обычно символ новой строки используется в качестве разделителя для разделения файла на строки. В файле CSV в качестве разделителя используются запятые. os.File может быть упакован в bufio.Scanner , как буферизованный ридер. Мы вызываем Scan () , чтобы прочитать до следующего разделителя, а затем используйте Text () или Bytes () , чтобы получить данные, которые были прочитаны.

Разделитель — это не просто байт или символ.На самом деле вам нужно реализовать специальную функцию, которая будет определять, где находится следующий разделитель, насколько далеко вперед продвинуть указатель и какие данные возвращать. Если пользовательский SplitFunc не предоставлен, по умолчанию используется ScanLines , который будет разделяться на каждом символ новой строки. Другие функции разделения, включенные в bufio , — это ScanRunes и ScanWords .

  // Чтобы определить свою собственную функцию разделения, сопоставьте этот отпечаток 
type SplitFunc func (data [] byte, atEOF bool) (advance int, token [] byte, err error)

// Возврат (0, nil, nil ) сообщит сканеру
// сканировать снова, но с большим буфером, потому что
// недостаточно данных для достижения разделителя

В следующем примере файл bufio.Сканер создается из файла, а затем Сканируем, читаем файл слово за словом.

  package main 

import (
"os"
"log"
"fmt"
"bufio"
)

func main () {
// Откройте файл и создайте сканер поверх него
файл, err: = os.Open ("test.txt")
if err! = nil {
log.Fatal (err)
}
scanner: = bufio.NewScanner (file)

// Сканер по умолчанию - bufio.ScanLines. Давайте использовать ScanWords.
// Можно также использовать пользовательскую функцию сканера типа SplitFunc
.Split (bufio.ScanWords)

// Сканировать следующий токен.
success: = scanner.Scan ()
if success == false {
// Ложь при ошибке или EOF. Проверить ошибку
err = scanner.Err ()
if err == nil {
log.Println ("Сканирование завершено и достигнуто EOF")
} else {
log.Fatal (err)
}
}

// Получить данные из сканирования с байтами () или текстом ()
fmt.Println ("Первое слово найдено:", scanner.Text ())

// Вызовите scanner.Scan () еще раз, чтобы найти следующий токен
}

Архивные (Zip) файлы

  // В этом примере используется zip, но стандартная библиотека 
// также поддерживает архивы tar.
package main

import (
"archive / zip"
"log"
"os"
)

func main () {
// Создайте файл для записи буфера архива в
// Можно также использовать буфер в памяти.
outFile, err: = os.Create ("test.zip")
if err! = Nil {
log.Fatal (err)
}
defer outFile.Close ()

// Создаем zip writer поверх средство записи файлов
zipWriter: = zip.NewWriter (outFile)

// Добавляем файлы в архив
// Мы используем некоторые жестко закодированные данные для демонстрации,
// но вы можете перебирать все файлы
// в каталоге и передать имя и содержимое
// каждого файла, или вы можете взять данные из своей программы
// и записать их в архив
// без
var filesToArchive = [] struct {
Name, Body string
} {
{"тест.txt "," Строковое содержимое файла "},
{" test2.txt "," \ x61 \ x62 \ x63 \ n "},
}

// Создание и запись файлов в архив, который, в свою очередь,
/ / записываются в базовый писатель в
// .zip-файл, который мы создали в начале
для _, file: = range filesToArchive {
fileWriter, err: = zipWriter.Create (file.Name)
if err! = nil {
log.Fatal (err)
}
_, err = fileWriter.Write ([] byte (file.Body))
if err! = Nil {
log.Fatal (err)
}
}

// Очистить
err = zipWriter.Close ()
if err! = Nil {
log.Fatal (err)
}
}

Распаковать (распаковать) архивные файлы

  // В этом примере используется zip, но стандартная библиотека 
// также поддерживает tar-архивы
package main

import (
"archive / zip"
"log"
"io"
"os"
"path / filepath"
)

func main () {
// Создание ридера из zip-архива
zipReader, err: = zip.OpenReader ("test.zip")
if err! = Nil {
log.Fatal (err)
}
defer zipReader.Close ()

// Итерировать каждый файл / каталог, найденный в
для _, file: = range zipReader.Reader.File {
// Открыть файл внутри zip-архива
// как обычный файл
zippedFile, err: = file.Open ()
if err! = nil {
log.Fatal (err)
}
defer zippedFile.Close ()

// Укажите, каким должно быть имя извлеченного файла.
// Вы можете указать полный путь или префикс
//, чтобы переместить его в другой каталог.
// В этом случае мы извлечем файл из
// zip в файл с тем же именем.
targetDir: = "./"
extractFilePath: = filepath.Join (
targetDir,
file.Name,
)

// Извлечь элемент (или создать каталог)
if file.FileInfo (). IsDir () {
// Создайте каталоги для воссоздания структуры каталога
// внутри zip-архива.Также
// сохраняет разрешения.
log.Println ("Создание каталога:", extractFilePath)
os.MkdirAll (extractFilePath, file.Mode ())
} else {
// Извлечь обычный файл, поскольку это не каталог
log.Println ("Извлечение файла:", file.Name)

// Открыть выходной файл для записи
outputFile, err: = os.OpenFile (
extractFilePath,
os.O_WRONLY | os.O_CREATE | os.O_TRUNC,
file.Mode (),
)
if err! = Nil {
log.Fatal (err)
}
defer outputFile.Close ()

// «Извлечь» файл путем копирования заархивированного файла
// содержимое в выходной файл
_, err = io.Copy (outputFile, zippedFile)
if err! = nil {
log.Fatal (err)
}
}
}
}

Сжать файл

  // В этом примере используется gzip, но стандартная библиотека также 
// поддерживает zlib, bz2, flate и lzw
package main

import (
"os"
"compress / gzip"
"log"
)

func main () {
// Создаем.gz файл для записи в файл вывода
, err: = os.Create ("test.txt.gz")
if err! = nil {
log.Fatal (err)
}

// Создайте модуль записи gzip поверх file writer
gzipWriter: = gzip.NewWriter (outputFile)
defer gzipWriter.Close ()

// Когда мы пишем в gzip Writer
// он, в свою очередь, сжимает содержимое
// и затем записывает его в базовый
// также запись в файл
// Нам не нужно беспокоиться о том, как работает все
// сжатие, поскольку мы просто
// используем его как простой интерфейс записи
// который мы отправляем байты на
_, err = gzipWriter.Write ([] byte ("Правило Gophers! \ N"))
if err! = Nil {
log.Fatal (err)
}

log.Println ("Сжатые данные, записанные в файл.")
}

Распаковать файл

  // В этом примере используется gzip, но стандартная библиотека также 
// поддерживает импорт zlib, bz2, flate и lzw
в основной пакет

(
"compress / gzip"
"log"
"io"
"os"
)

func main () {
// Откройте файл gzip, который мы хотим распаковать.
// Файл является средством чтения, но мы можем использовать любой источник данных
//.Обычно веб-серверы
// возвращают содержимое в формате gzip для экономии полосы пропускания.
// и в этом случае данные находятся не в файле
// файловой системы, а в буфере памяти
gzipFile, err: = os .Open ("test.txt.gz")
if err! = Nil {
log.Fatal (err)
}

// Создайте программу чтения gzip поверх программы чтения файлов
// Опять же, это может быть любой введите reader, хотя
gzipReader, err: = gzip.NewReader (gzipFile)
if err! = nil {
log.Fatal (err)
}
defer gzipReader.Close ()

// Распаковка для писателя. Мы будем использовать средство записи файлов
outfileWriter, err: = os.Create ("unzipped.txt")
if err! = Nil {
log.Fatal (err)
}
defer outfileWriter.Close ()

// Скопируйте содержимое сжатого файла gzip в выходной файл
_, err = io.Copy (outfileWriter, gzipReader)
if err! = Nil {
log.Fatal (err)
}
}

Временные файлы и каталоги

Пакет ioutil предоставляет две функции: TempDir () и TempFile ().Ответственность за удаление временных элементов лежит на вызывающем абоненте. Единственное преимущество этих функций заключается в том, что вы можете передать ему пустую строку для каталога, и он автоматически создаст элемент во временной папке системы по умолчанию (/ tmp в Linux). Начиная с , функция os.TempDir () возвращает временный системный каталог по умолчанию.

  package main 

import (
"os"
"io / ioutil"
"log"
"fmt"
)

func main () {
// Создайте временный каталог в системной папке temp по умолчанию
tempDirPath, ошибка: = ioutil.TempDir ("", "myTempDir")
if err! = Nil {
log.Fatal (err)
}
fmt.Println ("Temp dir created:", tempDirPath)

// Создаем файл в новом временном каталоге
tempFile, err: = ioutil.TempFile (tempDirPath, "myTempFile.txt")
if err! = Nil {
log.Fatal (err)
}
fmt.Println ("Temp file created:", tempFile.Name ( ))

// ... сделаем что-нибудь с временным файлом / каталогом ...

// Закройте файл
err = tempFile.Close ()
if err! = Nil {
log.Fatal (err)
}

// Удаляем созданные ресурсы
err = os.Remove (tempFile.Name ())
if err! = Nil {
log .Fatal (err)
}
err = os.Remove (tempDirPath)
if err! = Nil {
log.Fatal (err)
}
}

Загрузка файла через HTTP

  основной пакет 

импорт (
"os"
"io"
"журнал"
"net / http"
)

func main () {
// Создать выходной файл
newFile, err: = os.Create ("devdungeon.html")
if err! = Nil {
log.Fatal (err)
}
defer newFile.Close ()

// HTTP-запрос GET devdungeon.com
url: = "http: // www.devdungeon.com/archive "
ответ, err: = http.Get (url)
defer response.Body.Close ()

// Записываем байты из HTTP-ответа в файл.
// response.Body удовлетворяет интерфейс читателя.
// newFile удовлетворяет интерфейс писателя.
// Это позволяет нам использовать io.Копия, которая принимает
// любой тип, реализующий интерфейс чтения и записи
numBytesWritten, err: = io.Copy (newFile, response.Body)
if err! = Nil {
log.Fatal (err)
}
log.Printf ("Загружен байтовый файл% d. \ N", numBytesWritten)
}

Хеширование и контрольные суммы

  основной пакет 

импорт (
"crypto / md5"
"crypto / sha1"
"crypto / sha256"
"crypto / sha512"
"log"
"fmt"
"io / ioutil"
)

func main () {
// Получить байты из данных файла
, err: = ioutil.ReadFile ("test.txt")
if err! = Nil {
log.Fatal (err)
}

// Хешировать файл и выводить результаты
fmt.Printf ("Md5:% x \ n \ n", md5.Sum (данные))
fmt.Printf ("Sha1:% x \ n \ n", sha1.Sum (данные))
fmt.Printf ("Sha256:% x \ n \ n", sha256.Sum256 ( data))
fmt.Printf ("Sha512:% x \ n \ n", sha512.Sum512 (data))
}

В приведенном выше примере весь файл копируется в память. Это было сделано для удобства передачи его в качестве параметра каждой из хеш-функций.Другой подход — создать интерфейс записи хэша и записать в него с помощью Write (), WriteString () или, в данном случае, Copy (). В приведенном ниже примере используется хеш md5, но вы можете переключиться на использование любого из других поддерживаемых.

  основной пакет 

импорт (
"crypto / md5"
"log"
"fmt"
"io"
"os"
)

func main () {
// Открыть файл для чтения
файла, ошибка: = os.Open ("test.txt")
if err! = nil {
журнал.Fatal (err)
}
defer file.Close ()

// Создайте новый хешер, который является интерфейсом записи
hasher: = md5.New ()
_, err = io.Copy (hasher, file)
if err! = nil {
log.Fatal (err)
}

// Хеширование и печать. Передайте nil с
// данные не поступают как аргумент среза
//, но проходят через интерфейс записи
sum: = hasher.Sum (nil)
fmt.Printf ("Контрольная сумма Md5:% x \ n" , сумма)
}

Список литературы

Документация стандартной библиотеки Go

.

Глава 9. Работа с файлами

Глава 9. Работа с файлами

В этой главе мы узнаем, как распознавать, создавать, удалять, копировать и перемещать файлы с помощью таких команд, как file, touch, rm, cp, mv и переименовать .

все файлы чувствительны к регистру

Файлы в Linux (или любой Unix) чувствительны к регистру . Это означает, что FILE1 отличается от file1 , а / etc / hosts отличается от / etc / Hosts (последний не существует на типичном компьютере с Linux).

На этом снимке экрана показана разница между двумя файлами, один с верхним регистром W , другой с нижним регистром w .

 paul @ laika: ~ / Linux $  ls 
winter.txt Winter.txt
paul @ laika: ~ / Linux $  cat winter.txt 
Холодно.
paul @ laika: ~ / Linux $  cat Winter.txt 
Это очень холодно! 

Каталог — это особый вид файла , но он все же (с учетом регистра!) Файл . Каждое окно терминала (например, / dev / pts / 4 ), любой жесткий диск или раздел (например, / dev / sdb1 ) и любой процесс представлены где-то в файловой системе как файл .В ходе этого курса станет ясно, что все в Linux представляет собой файл .

Утилита file определяет тип файла. Linux не использует расширения для определения типа файла. Командной строке не важно, заканчивается ли файл на .txt или .pdf. Как системный администратор, вы должны использовать команду file для определения типа файла. Вот несколько примеров типичной системы Linux.

 paul @ laika: ~ $  файл pic33.png 
pic33.png: данные изображения PNG, 3840 x 1200, 8-битный / цветной RGBA, без чересстрочной развертки
paul @ laika: файл ~ $  / etc / passwd 
/ etc / passwd: текст ASCII
paul @ laika: ~ $ , файл HelloWorld.c 
HelloWorld.c: текст программы ASCII C 

Команда file использует волшебный файл, содержащий шаблоны для распознавания типов файлов. Волшебный файл находится в / usr / share / file / magic . Для получения дополнительной информации введите man 5 magic .

Интересно отметить file -s для специальных файлов, таких как / dev и / proc .

 root @ debian6 ~ #  файл / dev / sda 
/ dev / sda: специальный блок
root @ debian6 ~ #  файл -s / dev / sda 
/ dev / sda: загрузочный сектор x86; раздел 1: ID = 0x83, активный, начальный ...
root @ debian6 ~ #  файл / proc / cpuinfo 
/ proc / cpuinfo: пусто
root @ debian6 ~ #  файл -s / proc / cpuinfo 
/ proc / cpuinfo: текст программы ASCII C ++ 

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

Этот снимок экрана начинается с пустого каталога, создаются два файла с touch и перечисляются эти файлы.

 paul @ debian7: ~  $ ls -l 
всего 0
paul @ debian7: ~ $  touch file42 
paul @ debian7: ~ $  touch file33 
paul @ debian7: ~ $  ls -l 
всего 0
-rw-r - r-- 1 пол Павел 0 15 окт 08:57 file33
-rw-r - r-- 1 пол Павел 0 15 окт 08:56 file42
paul @ debian7: ~ $ 

Команда touch может устанавливать некоторые свойства при создании пустых файлов.Можете ли вы определить, что установлено, посмотрев на следующий снимок экрана? Если нет, проверьте руководство для touch .

 paul @ debian7: ~  долл. США touch -t 200505050000 SinkoDeMayo 
paul @ debian7: ~ $  touch -t 130207111630 BigBattle.txt 
paul @ debian7: ~ $  ls -l 
всего 0
-rw-r - r-- 1 пол Поль 0 11 июля 1302 BigBattle.txt
-rw-r - r-- 1 пол Павел 0 15 окт 08:57 file33
-rw-r - r-- 1 пол Павел 0 15 окт 08:56 file42
-rw-r - r-- 1 пол Поль 0 5 мая 2005 SinkoDeMayo
paul @ debian7: ~ $ 

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

 paul @ debian7: ~  долларов США 
Файл BigBattle.txt33 файл42 SinkoDeMayo
paul @ debian7: ~  долларов США BigBattle.txt 
paul @ debian7: ~ $  ls 
файл33 файл42 SinkoDeMayo
paul @ debian7: ~ $ 

Чтобы предотвратить случайное удаление файла, введите rm -i .

 paul @ debian7: ~  долларов США 
файл33 файл42 SinkoDeMayo
paul @ debian7: ~ $  RM -i file33 
rm: удалить обычный пустой файл `file33 '? да
paul @ debian7: ~  долл. США -i SinkoDeMayo 
rm: удалить обычный пустой файл `SinkoDeMayo '? N
paul @ debian7: ~ $  ls 
file42 SinkoDeMayo
paul @ debian7: ~ $ 

По умолчанию rm -r не удаляет непустые каталоги. Однако rm допускает несколько параметров, которые позволят вам удалить любой каталог.Оператор rm -rf известен тем, что стирает все, что угодно (при условии, что у вас есть на это права). Когда вы вошли в систему как root, будьте очень осторожны с rm -rf ( f означает force , а r означает рекурсивный ), поскольку root подразумевает, что разрешения к вам не применяются. Вы можете буквально случайно стереть всю файловую систему.

 paul @ debian7: ~  долларов mkdir test 
paul @ debian7: ~  долларов, тестовая версия 
rm: невозможно удалить `test ': это каталог
paul @ debian7: ~ $  rm -rf test 
paul @ debian7: ~ $  ls test 
ls: нет доступа к тесту: нет такого файла или каталога
paul @ debian7: ~ $ 

Чтобы скопировать файл, используйте cp с источником и целевым аргументом.

 paul @ debian7: ~  долларов США 
file42 SinkoDeMayo
paul @ debian7: ~ $  cp file42 file42.copy 
paul @ debian7: ~ $  ls 
file42 file42.copy SinkoDeMayo 

скопировать в другой каталог

Если целью является каталог, то исходные файлы копируются в этот целевой каталог.

 paul @ debian7: ~  долларов mkdir dir42 
paul @ debian7: ~ $  cp SinkoDeMayo dir42 
paul @ debian7: ~ $  ls dir42 / 
SinkoDeMayo 

Чтобы скопировать полные каталоги, используйте cp -r (опция -r заставляет рекурсивно копировать всех файлов во всех подкаталогах).

 paul @ debian7: ~  долларов США 
dir42 file42 file42.copy SinkoDeMayo
paul @ debian7: ~ $  cp -r dir42 / dir33 
paul @ debian7: ~ $  ls 
dir33 dir42 file42 file42.copy SinkoDeMayo
paul @ debian7: ~ $  ls dir33 / 
SinkoDeMayo 

копирование нескольких файлов в каталог

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

 paul @ debian7: ~ $  cp file42 file42.копировать SinkoDeMayo dir42 / 
paul @ debian7: ~ $  ls dir42 / 
file42 file42.copy SinkoDeMayo 

Чтобы предотвратить перезапись cp существующих файлов, используйте параметр -i (для интерактивного).

 paul @ debian7: ~  долл. США в копилке SinkoDeMayo file42 
paul @ debian7: ~ $  cp SinkoDeMayo file42 
paul @ debian7: ~ $  cp -i SinkoDeMayo file42 
cp: перезаписать `file42 '?  п 
paul @ debian7: ~ $ 

Используйте mv , чтобы переименовать файл или переместить файл в другой каталог.

 paul @ debian7: ~  долларов США 
dir33 dir42 file42 file42.copy SinkoDeMayo
paul @ debian7: ~ $  mv file42 file33 
paul @ debian7: ~ $  ls 
dir33 dir42 file33 file42.copy SinkoDeMayo
paul @ debian7: ~ $ 

Если вам нужно переименовать только один файл, предпочтительнее использовать команду mv .

переименовать каталоги с помощью mv

Для переименования каталогов можно использовать ту же команду mv .

 paul @ debian7: ~  $ ls -l 
всего 8
drwxr-xr-x 2 paul paul 4096 15 окт 09:36 dir33
drwxr-xr-x 2 paul paul 4096 15 окт 09:36 dir42
-rw-r - r-- 1 пол Павел 0 15 окт 09:38 file33
-rw-r - r-- 1 paul paul 0 15 окт, 09:16 file42.копия
-rw-r - r-- 1 пол Поль 0 5 мая 2005 SinkoDeMayo
paul @ debian7: ~ $  mv dir33 backup 
paul @ debian7: ~ $  ls -l 
всего 8
drwxr-xr-x 2 paul paul 4096 15 октября 09:36 резервное копирование
drwxr-xr-x 2 paul paul 4096 15 окт 09:36 dir42
-rw-r - r-- 1 пол Павел 0 15 окт 09:38 file33
-rw-r - r-- 1 пол Поль 0 15 окт 09:16 file42.copy
-rw-r - r-- 1 пол Поль 0 5 мая 2005 SinkoDeMayo
paul @ debian7: ~ $ 

mv также имеет переключатель -i , аналогичный cp и rm .

этот снимок экрана показывает, что mv -i запросит разрешение на перезапись существующего файла.

 paul @ debian7: ~ $  mv -i file33 SinkoDeMayo 
mv: перезаписать `SinkoDeMayo '? 
paul @ debian7: ~ $ 

Команда rename — один из тех редких случаев, когда в книге «Основы Linux» проводится различие между дистрибутивами Linux. Почти каждая команда в части Fundamentals этой книги работает почти на каждом компьютере Linux.Но переименовать в другое.

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

Команда rename в Debian использует регулярные выражения (регулярное выражение или короткое регулярное выражение объясняется в следующей главе) для одновременного переименования нескольких файлов.

Ниже пример переименования , который заменяет все вхождения txt на png для всех имен файлов, оканчивающихся на .txt.

 paul @ debian7: ~ / test42 $  ls 
Файл abc.txt 33.txt file42.txt
paul @ debian7: ~ / test42 $  переименовать 's / \. txt / \. png /' * .txt 
paul @ debian7: ~ / test42 $  ls 
abc.png file33.png file42.png 

Этот второй пример переключает все (первые) вхождения файла в документ для всех имен файлов, оканчивающихся на .png.

 paul @ debian7: ~ / test42 $  ls 
abc.png file33.png file42.png
paul @ debian7: ~ / test42 $  переименовать s / file / document / '* .png 
paul @ debian7: ~ / test42 $  ls 
а.png document33.png document42.png
paul @ debian7: ~ / test42 $ 

переименовать в CentOS / RHEL / Fedora

В Red Hat Enterprise Linux синтаксис переименовать немного отличается. В первом примере ниже все файлы * .conf переименовываются, заменяя любое вхождение .conf на .backup.

 [paul @ centos7 ~] $  touch one.conf two.conf three.conf 
[paul @ centos7 ~] $  переименовать .conf .backup * .conf 
[paul @ centos7 ~]  латов  долларов
одна резервная копия три резервная копия две резервная копия
[paul @ centos7 ~] $ 

Второй пример переименовывает все (*) файлы, заменяя один на ОДИН.

 [paul @ centos7 ~] $  LV 
одна резервная копия три резервная копия две резервная копия
[paul @ centos7 ~] $  переименовать в ONE * 
[paul @ centos7 ~]  латов  долларов
ОДИН. Резервное копирование три. Резервное копирование два. Резервное копирование
[paul @ centos7 ~] $ 

Практика: работа с файлами

1. Перечислите файлы в каталоге / bin

2. Отобразите тип файла / bin / cat, / etc / passwd и / usr / bin / пароль.

3а. Загрузите wolf.jpg и LinuxFun.pdf с http://linux-training.be (wget http: // linux-training.be / files / studentfiles / wolf.jpg и wget http://linux-training.be/files/books/LinuxFun.pdf)

 wget http://linux-training.be/files/studentfiles/wolf.jpg
wget http://linux-training.be/files/studentfiles/wolf.png
wget http://linux-training.be/files/books/LinuxFun.pdf 

3b. Отобразите тип файла wolf.jpg и LinuxFun.pdf

3c. Переименуйте wolf.jpg в wolf.pdf (используйте mv).

3д. Отобразите тип файла wolf.pdf и LinuxFun.pdf.

4. Создайте каталог, которого коснулся ~ /, и войдите в него.

5. Создайте файлы today.txt и вчера.txt в затронутых файлах.

6. Измените дату в файле вчера.txt, чтобы она соответствовала вчерашней дате.

7. Скопируйте вчера.txt в copy.yesterday.txt

8. Переименуйте copy.yesterday.txt в kim

9. Создайте каталог с именем ~ / testbackup и скопируйте в него все файлы из ~ /, которых коснулись.

10. Используйте одну команду, чтобы удалить каталог ~ / testbackup и все файлы в нем.

11. Создайте каталог ~ / etcbackup и скопируйте все *.conf файлы из / etc в него. Вы включили все подкаталоги / etc?

12. Используйте rename, чтобы переименовать все файлы * .conf в * .backup. (если у вас есть несколько дистрибутивов, попробуйте их на всех!)

решение: работа с файлами

1. Перечислите файлы в каталоге / bin

 ls / bin 

2. Отобразите тип файла / bin / cat, / etc / passwd и / usr / bin / passwd.

 файл / bin / cat / etc / passwd / usr / bin / passwd 

3a. Загрузите wolf.jpg и LinuxFun.pdf с http://linux-training.be (wget http://linux-training.be/files/studentfiles/wolf.jpg и wget http://linux-training.be/files/books/LinuxFun.pdf)

 wget http://linux-training.be/files/studentfiles/wolf.jpg
wget http://linux-training.be/files/studentfiles/wolf.png
wget http://linux-training.be/files/books/LinuxFun.pdf 

3b. Отобразите тип файла wolf.jpg и LinuxFun.pdf

 файл wolf.jpg LinuxFun.pdf 

3c. Переименуйте wolf.jpg в wolf.pdf (используйте mv).

 mv wolf.jpg wolf.pdf 

3d. Отобразите тип файла wolf.pdf и LinuxFun.pdf.

 файл wolf.pdf LinuxFun.pdf 

4. Создайте каталог ~ /, которого коснулись, и войдите в него.

 мкдир ~ / тронулся; cd ~ / touch 

5. Создайте файлы today.txt и вчера.txt в touch.

 touch today.txt вчера.txt 

6. Измените дату в файлеterday.txt, чтобы она соответствовала вчерашней дате.

 touch -t 200810251405 вчера.txt (замените 20081025 на вчера) 

7.Скопируйте вчера.txt в copy.yesterday.txt

 cpterday.txt copy.yesterday.txt 

8. Переименуйте copy.yesterday.txt в kim

 mv copy.yesterday.txt kim 

9. Создайте каталог с именем ~ / testbackup и скопируйте все файлы из ~ /, к которым он прикоснулся.

 мкдир ~ / testbackup; cp -r ~ / touch ~ / testbackup / 

10. Используйте одну команду, чтобы удалить каталог ~ / testbackup и все файлы в нем.

 rm -rf ~ / testbackup 

11. Создайте каталог ~ / etcbackup и скопируйте все *.conf файлы из / etc в него. Вы включили все подкаталоги / etc?

 cp -r /etc/*.conf ~ / etcbackup 
 Копируются только файлы * .conf, которые находятся непосредственно в / etc /. 

12. Используйте rename, чтобы переименовать все файлы * .conf в * .backup. (если у вас доступно более одного дистрибутива, попробуйте его на всех!)

 В RHEL: коснитесь 1.conf 2.conf; переименовать резервную копию conf * .conf 
 В Debian: коснитесь 1.conf 2.conf; переименуйте 's / conf / backup /' * .conf 
.