Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Susun muat turun anda dalam GO

Susun muat turun anda dalam GO

Linda Hamilton
Linda Hamiltonasal
2024-10-31 05:44:30966semak imbas

Organizador de seus downloads em GO

Helo, ion di sini lagi.

Ketakutan untuk mempelajari sesuatu yang akan dicapai oleh AI suatu hari nanti membuatkan saya benar-benar tertekan. Tetapi, jika "menyelesaikan masalah" masih menjadi keperluan yang dikenakan kepada manusia pada masa hadapan, mengapa tidak berterusan?

Kali ini saya bawakan tutorial lagi. Kurang berguna daripada yang pertama. Jadi mari kita tentukan struktur "masalah", kerana kita sudah tahu satu perkara: mereka yang tidak mempunyai masalah, itu kerana mereka tidak kelihatan cukup. Dan bagi mereka yang belum menemuinya, tinggal masa sahaja sebelum mereka boleh menciptanya.

Struktur projek

Struktur program yang paling mudah ialah:

  • Imbas folder (contohnya folder muat turun atau direktori lain)
  • Kenal pasti jenis setiap fail dalam direktori yang berkenaan
  • Alihkan fail ke subfolder yang sepadan dengan jenisnya (imej, video, dokumen...)

Memulakan projek

Buat direktori dan navigasi ke dalamnya:

mkdir organizador
cd organizador

Buat fail organizer.go dan mulakan modulnya:

touch organizador.go
go mod init organizador.go

Anda sepatutnya mempunyai sesuatu yang lebih kurang seperti ini:

~/organizador
.
├── go.mod
└── organizador.go

Bahagian 1: Menyemak sama ada direktori wujud

Mari kita takrifkan directorydirOrigem sumber di mana kita akan melaksanakan organisasi. Dengan ditakrifkan, mari semak sama ada ia benar-benar wujud, jika tidak, kami akan mengembalikan ralat:

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)
    }
}

Sekarang, mari kita buat beberapa pertimbangan tentang kod di atas:

  • Fungsi os.Stat mengembalikan dua nilai jenis os.FileInfo dan error err.
  1. FileInfo ialah antara muka yang mengembalikan maklumat fail terperinci, yang dalam kes ini, kami tidak perlukan. Oleh itu, untuk mengabaikan antara muka ini, kami menggunakan _,. Walau bagaimanapun, kami tidak mahu mengabaikan ralat: if _, err := ...
  2. Kami menghantar ralat ralat sebagai parameter kepada fungsi os.IsNotExist(), kerana jika direktori tidak wujud, fungsi os.Stat() akan mengembalikan ralat NOT NULL, menyebabkan os. .IsNotExist() mengembalikan benar, melaksanakan mesej kami: BAD DIR :(
  3. Jika os.IsNotExist() mengembalikan palsu, kami akan mencetak mesej daripada syarat lain: GOOD DIR :)

Bahagian 2: Konsep fungsi panggil balik adalah gila, kawan!

Adakah anda perasan bahawa di sini kita akan pergi sedikit demi sedikit dan menikmati bit dan bait bunyi papan kekunci mekanikal. _Tchaka tchaka boom! _

Dan sekarang kita akan mencipta fungsi panggil balik. Sesuatu yang sebenarnya saya tidak pernah pelajari atau tidak pernah cukup ingin tahu untuk mempersoalkan sama ada saya pernah menggunakan konsep ini dalam mana-mana kod Python dalam kehidupan pra-golang saya.

Fungsi panggil balik ialah fungsi yang dihantar dengan argumen kepada fungsi lain.

Jika anda sudah biasa dengan konsepnya, tahniah, jika tidak, tahniah. Dalam erti kata lain, tahniah!

Sekarang mari buat failpath.Walk fungsi panggil balik yang akan dihantar sebagai hujah kepada fungsi lain.

mkdir organizador
cd organizador
touch organizador.go
go mod init organizador.go

Tetapi tunggu, bagaimana failpath.Walk memanggil Fungsi Panggilan Balik?

Apabila anda memanggil filepath.Walk(sourcedir, listFiles), fungsi filepath.Walk melakukan tugas berat berjalan melalui semua fail dan subdirektori dalam sourcedir.

Untuk setiap fail atau direktori yang ditemui, ia memanggil fungsi listFiles dengan tiga argumen:

  • laluan: Laluan penuh ke fail atau direktori semasa.
  • maklumat: objek os.FileInfo yang mengandungi maklumat tentang fail/direktori (seperti nama, sama ada direktori, saiz, dll.).
  • err: ralat, jika berlaku masalah semasa mengakses fail atau direktori ini.

Go secara automatik memahami bahawa listFiles mesti menerima tiga parameter ini kerana filepath.Walk menjangkakan fungsi yang mengikuti tandatangan ini dengan tepat:

~/organizador
.
├── go.mod
└── organizador.go

Perhatikan bahawa fungsi Walk mengembalikan ralat! Ini relevan!

Itulah sebabnya kami menyamakan laluan fail fungsi kami.Walk(dirOrigem,listarArquivos) dengan ralat:

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)
    }
}

Lagipun, kerana ia mengembalikan ralat, ia adalah ralat XD

Contoh dalam Tindakan

Berikut ialah pandangan yang lebih terperinci tentang perkara yang berlaku pada setiap langkah:

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)
    }
}

Untuk setiap fail atau direktori dalam dirOrigem, filepath.Walk akan memanggil listFiles seolah-olah seperti ini:

// 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
}

Dalam contoh ini, untuk setiap panggilan:

  • laluan: menerima laluan fail atau direktori.
  • maklumat: mengandungi maklumat tentang item ini (seperti nama dan jenis).
  • err: digunakan untuk menangkap sebarang ralat tertentu semasa mengakses fail/direktori.

Fungsi panggil balik

listFiles ialah fungsi panggil balik yang laluan fail.Walk memanggil secara automatik dengan nilai ini. Dengan cara ini, kita tidak perlu risau tentang menetapkan laluan, maklumat dan nilai ralat; filepath.Walk sudah melakukan ini untuk kita.

PHE!

Sekarang lakukan ujian nakal itu pada terminal anda:

// Função Walk()
func Walk(root string, walkFn WalkFunc) error

// Tipo WalkFunc
type WalkFunc func(path string, info os.FileInfo, err error) error

Anda boleh mendapatkan hasilnya:

err := filepath.Walk(dirOrgiem, listarArquivos)

Atau:

//Percorrer e listar os arquivos no diretório
err := filepath.Walk(dirOrigem, listarArquivos)

Dalam kes ini, saya hanya meletakkan "s" tambahan dalam "Muat Turun" supaya dir Asal tidak betul.

Sekarang padamkan fungsi listFiles, kerana kami tidak akan menggunakannya.

Bergurau sahaja, kami hanya akan menukar namanya dan menambah logik lain.

BAHAGIAN 3: ORGANIZED != ORGANIZED

Tersusun itu bagus, mengatur itu hebat.

Selepas pemerhatian cemerlang saya ini, mari kita beralih ke bahagian yang benar-benar menarik minat kita: mengatur semuanya.

Sebagai ironi dalam kehidupan, sebelum menyusun fail, kita perlu menyusun idea untuk langkah seterusnya.

Fungsi seterusnya kami pada asasnya memerlukan:

  • Buat subfolder berdasarkan sambungan setiap fail dalam direktori dirOrigem kami, jika ia tidak wujud.
  • Alihkan fail ke folder masing-masing mengikut sambungannya.
  • Tetapi jika fail sudah berada dalam subfolder penyusun, ia tidak sepatutnya menciptanya lagi.

Mari kita fahami apa yang dilakukan oleh setiap bahagian kod ini:

mkdir organizador
cd organizador

Struktur fungsi organizeFiles

Fungsi organizeFiles dipanggil untuk setiap fail atau folder yang terdapat dalam struktur direktori. Ia menyemak syarat untuk menyusun setiap fail berdasarkan sambungannya, mencipta subfolder dan memindahkan fail jika perlu.

touch organizador.go
go mod init organizador.go

Di sini, fungsi organizeFiles mengambil tiga parameter:

  • laluan: laluan penuh ke fail atau direktori semasa.
  • info: maklumat fail atau direktori, diperoleh daripada jenis os.FileInfo.
  • err: kemungkinan ralat yang mungkin berlaku semasa cuba mengakses item.

Semakan pertama ialah sama ada terdapat ralat semasa mengakses fail/direktori. Jika ya, ia dikembalikan serta-merta.

Menapis fail dan mengabaikan direktori tersembunyi

~/organizador
.
├── go.mod
└── organizador.go

Coretan ini membuat dua semakan:

  • !info.IsDir(): menyemak sama ada item itu bukan direktori (iaitu, ia adalah fail).
  • !strings.HasPrefix(info.Name(), "."): menyemak sama ada nama fail tidak bermula dengan ".", mengabaikan fail tersembunyi pada sistem berasaskan Unix.

Jika kedua-dua syarat dipenuhi, fail dipaparkan dengan fmt.Println.

Mengenal pasti sambungan fail dan mencipta nama subfolder

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)
    }
}

Di sini:

  • strings.ToLower(filepath.Ext(info.Name())): mengekstrak sambungan fail (cth. .txt) dan mengubahnya kepada huruf kecil untuk memastikan konsistensi.
  • subfolder := filepath.Join(sourcedir, extension[1:]): mencipta laluan penuh subfolder di mana fail akan dialihkan. Sambungan[1:] mengalih keluar titik mula (.) daripada sambungan, membentuk nama subfolder, seperti txt.

Mencipta subfolder jika ia belum wujud

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)
    }
}

Di sini, fungsinya:

  • Semak sama ada subfolder sudah wujud menggunakan os.Stat.
  • Jika subfolder tidak wujud (os.IsNotExist(err)), ia dicipta dengan os.Mkdir(subfolder, os.ModePerm).
  • os.ModePerm menetapkan kebenaran lalai untuk folder baharu. Jika terdapat ralat semasa mencipta folder, ia dipaparkan dan dikembalikan.

Menetapkan laluan destinasi fail

mkdir organizador
cd organizador

Pada ketika ini, destinationPath mewakili laluan terakhir di mana fail akan dialihkan. Ia dibina menggunakan failpath.Join, untuk menyertai laluan subfolder ke nama fail.

Menyemak sama ada fail sudah berada dalam folder destinasi

touch organizador.go
go mod init organizador.go
  • Coretan ini membandingkan laluan destinasi dengan laluan fail semasa. Jika ia adalah sama, ini bermakna fail sudah berada dalam subfolder yang betul, jadi ia diabaikan dengan mesej (fmt.Printf).
  • Jika tidak, os.Rename(path, destinationPath) mengalihkan fail ke subfolder. Jika terdapat ralat semasa pemindahan, ia dikembalikan.

Ringkasan Akhir

Fungsi:

  1. Tatal melalui direktori, semak setiap item.
  2. Abaikan direktori dan fail tersembunyi.
  3. Menentukan sambungan fail dan dengan itu subfolder destinasi.
  4. Buat subfolder (jika ia belum wujud).
  5. Mengalih fail ke subfolder melainkan ia sudah ada.

Menggunakan filepath.Walk(dirOrigem, organizeFiles) menghantar fungsi ini kepada setiap fail dalam direktori, menyebabkan mereka semua disusun secara automatik.

Kod ini sesuai dengan fungsi organisasi fail kerana ia mengendalikan penciptaan dan logik pergerakan dalam satu fungsi – bentuk struktur yang cekap dan teratur.

REPO: https://github.com/ionnss/organizador


***Satu hari lagi di bumi,
ion

Atas ialah kandungan terperinci Susun muat turun anda dalam GO. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn