На диске файл (последовательность байтов) хранится аналогично массиву.
Таким образом, добавление в середину файла требует смещения байтов после точки, в которую вы записываете.
Затем предположим, что у вас есть индекс idx
, куда вы хотите добавить, и несколько байтов b
для записи.Самый простой (но не обязательно самый эффективный) способ добавления в середину файла включал бы чтение файла в f[idx:]
, запись b
в f[idx:idx+len(b)]
, а затем запись байтов, которые вы прочитали на первом шаге:
// idx is the index you want to write to, b is the bytes you want to write
// warning from https://godoc.org/os#File.Seek:
// "The behavior of Seek on a file opened with O_APPEND is not specified."
// so you should not pass O_APPEND when you are using the file this way
if _, err := f.Seek(idx, 0); err != nil {
panic(err)
}
remainder, err := ioutil.ReadAll(f)
if err != nil {
panic(err)
}
f.Seek(idx, 0)
f.Write(b)
f.Write(remainder)
В зависимости от того, что вы делаете, может иметь смысл читать файл построчно и записывать скорректированные строки в новый файл, а затем переименовывать новый файл в старое имя файла.