man.go
package main
import (
"bufio"
"fmt"
"os"
"os/exec"
"path/filepath"
"regexp"
)
const (
// 検索対象のパス。検索したいフォルダのパスを指定する
Root = `xxx\xxx\xxx`
// コピーしたフォルダを指定
DestPath = `xxx\xxx\`
)
var (
// マッチしたファイルを追加するため変数
file string
// 検索ワードを正規表現化して入れておく変数
re *regexp.Regexp
)
// filepath.Walk に渡す関数
func visit(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
// ファイル検索
if !info.IsDir() && re.MatchString(info.Name()) {
//同じファイルがあっても上書き
file = path
}
return nil
}
func search(checkFile string) error {
// 正規表現
var err error
re, err = regexp.Compile(checkFile)
if err != nil {
fmt.Fprintf(os.Stderr, "error: %s\n", err)
os.Exit(1)
}
err = filepath.Walk(Root, visit)
if err != nil {
return err
}
// マッチしたファイルがなければ終了する
if len(file) == 0 {
return fmt.Errorf("file not matched")
}
// ファイルのコピー
/* このやり方だと、コピーではなく転記になる
w, err := os.Create(DestPath + checkFile)
if err != nil {
log.Fatal(err)
}
r, err := os.Open(file)
if err != nil {
log.Fatal(err)
}
_, err = io.Copy(w, r)
if err != nil {
log.Fatal(err)
}
*/
cmd := exec.Command("cmd.exe", "/C", "copy", "/Y", file, DestPath)
cmd.Start()
return nil
}
func main() {
fmt.Println("ファイル読み取り処理を開始します")
// 検索対象のファイル名が記載されたファイルをOpenする
f, err := os.Open("xxxx.txt")
// 読み取り時の例外処理
if err != nil {
fmt.Println("error")
}
// 関数が終了した際に確実に閉じるようにする
defer f.Close()
// 1行づつ読込む
scanner := bufio.NewScanner(f)
for scanner.Scan() {
// 一行ずつ処理
err = search(scanner.Text())
if err != nil {
fmt.Fprintf(os.Stderr, "error: %s\n", err)
}
}
}