Файл, состоящий из нулей
Если вы не понимаете, что тут делает эта картинка, не пугайтесь, это мем, их развелось столько, что обо всех и не узнаешь
Предпринимаю вторую попытку посмотреть на язык программирования «Раст», первую я предпринимал, когда язык бурно развивался и меня быстро утомила скорость с которой устаревают примеры.
Почитал руководство, написал «Песню о пиве», теперь попробовал решить более практическую задачу — у одного нашего клиента после восстановления сбойной файловой системы часть файлов занулилась — внутри них одни байты с кодом ноль. Сейчас надо бы её просканировать и восстановить из бакапа всё испортившееся.
В общем, попробовал написать нужную утилиту на «Расте», если кто его вдруг знает, покритикуйте, кода там совсем немного.
Комментарии 3
2. `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` или нам придется терабайтные файлы обнюхивать.
3. `check_not_zeroed` — все эти ФОР ИФ в Расте смотрятся как 10 PRINT «HELLO WORLD» 20 POKE 4529, 254
Правильней походу использовать https://doc.rust-lang.org/std/iter/trait.I … ethod.find , всё вместится в 1 строку и функция будет не нужна.
4. `run` — от вложенных match/match/if некоторые рекомендуют избавляться (я в их число не вхожу, мне «лесенка» приятней), но можно попробовать написать со всем барахлом, которое есть в https://doc.rust-lang.org/std/option/enum.Option.html — всякие `or`, `and_then` и т.д.
1) А зачем? Большинство файлов ненулевой длины, поэтому чаще на каждый файл будет stat + open + read вместо open + read
2) ага, read_to_end было моим первым, черновым вариантом. Читать всё в память мы не можем себе позволить, там могут любые файлы встретиться, никаких предположений я не строю
3) да, пожалуй так и стоит делать, правда я не понимаю чем плоха функция, пусть и однострочная. Компилятор не умеет инлайнить?
4) спасибо!