2012-08-02 46 views
2

目前,我正在学习如何一起去(或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))显示类似,所以我假定写()方法正确执行。

但是fmt.Printf(">>> %#v", finalFileContent)什么都不显示。绝对没有(甚至没有显示“>>>”!)上面的注释行也是如此。

有趣的是,该字符串“YU没有工作?“(”?正确显示...

你知道为什么 而且你知道如何解决这个问题

当你运行你的代码以下版本

提前感谢!

回答

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) 
    } 
} 

UPDATE:

声明:

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)。

有一个相关的进入悬而未决的问题:

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

+0

首先,感谢你的答案:) 所以,你的脚本的版本会显示这样的值的列表:“finalFileContent写:6161 “ 最有趣的部分是代码的结束,它现在显示”finalFileContent Printf:0写/ dev/stdout:winapi错误#8“(是的,我正在使用Windows) 经过快速研究,我没有发现任何与此有关的东西rror ... – KorHosik 2012-08-03 07:47:52

+0

查看我的更新回答。 – peterSO 2012-08-03 10:13:02

+0

你是真的,它似乎只在Windows上出错:它完美的工作在Unbuntu上。显然这是一个内存问题,同时试图在Windows控制台内显示大量文本...我的脚本似乎工作良好,因为'fmt.Println(len(finalFileContent.String()))'输出一个合法的值;我无法在控制台中显示文本:不方便,但不重要。谢谢你的帮助! – KorHosik 2012-08-03 10:19:17