-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
70 lines (64 loc) · 1.54 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package main
import (
"path/filepath"
"os"
"fmt"
"crypto/rand"
"github.com/secsy/goftp"
"time"
)
// Configuracao do client ftp
var configura = goftp.Config{
User: "client", // User Ftp
Password: "password", // Password Ftp
ConnectionsPerHost: 10,
Timeout: 10 * time.Second,
Logger: os.Stderr,
}
var client, err = goftp.DialConfig(configura, "ip_ftp") // Informe IP ou dominio do ftp
var maxid = 3 // Aqui voce pode definir quantas go rotines vao executar de uma unica vez
var id = 0
func main() {
fmt.Println("Por favor aguarde o analise da pasta...")
checkErr(err)
defer client.Close()
searcDir := "./" // Pasta onde ele vai comecar a analisar os arquivos
filepath.Walk(searcDir, func(path string, f os.FileInfo, err error) error { // A funcao filepath.Walk faz um analise na pasta e subpastas te retornando o caminho completo
if f.IsDir() == false {
ext := filepath.Ext(path)
if ext == ".xml" {
id++
go sendFtpFile(path,ext)
}
wait()
}
fmt.Println(path)
return nil
})
}
// Funcao de analise da extensao e envio do arquivo
func sendFtpFile(file string, ext string) {
arq := make([]byte, 12)
rand.Read(arq)
arq2 := fmt.Sprintf("%X", arq)
b, err := os.Open(file)
checkErr(err)
client.Store(arq2+"."+ext, b)
fmt.Println(file+" - ", arq2+"."+ext)
id--
}
// Funcao para fazer checagem de erro
func checkErr(err error) {
if err != nil {
panic(err.Error())
}
}
func wait() {
for {
if id >= maxid {
time.Sleep(1 * time.Second)
} else {
return
}
}
}