簡體   English   中英

轉到-遍歷當前目錄中的Directores /文件

[英]Go - Iterate through directores/files in current directory

我有以下結構:

project/
    docs/
        index.html
    root.html

我正在嘗試遍歷此項目結構,以便可以讀取每個文件的內容以對其進行處理。 所以我想說“搜索目錄項目”,然后它將搜索所有文件,並且僅搜索第一級目錄及其文件,因此,如果在docs/內有另一個目錄包含文件,它將忽略它。

目前,我嘗試使用“ path / filepath”庫來完成此操作:

func traverse(path string, file os.FileInfo, err error) error {
    if file, err := os.Open(file.Name()); err == nil {
        defer file.Close()
        if fileStat, err := file.Stat(); err == nil {
            switch mode := fileStat.Mode(); {
            case mode.IsDir():
                fmt.Println("it be a directory! lets traverse", file.Name())
                filepath.Walk(file.Name(), traverse)
            case mode.IsRegular():
                fmt.Println("the thingy ", file.Name(), " is a file")
            }
        } else {
            return errors.New("failed to check status")
        }
    }
    return errors.New("failed 2 open file/dir?")
}

然后我從這里調用它:

if err := filepath.Walk("project/", traverse); err != nil {
    setupErr("%s", err)
}

請注意,我相對於我的測試目錄運行此可執行文件,因此它可以找到該目錄。 我的問題實際上是在運行它時,我得到以下信息:

it be a directory! lets traverse project
it be a directory! lets traverse project
# ^ printed about 20 more times ^
failed 2 open file/dir?

我認為我的遞歸有些差了,也許沒有更改到目錄中? 任何想法,如果您需要更多信息,請詢問,我會更新。

首先,看起來您想要做什么與您的代碼相矛盾。 你寫了:

因此,我想說“搜索目錄項目”,然后它將搜索所有文件,並且僅搜索第一級目錄及其文件,因此,如果在docs /中存在另一個帶有文件的目錄,它將忽略它。

這是否意味着您只想迭代兩級目錄(當前目錄和下一級),而忽略其余目錄?

如果是這樣,則您不需要遞歸,只需執行一個簡單循環即可對當前目錄中的文件及其每個子目錄執行搜索功能。

您擁有的代碼遍歷文件系統目錄子樹。

基本上,您使用的filepath.Walk應該為您完成。 因此,您可以實施遞歸步行,也可以使用步行,但不能同時使用兩者。

其次,遞歸在您的代碼中實現不正確。 它缺少對目錄的迭代。

因此,打印當前目錄及其子目錄(但不包括其他子目錄)中文件名的代碼為:

package main

import (
    "fmt"
    "io/ioutil"
)

func main() {
    items, _ := ioutil.ReadDir(".")
    for _, item := range items {
        if item.IsDir() {
            subitems, _ := ioutil.ReadDir(item.Name())
            for _, subitem := range subitems {
                if !subitem.IsDir() {
                    // handle file there
                    fmt.Println(item.Name() + "/" + subitem.Name())
                }
            }
        } else {
            // handle file there
            fmt.Println(item.Name())
        }
    }
}

Walk遍歷以root為根的文件樹,為樹中的每個文件或目錄( 包括root)調用walkFn walkFn會過濾訪問文件和目錄時出現的所有錯誤。 這些文件以詞法順序進行遍歷,這使輸出具有確定性,但是這意味着對於非常大的目錄,遍歷可能效率不高。 步行不遵循符號鏈接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM