Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to write to a file in golang

Tags:

go

i am trying to write to to a file. i read the whole content of the file and now i want to change the content of the file based on some word that i have got from the file. but when i check, the content of the file, it is still the same and it has not change. this is what i used

if strings.Contains(string(read), sam) {
    fmt.Println("this file contain that word")
    temp := strings.ToUpper(sam)
    fmt.Println(temp)
    err := ioutil.WriteFile(fi.Name(), []byte(temp), 0644)
} else {
    fmt.Println(" the word is not in the file")
}
like image 399
user3841581 Avatar asked Jul 17 '14 19:07

user3841581


People also ask

How do I write to a file in Golang?

Go write to file with ioutil. WriteFile writes data to the specified file. This is a higher-level convenience function. The opening and closing of the file is handled for us. The example writes a string to a file with ioutil.

How do I read and write files in Golang?

Golang offers a vast inbuilt library that can be used to perform read and write operations on files. In order to read from files on the local system, the io/ioutil module is put to use. The io/ioutil module is also used to write content to the file.

Which function is used to write an array of bytes into a file in Golang?

WriteFile() to write this byte array to a file.

What does the write function from the os package return in Golang?

The Write() function writes len(b) bytes to the File. It returns several bytes written and an error, if any. The Write() function returns a non-nil error when n != len(b).


1 Answers

Considering that your call to ioutil.WriteFile() is consistent with what is used in "Go by Example: Writing Files", this should work.

But that Go by example article check the err just after the write call.

You check the err outside the scope of your test:

    if matched {
        read, err := ioutil.ReadFile(path)
        //fmt.Println(string(read))
        fmt.Println(" This is the name of the file", fi.Name())
        if strings.Contains(string(read), sam) {
            fmt.Println("this file contain that word")
            Value := strings.ToUpper(sam)
            fmt.Println(Value)
            err = ioutil.WriteFile(fi.Name(), []byte(Value), 0644)
        } else {
            fmt.Println(" the word is not in the file")
        }
        check(err)   <===== too late
    }

The err you are testing is the one you got when reading the file (ioutil.ReadFile), because of blocks and scope.

You need to check the error right after the Write call

            err = ioutil.WriteFile(fi.Name(), []byte(Value), 0644)
            check(err)   <===== too late

Since WriteFile overwrite the all file, you could strings.Replace() to replace your word by its upper case equivalent:

r := string(read)
r = strings.Replace(r, sam, strings.ToUpper(sam), -1)
err := ioutil.WriteFile(fi.Name(), []byte(r), 0644)

For a replace which is case insensitive, use a regexp as in "How do I do a case insensitive regular expression in Go?".
The, use func (*Regexp) ReplaceAllString:

re := regexp.MustCompile("(?i)\\b"+sam+"\\b")
r = re.ReplaceAllString(r, strings.ToUpper(sam))
err := ioutil.WriteFile(fi.Name(), []byte(r), 0644)

Note the \b: word boundary to find the any word starting and ending with sam content (instead of finding substrings containing sam content).
If you want to replace substrings, simply drop the \b:

re := regexp.MustCompile("(?i)"+sam)
like image 52
VonC Avatar answered Oct 15 '22 00:10

VonC