Maison >développement back-end >Golang >Organisez vos téléchargements dans GO
Bonjour, ions encore ici.
La peur d’apprendre quelque chose qu’une IA accomplira un jour me laisse complètement angoissée. Mais, si « résoudre des problèmes » est encore une exigence imposée aux êtres humains du futur, pourquoi ne pas persister ?
Cette fois, j'apporte un autre tutoriel. Moins inutile que le premier. Définissons donc les structures des « problèmes », car on sait déjà une chose : ceux qui n'ont pas de problèmes, c'est parce qu'ils n'ont pas assez regardé. Et pour ceux qui ne les ont pas encore trouvés, ce n'est qu'une question de temps avant qu'ils puissent les créer.
La structure la plus simple du programme est :
Créez un répertoire et accédez-y :
mkdir organizador cd organizador
Créez un fichier organiser.go et démarrez ses modules :
touch organizador.go go mod init organizador.go
Vous devriez avoir quelque chose comme ça plus ou moins :
~/organizador . ├── go.mod └── organizador.go
Définissons le répertoire sourcedirOrigem dans lequel nous allons effectuer l'organisation. Une fois défini, vérifions s'il existe réellement, sinon nous renverrons une erreur :
package main import ( "fmt" "os" ) // Defina o deretório o qual você quer organizar como variável global var dirOrigem string := "/Users/User/Downloads" // Troque o diretório func main() { // Verificar se o diretório existe, caso contrário, retornar erro if _, err := os.Stat(dirOrigem); os.IsNotExist(err) { fmt.Println("BAD DIR :( \nDiretório não encontrado: ", dirOrigem) return } else { // Imprimir mensagem caso o diretório exista fmt.Println("GOOD DIR :) \nDiretório encontrado: ", dirOrigem) } }
Maintenant, faisons quelques considérations sur le code ci-dessus :
Avez-vous remarqué qu'ici, nous y allons petit à petit et profitons des bits et des octets au son du clavier mécanique. _Tchaka tchaka boum ! _
Et maintenant nous allons créer une fonction de rappel. Quelque chose que je n'avais jamais réellement entendu parler, ou que je n'ai jamais été assez curieux pour me demander si j'avais déjà utilisé ce concept dans un code Python dans ma vie avant Golang.
Une fonction de rappel est une fonction passée avec un argument à une autre fonction.
Si vous connaissez déjà le concept, bravo, sinon, bravo. En d’autres termes, félicitations !
Créons maintenant une fonction de rappel filepath.Walk qui sera passée en argument à une autre fonction.
mkdir organizador cd organizador
touch organizador.go go mod init organizador.go
Mais attendez, comment filepath.Walk appelle-t-il la fonction de rappel ?
Lorsque vous appelez filepath.Walk(sourcedir, listFiles), la fonction filepath.Walk fait le gros du travail en parcourant tous les fichiers et sous-répertoires de sourcedir.
Pour chaque fichier ou répertoire trouvé, il appelle la fonction listFiles avec trois arguments :
Go comprend automatiquement que listFiles doit recevoir ces trois paramètres car filepath.Walk attend une fonction qui suit exactement cette signature :
~/organizador . ├── go.mod └── organizador.go
Remarquez que la fonction Walk renvoie une erreur ! C'est pertinent !
C'est pourquoi nous assimilons notre fonction filepath.Walk(dirOrigem,listarArquivos) à une erreur :
package main import ( "fmt" "os" ) // Defina o deretório o qual você quer organizar como variável global var dirOrigem string := "/Users/User/Downloads" // Troque o diretório func main() { // Verificar se o diretório existe, caso contrário, retornar erro if _, err := os.Stat(dirOrigem); os.IsNotExist(err) { fmt.Println("BAD DIR :( \nDiretório não encontrado: ", dirOrigem) return } else { // Imprimir mensagem caso o diretório exista fmt.Println("GOOD DIR :) \nDiretório encontrado: ", dirOrigem) } }
Après tout, parce qu'il renvoie une erreur, c'est une erreur XD
Voici un aperçu plus détaillé de ce qui se passe à chaque étape :
func main() { // Restante do código . . . // Percorrer e listar os arquivos no diretório dirOrigem err := filepath.Walk(dirOrigem, listarArquivos) if err != nil { fmt.Println("Erro ao percorrer o diretório: ", err) } }
Pour chaque fichier ou répertoire de dirOrigem, filepath.Walk appellera listFiles comme s'il s'agissait de quelque chose comme ceci :
// Função que lista os arquivos do diretório func listarArquivos(caminho string, info os.FileInfo, err error) error { if err != nil { return err } // Ignorar diretórios e exibir apenas arquivos if !info.IsDir() && !strings.HasPrefix(info.Name(), ".") { fmt.Println("Arquivo encontrado: ", info.Name()) } return nil }
Dans cet exemple, pour chaque appel :
listFiles est une fonction de rappel que filepath.Walk appelle automatiquement avec ces valeurs. De cette façon, nous n'avons pas à nous soucier de définir les valeurs de chemin, d'information et d'erreur ; filepath.Walk le fait déjà pour nous.
PHE !
Maintenant, faites ce test coquin sur votre terminal :
// Função Walk() func Walk(root string, walkFn WalkFunc) error // Tipo WalkFunc type WalkFunc func(path string, info os.FileInfo, err error) error
Vous pouvez avoir le résultat :
err := filepath.Walk(dirOrgiem, listarArquivos)
Ou :
//Percorrer e listar os arquivos no diretório err := filepath.Walk(dirOrigem, listarArquivos)
Dans ce cas, j'ai juste mis un "s" supplémentaire dans "Téléchargements" pour que le répertoire Origin soit incorrect.
Supprimez maintenant la fonction listFiles, car nous n'allons pas l'utiliser.
Je plaisante, on va juste changer son nom et ajouter une autre logique.
Organisé c'est bien, organiser c'est génial.
Après cette brillante observation de ma part, passons à la partie qui nous intéresse vraiment : organiser le tout.
Comme ironie de la vie, avant d'organiser les dossiers, il faut organiser nos idées pour les prochaines étapes.
Notre prochaine fonction a essentiellement besoin de :
Comprenons ce que fait chaque partie de ce code :
mkdir organizador cd organizador
La fonction organiseFiles est appelée pour chaque fichier ou dossier trouvé dans la structure de répertoires. Il vérifie les conditions pour organiser chaque fichier en fonction de son extension, créant des sous-dossiers et déplaçant les fichiers si nécessaire.
touch organizador.go go mod init organizador.go
Ici, la fonction organiseFiles prend trois paramètres :
La première vérification est de savoir s'il y a une erreur lors de l'accès au fichier/répertoire. Si tel est le cas, il est restitué immédiatement.
~/organizador . ├── go.mod └── organizador.go
Cet extrait effectue deux vérifications :
Si les deux conditions sont remplies, le fichier s'affiche avec fmt.Println.
package main import ( "fmt" "os" ) // Defina o deretório o qual você quer organizar como variável global var dirOrigem string := "/Users/User/Downloads" // Troque o diretório func main() { // Verificar se o diretório existe, caso contrário, retornar erro if _, err := os.Stat(dirOrigem); os.IsNotExist(err) { fmt.Println("BAD DIR :( \nDiretório não encontrado: ", dirOrigem) return } else { // Imprimir mensagem caso o diretório exista fmt.Println("GOOD DIR :) \nDiretório encontrado: ", dirOrigem) } }
Ici :
func main() { // Restante do código . . . // Percorrer e listar os arquivos no diretório dirOrigem err := filepath.Walk(dirOrigem, listarArquivos) if err != nil { fmt.Println("Erro ao percorrer o diretório: ", err) } }
Ici, la fonction :
mkdir organizador cd organizador
À ce stade, destinationPath représente le chemin final où le fichier sera déplacé. Il est construit en utilisant filepath.Join, pour joindre le chemin du sous-dossier au nom de fichier.
touch organizador.go go mod init organizador.go
La fonction :
En utilisant filepath.Walk(dirOrigem, organiseFiles) transmet cette fonction à chaque fichier du répertoire, ce qui entraîne leur organisation automatique.
Ce code s'adapte bien à une fonction d'organisation de fichiers car il gère la logique de création et de déplacement dans une seule fonction – une forme de structure efficace et organisée.
REPO : https://github.com/ionnss/organizador
***Un autre jour sur terre,
ions
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!