Пишу, по большей части, про историю, свою жизнь и немного про программирование.

Файл, состоящий из нулей

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

Предпринимаю вторую попытку посмотреть на язык программирования «Раст», первую я предпринимал, когда язык бурно развивался и меня быстро утомила скорость с которой устаревают примеры.

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

В общем, попробовал написать нужную утилиту на «Расте», если кто его вдруг знает, покритикуйте, кода там совсем немного.

3 комментария
Владимир Чуйков 2018
  1. Проверку на размер файла лучше выполнить средствами файловой системы в начале программы, не открывая файл (может быть полезно когда в директории находится 2^64 файлов нулевого размера).
  1. `read_chunk` (и `check_file_zeroed`) — в Rust есть `BufReader` (кишки тут https://doc.rust-lang.org/src/std/io/buffered.rs.html , дока тут https://doc.rust-lang.org/std/io/struct.BufReader.html ), но тут понять нужно — можем мы себе позволить `read_to_end` или нам придется терабайтные файлы обнюхивать.
  1. `check_not_zeroed` — все эти ФОР ИФ в Расте смотрятся как 10 PRINT «HELLO WORLD» 20 POKE 4529, 254
    Правильней походу использовать https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.find , всё вместится в 1 строку и функция будет не нужна.
  1. `run` — от вложенных match/match/if некоторые рекомендуют избавляться (я в их число не вхожу, мне «лесенка» приятней), но можно попробовать написать со всем барахлом, которое есть в https://doc.rust-lang.org/std/option/enum.Option.html — всякие `or`, `and_then` и т. д.
Евгений Степанищев 2018

Спасибо! В Фейсбуке уже покритиковали (правда ленюсь переписать пока), но лишним точно не будет!

1) А зачем? Большинство файлов ненулевой длины, поэтому чаще на каждый файл будет stat + open + read вместо open + read
2) ага, read_to_end было моим первым, черновым вариантом. Читать всё в память мы не можем себе позволить, там могут любые файлы встретиться, никаких предположений я не строю
3) да, пожалуй так и стоит делать, правда я не понимаю чем плоха функция, пусть и однострочная. Компилятор не умеет инлайнить?
4) спасибо!

Владимир Чуйков 2018

3) просто засорение пространства имён. Небольшую функцию, для которой есть только одна точка вызова, лучше оформить в виде лямбды. А замена for/if на iter/find (или iter/filter) делает код более читаемым. Инлайнит Раст мелкие функции или будет лишний `call` в бинарнике — вот не знаю, не исследовал.