Проверьте, не существует ли расширение файла в каталоге, используя Go - PullRequest
2 голосов
/ 25 февраля 2020

Я пытаюсь проверить, нет ли в каталоге файла с расширением .rpm. Я не буду знать заранее, какое имя файла, и в каждом каталоге будет несколько файлов.

Вот мой код:

import {
    "fmt"
    "os"
    "path/filepath"
}

func main() {
    dirname := "." + string(filepath.Separator)

    d, err := os.Open(dirname)
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    defer d.Close()

    files, err := d.Readdir(-1)
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }

    fmt.Print("\n" + "Reading " + dirname)

    for _, file := range files {
        if file.Mode().IsRegular() {
            // TODO: if rpm file not present, print no rpm file found
            if filepath.Ext(file.Name()) == ".rpm" {
                fmt.Println(file.Name() + "\n")
                f, err := os.Open(file.Name())
                if err != nil {
                    panic(err)
                }
            }
        }
    }
}

Приведенный выше код откроет любые файлы .rpm в текущем каталоге. ,

Я хочу проверить следующее: если файл «.rpm» не существует в списке файлов текущего каталога, выведите «rpm not not» и os.Exit.

Я пробовал этот код:

if filepath.Ext(file.Name()) != ".rpm" {
    fmt.Println("no rpm found")
}

и я пытался использовать

if filepath.Ext(file.Name()) == ".rpm" {
    ... *code above* ...
} else {
    fmt.Println("ERR: RPM file does not exist")
}

Я сталкиваюсь с ошибкой, где, если другие файлы присутствуют без расширения .rpm, тогда появится сообщение об ошибке.

Как я могу go сделать это без предварительного указания имени файла?

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Если ни один из файлов не имеет расширения .rpm, нельзя сказать ни за одну итерацию. Вы можете сказать это наверняка только после проверки всех файлов.

Поэтому вместо того, чтобы пытаться втиснуть это в l oop, сохраните переменную found, которую вы можете обновить при обнаружении файла .rpm .

found := false // Assume false for now
for _, file := range files {
    if file.Mode().IsRegular() {
        if filepath.Ext(file.Name()) == ".rpm" {
            // Process rpm file, and:
            found = true
        }
    }
}

if !found {
    fmt.Println("rpm file not found")
}

Если вам нужно только обработать файл 1 .rpm, тогда управление "состоянием" (переменная found) не потребуется. Вы можете вернуться, если нашли и обработали файл .rpm, и если дойдете до конца l oop, вы узнаете, что не было никакого файла rpm:

for _, file := range files {
    if file.Mode().IsRegular() {
        if filepath.Ext(file.Name()) == ".rpm" {
            // Process rpm file, and:
            return
        }
    }
}

// We returned earlier if rpm was found, so here we know there isn't any:
fmt.Println("rpm file not found")
0 голосов
/ 25 февраля 2020

Попробуйте это

...
splitted := strings.Split(file.Name(), ".")
lenSplit := len(splitted)
if lenSplit > 1 && splitted[lenSplit-1] == "rpm" {
  // file with extension
}
...
  1. Разделить имя файла по "."
  2. Go до последней строки в массиве строк
  3. Проверьте, если последнее совпадение строк "rpm"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...