cari
Rumahpembangunan bahagian belakangGolangSusun desktop anda: Bina pengatur fail dalam Go.

Adakah desktop anda huru-hara? Adakah anda mempunyai pelbagai jenis fail yang mengacaukan desktop atau direktori muat turun anda? Mari kita betulkan dengan skrip mudah.

Seperti yang kami lakukan pada permulaan sebarang projek go, kami menjana fail go.mod kami dengan arahan "go mod init". Untuk memastikan perkara mudah, kami akan menulis semua logik kami dalam fail main.go kami.

Mari kita bercakap sedikit tentang bagaimana kita akan menyukai skrip untuk berkelakuan sebelum kita menulis sebarang kod. Kami mahu dapat menyusun fail kami ke dalam direktori yang menunjukkan jenis fail atau tarikh penciptaan. Ringkasnya, kami mahu skrip kami mengisih fail video ke dalam direktori video, fail muzik ke dalam direktori muzik dan sebagainya; atau mengisih semua fail yang dibuat pada tarikh tertentu ke dalam direktori yang sama.

Sekarang mari kita kod:

Buat fail main.go dan tulis yang berikut:

package main

type fileAnalyzer interface {
    analyzeAndSort() error
}

func analyze(fa fileAnalyzer) error {
    return fa.analyzeAndSort()
}

Oleh kerana kami mahu program kami mengisih fail mengikut kriteria yang berbeza, kami mencipta antara muka Penganalisis fail yang mentakrifkan kaedah: analyzeAndSort.
Kemudian kami menulis fungsi: analisis - yang mengambil mana-mana struct yang melaksanakan antara muka fileAnalyzer sebagai hujah dan melaksanakan kaedah analisisAndSortnya.

Dalam beberapa kes seperti yang akan kita lihat dalam program ini, mungkin terdapat fail tertentu yang anda tidak mahu dialihkan. Contohnya, semasa menguji skrip, kami tidak mahu atur cara mengalihkan fail go kami atau boleh laku/perduaan ke dalam direktori lain. Untuk mengelakkan perkara ini berlaku, kami perlu membuat senarai hitam yang merangkumi semua fail yang kami ingin kekal tidak disentuh.

Dalam fail main.go kami, tulis yang berikut:

var blacklist = []string{
    "go",
    "mod",
    "exe",
    "ps1",
}

Di sini, saya menambahkan sambungan fail untuk fail yang saya ingin kekalkan tidak diisih. ".go" dan ".mod" ialah sambungan untuk fail go. Kerana saya menggunakan mesin windows, binari saya akan mempunyai ".exe" sebagai sambungannya. Saya turut sertakan ".ps1" kerana saya suka bekerja dengan skrip powershell dalam pembangunan - seperti yang anda akan lihat.

Seterusnya, kami menulis beberapa fungsi pembantu.

func getFileExtension(name string) string {
    return strings.TrimPrefix(filepath.Ext(name), ".")
}

func listFiles(dirname string) ([]string, error) {
    var files []string

    list, err := os.ReadDir(dirname)
    if err != nil {
        return nil, err
    }

    for _, file := range list {
        if !file.IsDir() {
            files = append(files, file.Name())
        }
    }

    return files, nil
}

func listDirs(dirname string) ([]string, error) {
    var dirs []string

    list, err := os.ReadDir(dirname)
    if err != nil {
        return nil, err
    }

    for _, file := range list {
        if file.IsDir() {
            dirs = append(dirs, file.Name())
        }
    }

    return dirs, nil
}

func mkdir(dirname string) error {
    err := os.Mkdir(dirname, 0644)

    if err != nil && os.IsExist(err) {
        return nil
    }

    var e *os.PathError

    if err != nil && errors.As(err, &e) {
        return nil
    }

    return err
}

func moveFile(name string, dst string) error {
    return os.Rename(name, filepath.Join(dst, name))
}

func getCurrentDate(t time.Time) string {
    return t.Format("2006-01-02")
}

func filter[T any](ts []T, fn func(T) bool) []T {
    filtered := make([]T, 0)

    for i := range ts {
        if fn(ts[i]) {
            filtered = append(filtered, ts[i])
        }
    }

    return filtered
}

Kebanyakan ini adalah penjelasan sendiri tetapi saya ingin bercakap tentang fungsi "mkdir". Fungsi "mkdir" mencipta direktori dengan nama yang dihantar kepadanya sebagai argumen - tetapi fungsi itu tidak mengembalikan ralat jika direktori itu sudah wujud atau jika terdapat "os.PathError".

Sekarang mari buat struct yang melaksanakan antara muka Penganalisis fail:

package main

type fileAnalyzer interface {
    analyzeAndSort() error
}

func analyze(fa fileAnalyzer) error {
    return fa.analyzeAndSort()
}

Struktur fileTypeAnalyzer mempunyai dua sifat: wd yang memegang nama direktori kerja semasa dan pemeta. Kekunci pemeta akan menjadi jenis fail yang dikesan manakala nilainya ialah senarai sambungan fail yang dikaitkan dengan kunci. Kami kemudian mencipta fungsi pembina dan menyediakan jenis fail serta sambungan fail bersekutunya kepada pemeta. Jangan ragu untuk menambah lebih banyak jenis fail dan sambungan pada senarai. Kaedah anaylyzeAndSort memanggil beberapa fungsi pembantu dan kaedah yang memetakan sambungan fail kepada jenis fail, mencipta direktori jenis fail dan mengalihkan fail ke dalam direktori tersebut. Saya juga menambahkan folder "misc" untuk menyimpan fail yang tidak ditangkap oleh pemeta - sudah tentu tidak termasuk fail yang disenaraihitamkan.

Kami juga mahu dapat menyusun fail mengikut tarikh penciptaan. Mari buat satu lagi struct yang melaksanakan antara muka fileAnalyzer tetapi menyusun fail mengikut tarikh.

var blacklist = []string{
    "go",
    "mod",
    "exe",
    "ps1",
}

Banyak logiknya adalah sama seperti dari fileTypeAnalyzer. Perbezaan utama ialah kami tidak menyediakan pemeta - sebaliknya kami mendapat tarikh penciptaan daripada maklumat fail dan mencipta direktori dengan sewajarnya.

Sekarang mari kita susun semuanya dalam fungsi utama kita:

func getFileExtension(name string) string {
    return strings.TrimPrefix(filepath.Ext(name), ".")
}

func listFiles(dirname string) ([]string, error) {
    var files []string

    list, err := os.ReadDir(dirname)
    if err != nil {
        return nil, err
    }

    for _, file := range list {
        if !file.IsDir() {
            files = append(files, file.Name())
        }
    }

    return files, nil
}

func listDirs(dirname string) ([]string, error) {
    var dirs []string

    list, err := os.ReadDir(dirname)
    if err != nil {
        return nil, err
    }

    for _, file := range list {
        if file.IsDir() {
            dirs = append(dirs, file.Name())
        }
    }

    return dirs, nil
}

func mkdir(dirname string) error {
    err := os.Mkdir(dirname, 0644)

    if err != nil && os.IsExist(err) {
        return nil
    }

    var e *os.PathError

    if err != nil && errors.As(err, &e) {
        return nil
    }

    return err
}

func moveFile(name string, dst string) error {
    return os.Rename(name, filepath.Join(dst, name))
}

func getCurrentDate(t time.Time) string {
    return t.Format("2006-01-02")
}

func filter[T any](ts []T, fn func(T) bool) []T {
    filtered := make([]T, 0)

    for i := range ts {
        if fn(ts[i]) {
            filtered = append(filtered, ts[i])
        }
    }

    return filtered
}

Kami mengkonfigurasi pembalak; dapatkan direktori kerja semasa untuk diluluskan sebagai hujah kepada pelaksanaan fileAnalyzer kami; buat pembolehubah mod untuk menahan nilai yang dihantar sebagai bendera kepada aplikasi dan penyataan suis untuk mengawal cara kita ingin mengisih. Akhirnya kami memanggil fungsi analisis dan lulus pelaksanaan fileAnalyzer kami sebagai hujah.

Itu sahaja. Mari bina perduaan kami dan uji. Saya memanggil penyusun saya. Anda boleh memanggil nama anda apa sahaja yang anda mahu panggil dengan "go build -o [name]"

Berikut ialah folder yang bersepah dengan fail pelbagai jenis:

Organize your desktop: Build a file organizer in Go.

Mari kita susun mengikut jenis fail:

Organize your desktop: Build a file organizer in Go.

Organize your desktop: Build a file organizer in Go.

Mari kita susun mengikut tarikh penciptaan fail:

Organize your desktop: Build a file organizer in Go.

Organize your desktop: Build a file organizer in Go.

Sebagai bonus, jika anda menggunakan mesin windows dan anda menggunakan powershell - berikut ialah skrip untuk membantu menjadikan ujian program anda tidak kelihatan.

Buat fail task.ps1 dan taip yang berikut:

type fileTypeAnalyzer struct {
    wd     string
    mapper map[string][]string
}

func newFileTypeAnalyzer(wd string) *fileTypeAnalyzer {
    return &fileTypeAnalyzer{
        wd: wd,
        mapper: map[string][]string{
            "video":  {"mp4", "mkv", "3gp", "wmv", "flv", "avi", "mpeg", "webm"},
            "music":  {"mp3", "aac", "wav", "flac"},
            "images": {"jpg", "jpeg", "png", "gif", "svg", "tiff"},
            "docs":   {"docx", "csv", "txt", "xlsx"},
            "books":  {"pdf", "epub"},
        },
    }
}

func (f fileTypeAnalyzer) analyzeAndSort() error {
    files, err := listFiles(f.wd)
    if err != nil {
        return fmt.Errorf("could not list files: %w", err)
    }

    if err := f.createFileTypeDirs(files...); err != nil {
        return err
    }

    return f.moveFileToTypeDir(files...)
}

func (f fileTypeAnalyzer) moveFileToTypeDir(files ...string) error {
    dirs, err := listDirs(f.wd)
    if err != nil {
        return fmt.Errorf("could not list directories: %w", err)
    }

    for _, dir := range dirs {
        for _, file := range files {
            if slices.Contains(f.mapper[dir], strings.ToLower(getFileExtension(file))) {
                if err := moveFile(file, dir); err != nil {
                    return err
                }
            }
        }
    }

    files, err = listFiles(f.wd)
    if err != nil {
        return err
    }

    if len(files) == 0 {
        return nil
    }

    files = filter(files, func(f string) bool {
        return !slices.Contains(blacklist, getFileExtension(f))
    })

    for i := range files {
        if err := f.moveToMisc(files[i]); err != nil {
            return err
        }
    }

    return nil
}

func (f fileTypeAnalyzer) moveToMisc(file string) error {
    if err := mkdir("misc"); err != nil {
        return err
    }

    return moveFile(file, "misc")
}

func (f fileTypeAnalyzer) createFileTypeDirs(files ...string) error {
    for ftype, fvalues := range f.mapper {
        for _, file := range files {
            if slices.Contains(fvalues, getFileExtension(file)) {
                if err := mkdir(ftype); err != nil {
                    return fmt.Errorf("could not create folder: %w", err)
                }
            }
        }
    }

    return nil
}

Untuk membina binari anda dengan skrip:

Organize your desktop: Build a file organizer in Go.

Untuk membatalkan penyusunan fail dengan skrip:

Organize your desktop: Build a file organizer in Go.

Untuk memadam direktori dengan skrip:

Organize your desktop: Build a file organizer in Go.

Atas ialah kandungan terperinci Susun desktop anda: Bina pengatur fail 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
Belajar pergi manipulasi slice byte: Bekerja dengan pakej 'bait'Belajar pergi manipulasi slice byte: Bekerja dengan pakej 'bait'May 16, 2025 am 12:14 AM

TheBytespackageingoisessentialFormanipulatingByteslicesfectively.1) usebytes.jointoconcatenateslices.2) peworkbytes.bufferfordynamicdataconstruction.3) UtilizeindexandContainsForsearching.4)

Cara Menggunakan Pakej 'Pengekodan/PerduaCara Menggunakan Pakej 'Pengekodan/PerduaMay 16, 2025 am 12:14 AM

TouseThe "pengekodan/binari" pakejingoforencodinganddecodingbinarydata, ikutiThesesteps: 1) importThePackageandCreateabuffer.2) usebinary.writetoencodedatainaintotheBuffer, dinyatakan

Bagaimana anda menggunakan pakej 'pengekodan/binari' untuk mengodkan dan menyahkod data binari di GO?Bagaimana anda menggunakan pakej 'pengekodan/binari' untuk mengodkan dan menyahkod data binari di GO?May 16, 2025 am 12:13 AM

Pakej pengekodan/binari menyediakan cara bersatu untuk memproses data binari. 1) Gunakan binary.write dan binari. Baca fungsi untuk mengodkan dan menyahkod pelbagai jenis data seperti integer dan nombor titik terapung. 2) Jenis tersuai boleh dikendalikan dengan melaksanakan antara muka binari.Byteorder. 3) Perhatikan pemilihan endianness, penjajaran data dan pengendalian ralat untuk memastikan ketepatan dan kecekapan data.

Pakej GO Strings: Adakah ia lengkap untuk setiap kes penggunaan?Pakej GO Strings: Adakah ia lengkap untuk setiap kes penggunaan?May 16, 2025 am 12:09 AM

Pakej String Go tidak sesuai untuk semua kes penggunaan. Ia berfungsi untuk operasi rentetan yang paling biasa, tetapi perpustakaan pihak ketiga mungkin diperlukan untuk tugas NLP yang kompleks, pemadanan ekspresi biasa, dan parsing format tertentu.

Apakah had pakej rentetan Go?Apakah had pakej rentetan Go?May 16, 2025 am 12:05 AM

Pakej Strings di GO mempunyai batasan penggunaan dan memori apabila mengendalikan sejumlah besar operasi rentetan. 1) Isu Prestasi: Sebagai contoh, Strings.Replace dan Strings.ReplaceAll kurang cekap apabila berurusan dengan penggantian rentetan berskala besar. 2) Penggunaan memori: Oleh kerana rentetan tidak berubah, objek baru akan dihasilkan setiap operasi, mengakibatkan peningkatan penggunaan memori. 3) Pemprosesan Unicode: Ia tidak cukup fleksibel apabila mengendalikan peraturan Unicode yang kompleks, dan mungkin memerlukan bantuan pakej atau perpustakaan lain.

Manipulasi String Di GO: Menguasai Pakej 'Strings'Manipulasi String Di GO: Menguasai Pakej 'Strings'May 14, 2025 am 12:19 AM

Menguasai pakej Strings dalam bahasa Go dapat meningkatkan keupayaan pemprosesan teks dan kecekapan pembangunan. 1) Gunakan fungsi mengandungi untuk memeriksa substrings, 2) Gunakan fungsi indeks untuk mencari kedudukan substring, 3) Sertai fungsi rentetan rentetan splice dengan cekap, 4) Gantikan fungsi untuk menggantikan substrings. Berhati -hati untuk mengelakkan kesilapan biasa, seperti tidak memeriksa rentetan kosong dan isu prestasi operasi rentetan yang besar.

Pergi 'rentetan' petua pakej dan trikPergi 'rentetan' petua pakej dan trikMay 14, 2025 am 12:18 AM

Anda harus mengambil berat tentang pakej Strings di GO kerana ia dapat memudahkan manipulasi rentetan dan membuat kod lebih jelas dan lebih efisien. 1) Gunakan rentetan.join untuk rentetan splice yang cekap; 2) Gunakan rentetan.fields untuk membahagikan rentetan oleh aksara kosong; 3) Cari kedudukan substring melalui strings.index dan strings.lastindex; 4) Gunakan string.replaceall untuk menggantikan rentetan; 5) Gunakan string.builder untuk rentetan splice yang cekap; 6) Sentiasa sahkan input untuk mengelakkan hasil yang tidak dijangka.

Pakej 'Strings' di Go: Pergi ke operasi rentetanPakej 'Strings' di Go: Pergi ke operasi rentetanMay 14, 2025 am 12:17 AM

ThestringspackageingoisessentialforefficientstringManipulation.1) itofferssimpleyetpowerfunchunctionsfortaskslikecheckingsubstringsandjoiningstrings.2) ithandlesunicodewell, withfalliktionslikestrings

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Nordhold: Sistem Fusion, dijelaskan
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌
Mandragora: Whispers of the Witch Tree - Cara Membuka Kunci Cangkuk Bergelut
4 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
<🎜> obscur: Ekspedisi 33 - Cara mendapatkan pemangkin Chroma yang sempurna
2 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

Pelayar Peperiksaan Selamat

Pelayar Peperiksaan Selamat

Pelayar Peperiksaan Selamat ialah persekitaran pelayar selamat untuk mengambil peperiksaan dalam talian dengan selamat. Perisian ini menukar mana-mana komputer menjadi stesen kerja yang selamat. Ia mengawal akses kepada mana-mana utiliti dan menghalang pelajar daripada menggunakan sumber yang tidak dibenarkan.

Versi Mac WebStorm

Versi Mac WebStorm

Alat pembangunan JavaScript yang berguna

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

MantisBT

MantisBT

Mantis ialah alat pengesan kecacatan berasaskan web yang mudah digunakan yang direka untuk membantu dalam pengesanan kecacatan produk. Ia memerlukan PHP, MySQL dan pelayan web. Lihat perkhidmatan demo dan pengehosan kami.