GoLang与Slices的字符串比较

时间:2015-03-30 00:46:21

标签: go

我能够从目录中获取文件和文件夹列表,如果路径是目录,我已经写了一个名为isDir的函数返回True。

现在我的问题是我想确保列出的所有文件夹都不匹配切片中的字符串列表。我的代码可能会跳过第一场比赛,但无论如何都会打印出其他所有内容。我需要处理不可避免的文件夹。

代码适用于Windows 7/8目录,但如果提供了一个Linux样本,我应该能够正常工作。

package main

import (
    "fmt"
    "io/ioutil"
    "os"
    "strings"
)

func isDir(pth string) (bool) {
         fi, err := os.Stat(pth)
         if err != nil {
                 return false
         }
         return fi.Mode().IsDir()
}

func main() {
    gcomputer := "localhost"
    location := fmt.Sprintf("\\\\%s\\c$\\Users\\", gcomputer)
    // Profiles to avoid
    avoid := []string{"Administrator", "Default", "Public"}
    // walk through files & folders in the directory (location) & return valid profiles
    files, _ := ioutil.ReadDir(location)
    for _, f := range files {
        fdir := []string{location, f.Name()}
        dpath := strings.Join(fdir, "")

        if isDir(dpath) {
            for _, iavoid := range avoid {
                for iavoid != f.Name() {
                    fmt.Println(dpath)
                    break
                }
                break
            }
        }
    }
}

我不介意使用第三方模块,我一直在研究这个问题并且开始失去我的冷静,使得理解文档有点困难。任何提示将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:1)

如果要避免的字符串列表变大,您可能不希望为每个目录迭代它们。我可以建议对@ peterSO的回答进行一些修改:

package main

import (
    "fmt"
    "io/ioutil"
)

var avoidanceSet = map[string]bool{
    "Administrator": true,
    "Default": true,
    "Public": true,
}

func avoid(name string) bool {
    _, inSet := avoidanceSet[name]
    return inSet
}

func main() {
    gcomputer := "localhost"
    location := fmt.Sprintf("\\\\%s\\c$\\Users\\", gcomputer)
    files, err := ioutil.ReadDir(location)
    if err != nil {
        fmt.Println(err)
        return
    }
    for _, f := range files {
        if f.IsDir() && !avoid(f.Name()) {
            dpath := location + f.Name()
            fmt.Println(dpath)
        }
    }
}

答案 1 :(得分:0)

例如,

package main

import (
    "fmt"
    "io/ioutil"
)

func avoid(name string) bool {
    profiles := []string{"Administrator", "Default", "Public"}
    for _, p := range profiles {
        if name == p {
            return true
        }
    }
    return false
}

func main() {
    gcomputer := "localhost"
    location := fmt.Sprintf("\\\\%s\\c$\\Users\\", gcomputer)
    files, err := ioutil.ReadDir(location)
    if err != nil {
        fmt.Println(err)
        return
    }
    for _, f := range files {
        if f.IsDir() && !avoid(f.Name()) {
            dpath := location + f.Name()
            fmt.Println(dpath)
        }
    }
}