Как создать горячую папку golang, чтобы изменять файлы только один раз - PullRequest
0 голосов
/ 09 июля 2020

У меня ситуация, когда программа выводит файл. Есть одна строка текста, которую я должен изменить, чтобы исправить файл. Я не владею исходным кодом программы, поэтому я должен изменить каждый файл, который выводит эта программа, чтобы его можно было правильно использовать в другой программе.

Из-за характера процесса я не могу переименовать файлы или переместите их.

Следовательно, я хочу видеть любой новый файл, добавленный (достаточно просто с al oop и спящим), и изменять файл, но делать это только один раз, так как другие процессы должны появиться и используйте этот файл.

Я написал много подобных приложений в Go, но мне всегда разрешалось перемещать файлы.

1 Ответ

0 голосов
/ 10 июля 2020

Ниже приведен код, который я придумал: Открыт для предложений о том, как это сделать с помощью Seeker, поскольку я удаляю только одну строку текста в файле.

package main

import (
    "time"
    "fmt"       
    "io/ioutil"
    "os"
    "bytes"
    "strings"
)

const dir = "dir00003"

func main() {

fmt.Println("Running...")

//Go into a loop forever
for {

    //Wait 60 seconds before taking any action. 
    time.Sleep(60 * time.Second)
    //Read all of the file data for all files in the directory: 
    files, err := ioutil.ReadDir(dir)
    if err != nil {fmt.Println("Failed to read transfer folder. There must be a folder named `dir00003`!"); continue}

    for _, v := range files {

        //if this is an index file, skip over it as we don't care: 
        if strings.Contains(v.Name(), "pmi") {continue}

        //if the file was created within the last 2 minutes, we should check if we need to modify it
        if time.Now().Sub(v.ModTime()) < (time.Minute * 2) {

            //open the file 
            f, err := os.Open(fmt.Sprintf("%s/%s", dir, v.Name()))
            if err != nil {fmt.Printf("\tCouldn't open file: %s\n", v.Name()); continue}

            defer f.Close()
            //read all of the bytes of the file
            bs, err := ioutil.ReadAll(f)
            if err != nil {fmt.Printf("\tCouldn't read bytes from %s\n", v.Name()); continue}

            //see if the <program_parameters/> tag is in the file
            b := bytes.Contains(bs, []byte("<program_parameters/>"))

            //if the tag is in the file, we should replace it, otherwise we move on to the next file
            if b {
                //replace the tag with nothing. Only look for the first instance and then abort the process of replacing.
                rbs := bytes.Replace(bs, []byte("<program_parameters/>"), []byte(""), 1)
                //close the file so we can delete it. 
                f.Close()
                //delete the exisint file. 
                os.Remove(fmt.Sprintf("%s/%s", dir, v.Name()))

                //create a new file with the same original name:
                nf, err := os.Create(fmt.Sprintf("%s/%s", dir, v.Name()))
                if err != nil {fmt.Printf("\tFailed to create new file for %s\n", v.Name()); continue}

                //write all of the bytes that we have in memory to our new file. 
                _, err = nf.Write(rbs)
                if err != nil {fmt.Println("Failed to write to new file %s\n", v.Name()); continue}
                //close our new file
                nf.Close()

                fmt.Printf("Modified new file: %s", v.Name())

            } else {
                continue
            }

        }

    

    }

    fmt.Printf("\nDone with round\n")

}

fmt.Println("PROGRAM STOPPED RUNNING!!")

return 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...