Go:连接文件内容

时间:2012-08-02 20:53:22

标签: file go concatenation

我目前正在学习如何使用Go(或golang)进行开发,我有一个奇怪的问题:

我尝试创建一个查找HTML文件内部的脚本,以获取每个 标记的所有来源。 该脚本的目标是合并所有检索到的文件。

所以,这就是故事:现在,我能够获取每个JavaScript文件的内容,但是......我无法将它们连接起来......

您可以在下面看到我的脚本:

//Open main file
mainFilePath := "/path/to/my/file.html"
mainFileDir := path.Dir(mainFilePath)+"/"

mainFileContent, err := ioutil.ReadFile(mainFilePath)

if err == nil {
    mainFileContent := string(mainFileContent)
    var finalFileContent bytes.Buffer

    //Start RegExp searching for JavaScript src
    scriptReg, _ := regexp.Compile("<script src=\"(.*)\">")
    scripts := scriptReg.FindAllStringSubmatch(mainFileContent,-1)

    //For each SRC found...
    for _, path := range scripts {
        //We open the corresponding file
        subFileContent, err := ioutil.ReadFile(mainFileDir+path[1])

        if err == nil {
            //And we add its content to the "final" variable
            fmt.Println(finalFileContent.Write(subFileContent))
        } else {
            fmt.Println(err)
        }
    }

    //Try to display the final result
    // fmt.Println(finalFileContent.String())
    fmt.Printf(">>> %#v", finalFileContent)
    fmt.Println("Y U NO WORKS? :'(")

} else {
    fmt.Println(err)
}

因此,每个fmt.Println(finalFileContent.Write(subFileContent))都会显示 6161 ,因此我假设 Write()方法已正确执行。

fmt.Printf(">>> %#v", finalFileContent)没有显示任何内容。绝对没有(甚至没有显示“&gt;&gt;&gt;”!)而且上面的注释行也是如此。

有趣的部分是字符串“你不工作吗?:'(”正确显示......

你知道为什么吗? 你知道如何解决这个问题吗?

提前致谢!

1 个答案:

答案 0 :(得分:1)

你忽略了一些错误。运行以下版本的代码时,您的结果是什么?

package main

import (
    "bytes"
    "fmt"
    "io/ioutil"
    "path"
    "regexp"
)

func main() {
    //Open main file
    mainFilePath := "/path/to/my/file.html"
    mainFileDir := path.Dir(mainFilePath) + "/"

    mainFileContent, err := ioutil.ReadFile(mainFilePath)

    if err == nil {
        mainFileContent := string(mainFileContent)
        var finalFileContent bytes.Buffer

        //Start RegExp searching for JavaScript src
        scriptReg, _ := regexp.Compile("<script src=\"(.*)\">")
        scripts := scriptReg.FindAllStringSubmatch(mainFileContent, -1)

        //For each SRC found...
        for _, path := range scripts {
            //We open the corresponding file
            subFileContent, err := ioutil.ReadFile(mainFileDir + path[1])

            if err == nil {
                //And we add its content to the "final" variable

                // fmt.Println(finalFileContent.Write(subFileContent))
                n, err := finalFileContent.Write(subFileContent)
                fmt.Println("finalFileContent Write:", n, err)

            } else {
                fmt.Println(err)
            }
        }

        //Try to display the final result
        // fmt.Println(finalFileContent.String())

        // fmt.Printf(">>> %#v", finalFileContent)
        n, err := fmt.Printf(">>> %#v", finalFileContent)
        fmt.Println()
        fmt.Println("finalFileContent Printf:", n, err)

        fmt.Println("Y U NO WORKS? :'(")

    } else {
        fmt.Println(err)
    }
}

更新:

声明:

fmt.Println("finalFileContent Printf:", n, err)

输出:

finalFileContent Printf: 0 write /dev/stdout: winapi error #8

finalFileContent Printf: 0 write /dev/stdout: Not enough storage is available to process this command.

来自MSDN:

  

ERROR_NOT_ENOUGH_MEMORY

     

8(0x8)

     

没有足够的存储空间来处理此命令。

Windows控制台的格式化输出溢出缓冲区(大约64KB)。

有一个相关的Go开放问题:

  

Issue 3376: windows: detect + handle console in os.File.Write