2012-08-02 40 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