2015-05-04 37 views
10

在golang中,如果我有os.FileInfo,有沒有什麼辦法可以在沒有原始路徑的情況下自行打開*os.File從FileInfo打開文件

比方說,我有這樣的事情:

package main 

import (
    "os" 
    "path/filepath" 
    "strings" 
) 

var files []os.FileInfo 

func walker(path string, info os.FileInfo, err error) error { 
    if strings.HasSuffix(info.Name(), ".txt") { 
     files = append(files, info) 
    } 
    return nil 
} 

func main() { 
    err := filepath.Walk("/tmp/foo", walker) 
    if err != nil { 
     println("Error", err) 
    } else { 
     for _, f := range files { 
      println(f.Name()) 
      // This is where we'd like to open the file 
     } 
    } 
} 

有沒有辦法來FileInfo轉換爲* File?我實際使用的代碼不是基於filepath.Walk;但我確實收到了[]os.FileInfo切片。我仍然有根目錄和文件名,但似乎在這個階段已經有了更多的子樹信息。

+1

你有沒有試過存儲'walker' func的路徑?這會給你完整的路徑,包括子目錄和文件名。也許可以使用map [string] os.FileInfo來將路徑存儲爲密鑰,然後使用它來打開文件。 –

+0

我知道那會給我完整的路徑,我會很好。正如我在問題中所說的,我實際上並沒有使用filepath.Walk,所以當時沒有路徑字符串。 –

+2

我實際上使用的代碼使用了ioutil.ReadDir,比這裏的例子更難看。雖然我知道我有更高級別的問題的解決方案(即,走一個目錄樹,並存儲路徑),但我的具體問題是,如果我需要做所有重構,或者如果有一個簡單的方法os.FileInfo到os.File? –

回答

9

編號FileInfo接口根本沒有公開路徑,並且osioutil包中的所有提供的方法都將路徑名接受爲字符串。

3

不,不能用FileInfo打開文件。 os.Open只需要一個字符串。您應始終擁有路徑或父路徑,因爲這是獲取FileInfo的唯一方法。