Heim >Backend-Entwicklung >Golang >Organisieren Sie Ihre Downloads in GO

Organisieren Sie Ihre Downloads in GO

Linda Hamilton
Linda HamiltonOriginal
2024-10-31 05:44:301034Durchsuche

Organizador de seus downloads em GO

Hallo, Ionen hier wieder.

Die Angst, etwas zu lernen, was eine KI eines Tages schaffen wird, macht mich völlig verzweifelt. Aber wenn „Probleme lösen“ immer noch eine Anforderung an die Menschen der Zukunft ist, warum dann nicht daran festhalten?

Dieses Mal bringe ich ein weiteres Tutorial mit. Weniger nutzlos als das erste. Definieren wir also die Strukturen von „Problemen“, denn eines wissen wir bereits: Wer keine Probleme hat, liegt daran, dass er nicht ausreichend hingesehen hat. Und für diejenigen, die sie noch nicht gefunden haben, ist es nur eine Frage der Zeit, bis sie sie erstellen können.

Projektstruktur

Die einfachste Struktur des Programms ist:

  • Scannen Sie einen Ordner (zum Beispiel den Download-Ordner oder ein anderes Verzeichnis)
  • Identifizieren Sie den Typ jeder Datei im betreffenden Verzeichnis
  • Verschieben Sie die Datei in einen Unterordner entsprechend ihrem Typ (Bilder, Videos, Dokumente...)

Starten des Projekts

Erstellen Sie ein Verzeichnis und navigieren Sie dorthin:

mkdir organizador
cd organizador

Erstellen Sie eine Organizer.go-Datei und starten Sie ihre Module:

touch organizador.go
go mod init organizador.go

Sie sollten ungefähr so ​​etwas haben:

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

Teil 1: Überprüfen, ob ein Verzeichnis vorhanden ist

Lassen Sie uns das QuellverzeichnisdirOrigem definieren, in dem wir die Organisation durchführen werden. Wenn es definiert ist, prüfen wir, ob es tatsächlich existiert. Andernfalls geben wir einen Fehler zurück:

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

Lassen Sie uns nun einige Überlegungen zum obigen Code anstellen:

  • Die Funktion os.Stat gibt zwei Werte vom Typ os.FileInfo und den Fehler err zurück.
  1. FileInfo ist eine Schnittstelle, die detaillierte Dateiinformationen zurückgibt, die wir in diesem Fall nicht benötigen. Um diese Schnittstelle zu ignorieren, verwenden wir daher _,. Allerdings wollen wir den Fehler nicht ignorieren: if _, err := ...
  2. Wir übergeben den Fehler err als Parameter an die Funktion os.IsNotExist(), denn wenn das Verzeichnis nicht existiert, gibt die Funktion os.Stat() einen Fehler NOT NULL zurück, der das verursacht os. .IsNotExist() gibt true zurück und führt unsere Nachricht aus: BAD DIR :(
  3. Wenn os.IsNotExist() false zurückgibt, drucken wir die Nachricht aus der else-Bedingung: GOOD DIR :)

Teil 2: Das Konzept der Callback-Funktion ist verrückt, Mann!

Haben Sie bemerkt, dass wir hier nach und nach vorgehen und die Bits und Bytes zum Klang der mechanischen Tastatur genießen? _Tchaka Tchaka Boom! _

Und jetzt erstellen wir eine Rückruffunktion. Etwas, von dem ich eigentlich nie etwas gelernt hatte oder von dem ich nie neugierig genug war, um zu fragen, ob ich dieses Konzept in meinem Leben vor Golang jemals in einem Python-Code verwendet habe.

Eine Callback-Funktion ist eine Funktion, die mit einem Argument an eine andere Funktion übergeben wird.

Wenn Sie mit dem Konzept bereits vertraut sind, herzlichen Glückwunsch, ansonsten herzlichen Glückwunsch. Mit anderen Worten, herzlichen Glückwunsch!

Jetzt erstellen wir eine filepath.Walk-Rückruffunktion, die als Argument an eine andere Funktion übergeben wird.

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

Aber Moment, wie ruft filepath.Walk die Callback-Funktion auf?

Wenn Sie filepath.Walk(sourcedir, listFiles) aufrufen, übernimmt die filepath.Walk-Funktion die schwere Arbeit, alle Dateien und Unterverzeichnisse in sourcedir zu durchsuchen.

Für jede gefundene Datei oder jedes gefundene Verzeichnis wird die Funktion „listFiles“ mit drei Argumenten aufgerufen:

  • Pfad: Der vollständige Pfad zur aktuellen Datei oder zum aktuellen Verzeichnis.
  • Info: ein os.FileInfo-Objekt, das Informationen über die Datei/das Verzeichnis enthält (z. B. Name, ob es sich um ein Verzeichnis handelt, Größe usw.).
  • err: ein Fehler, wenn beim Zugriff auf diese Datei oder dieses Verzeichnis etwas schief geht.

Go versteht automatisch, dass listFiles diese drei Parameter erhalten muss, da filepath.Walk eine Funktion erwartet, die genau dieser Signatur folgt:

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

Beachten Sie, dass die Walk-Funktion einen Fehler zurückgibt! Das ist relevant!

Deshalb setzen wir unsere Funktion filepath.Walk(dirOrigem,listarArquivos) mit einem err:
gleich

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

Da es schließlich einen Fehler zurückgibt, handelt es sich um einen Fehler XD

Beispiel in Aktion

Hier ist ein detaillierterer Blick darauf, was bei jedem Schritt passiert:

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

Für jede Datei oder jedes Verzeichnis in dirOrigem ruft filepath.Walk listFiles auf, als wäre es etwa so:

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

In diesem Beispiel für jeden Anruf:

  • Pfad: empfängt den Pfad der Datei oder des Verzeichnisses.
  • Info: Enthält Informationen zu diesem Artikel (z. B. Name und Typ).
  • err: wird verwendet, um bestimmte Fehler beim Zugriff auf die Datei/das Verzeichnis abzufangen.

Rückruffunktion

listFiles ist eine Rückruffunktion, die filepath.Walk automatisch mit diesen Werten aufruft. Auf diese Weise müssen wir uns nicht um die Festlegung der Pfad-, Info- und Fehlerwerte kümmern; filepath.Walk erledigt das bereits für uns.

PHE!

Jetzt machen Sie diesen frechen Test auf Ihrem Terminal:

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

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

Sie können das Ergebnis haben:

err := filepath.Walk(dirOrgiem, listarArquivos)

Oder:

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

In diesem Fall habe ich einfach ein zusätzliches „s“ in „Downloads“ eingefügt, damit das Origin-Verzeichnis falsch wäre.

Löschen Sie nun die listFiles-Funktion, da wir sie nicht verwenden werden.

Nur ein Scherz, wir werden nur ihren Namen ändern und andere Logik hinzufügen.

TEIL 3: ORGANISIEREN != ORGANISIERT

Organisiert ist gut, Organisieren ist großartig.

Nach dieser brillanten Beobachtung meinerseits kommen wir nun zu dem Teil, der uns wirklich interessiert: der Organisation des Ganzen.

Es ist eine Ironie im Leben, dass wir vor dem Organisieren der Dateien unsere Ideen für die nächsten Schritte organisieren müssen.

Unsere nächste Funktion benötigt grundsätzlich:

  • Erstellen Sie Unterordner basierend auf den Erweiterungen jeder Datei in unserem dirOrigem-Verzeichnis, falls diese nicht vorhanden ist.
  • Verschieben Sie die Dateien entsprechend ihren Erweiterungen in die jeweiligen Ordner.
  • Wenn sich die Dateien jedoch bereits in den organisierenden Unterordnern befinden, sollten sie nicht erneut erstellt werden.

Lassen Sie uns verstehen, was jeder Teil dieses Codes bewirkt:

mkdir organizador
cd organizador

Struktur der organizeFiles-Funktion

Die Funktion „OrganizeFiles“ wird für jede in der Verzeichnisstruktur gefundene Datei oder jeden Ordner aufgerufen. Es prüft die Bedingungen zum Organisieren jeder Datei anhand ihrer Erweiterung, erstellt bei Bedarf Unterordner und verschiebt Dateien.

touch organizador.go
go mod init organizador.go

Hier benötigt die Funktion „OrganizeFiles“ drei Parameter:

  • Pfad: der vollständige Pfad zur aktuellen Datei oder zum aktuellen Verzeichnis.
  • info: Datei- oder Verzeichnisinformationen, erhalten vom Typ os.FileInfo.
  • err: ein möglicher Fehler, der beim Versuch, auf das Element zuzugreifen, auftreten kann.

Die erste Prüfung besteht darin, ob beim Zugriff auf die Datei/das Verzeichnis ein Fehler vorliegt. Wenn ja, wird es umgehend zurückgesandt.

Dateien filtern und versteckte Verzeichnisse ignorieren

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

Dieses Snippet führt zwei Prüfungen durch:

  • !info.IsDir(): prüft, ob das Element kein Verzeichnis ist (d. h. es ist eine Datei).
  • !strings.HasPrefix(info.Name(), „.“): prüft, ob der Dateiname nicht mit „.“ beginnt, und ignoriert versteckte Dateien auf Unix-basierten Systemen.

Wenn beide Bedingungen erfüllt sind, wird die Datei mit fmt.Println.

angezeigt

Identifizieren der Dateierweiterung und Erstellen des Unterordnernamens

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

Hier:

  • strings.ToLower(filepath.Ext(info.Name())): Extrahiert die Dateierweiterung (z. B. .txt) und wandelt sie in Kleinbuchstaben um, um Konsistenz sicherzustellen.
  • subfolder := filepath.Join(sourcedir, extension[1:]): erstellt den vollständigen Pfad des Unterordners, in den die Datei verschoben wird. Die Erweiterung[1:] entfernt den Startpunkt (.) aus der Erweiterung und bildet den Namen des Unterordners, z. B. txt.

Erstellen Sie den Unterordner, falls dieser noch nicht vorhanden ist

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

Hier die Funktion:

  • Überprüfen Sie mithilfe von os.Stat.
  • , ob der Unterordner bereits vorhanden ist
  • Wenn der Unterordner nicht existiert (os.IsNotExist(err)), wird er mit os.Mkdir(Unterordner, os.ModePerm) erstellt.
  • os.ModePerm legt die Standardberechtigungen für den neuen Ordner fest. Sollte beim Erstellen des Ordners ein Fehler auftreten, wird dieser angezeigt und zurückgegeben.

Festlegen des Dateizielpfads

mkdir organizador
cd organizador

Zu diesem Zeitpunkt stellt „destinationPath“ den endgültigen Pfad dar, in den die Datei verschoben wird. Es wird mit filepath.Join erstellt, um den Unterordnerpfad mit dem Dateinamen zu verbinden.

Überprüfen Sie, ob sich die Datei bereits im Zielordner befindet

touch organizador.go
go mod init organizador.go
  • Dieses Snippet vergleicht den Zielpfad mit dem aktuellen Dateipfad. Wenn sie identisch sind, bedeutet dies, dass sich die Datei bereits im richtigen Unterordner befindet und daher mit einer Meldung (fmt.Printf) ignoriert wird.
  • Andernfalls verschiebt os.Rename(path, targetPath) die Datei in den Unterordner. Wenn beim Verschieben ein Fehler auftritt, wird dieser zurückgegeben.

Abschließende Zusammenfassung

Die Funktion:

  1. Scrollen Sie durch ein Verzeichnis und überprüfen Sie jedes Element.
  2. Ignoriert versteckte Verzeichnisse und Dateien.
  3. Bestimmt die Dateierweiterung und damit den Ziel-Unterordner.
  4. Erstellen Sie den Unterordner (falls er noch nicht vorhanden ist).
  5. Verschiebt die Datei in den Unterordner, sofern sie nicht bereits dort ist.

Mit filepath.Walk(dirOrigem, organiseFiles) wird diese Funktion an jede Datei im Verzeichnis übergeben, wodurch alle Dateien automatisch organisiert werden.

Dieser Code eignet sich gut als Dateiorganisationsfunktion, da er die Erstellungs- und Verschiebungslogik in einer einzigen Funktion abwickelt – eine effiziente und organisierte Form der Struktur.

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


***Ein weiterer Tag auf Erden,
Ionen

Das obige ist der detaillierte Inhalt vonOrganisieren Sie Ihre Downloads in GO. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn