Добавить между файлом в Голанге - PullRequest
0 голосов
/ 19 сентября 2018

Я могу добавить что-нибудь новое в конец файла в Golang, как это

f, err := os.OpenFile(filename, os.O_APPEND|os.O_WRONLY, 0600)
if err != nil {
    panic(err)
}

defer f.Close()

if _, err = f.WriteString(text); err != nil {
    panic(err)
}

Но как я могу добавить что-то в середине файла или после какой-то определенной строки или текста?

1 Ответ

0 голосов
/ 19 сентября 2018

На диске файл (последовательность байтов) хранится аналогично массиву.

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

Затем предположим, что у вас есть индекс 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)

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

...