Heim Backend-Entwicklung Golang Organisieren Sie Ihren Desktop: Erstellen Sie einen Datei-Organizer in Go.

Organisieren Sie Ihren Desktop: Erstellen Sie einen Datei-Organizer in Go.

Dec 05, 2024 am 03:06 AM

Ist Ihr Desktop chaotisch? Haben Sie Dateien aller Art, die Ihren Desktop oder Ihr Download-Verzeichnis überladen? Lassen Sie uns das mit einem einfachen Skript beheben.

Wie zu Beginn jedes Go-Projekts generieren wir unsere go.mod-Datei mit der Direktive „go mod init“. Der Einfachheit halber schreiben wir unsere gesamte Logik in unsere main.go-Datei.

Lassen Sie uns ein wenig darüber sprechen, wie sich das Skript verhalten soll, bevor wir Code schreiben. Wir möchten unsere Dateien in Verzeichnissen organisieren können, die den Dateityp oder das Erstellungsdatum angeben. Kurz gesagt, wir möchten, dass unser Skript Videodateien in ein Videoverzeichnis, Musikdateien in ein Musikverzeichnis usw. sortiert. oder sortieren Sie alle an einem bestimmten Datum erstellten Dateien in dasselbe Verzeichnis.

Jetzt programmieren wir:

Erstellen Sie eine main.go-Datei und schreiben Sie Folgendes:

1

2

3

4

5

6

7

8

9

package main

 

type fileAnalyzer interface {

    analyzeAndSort() error

}

 

func analyze(fa fileAnalyzer) error {

    return fa.analyzeAndSort()

}

Nach dem Login kopieren
Nach dem Login kopieren

Da wir möchten, dass unser Programm Dateien nach verschiedenen Kriterien sortiert, erstellen wir eine fileAnalyzer-Schnittstelle, die eine Methode definiert:analysAndSort.
Dann schreiben wir eine Funktion: „analysieren“ – die jede Struktur, die die fileAnalyzer-Schnittstelle implementiert, als Argument akzeptiert und ihre Methode „analysierenAndSort“ ausführt.

In einigen Fällen, wie wir sie in diesem Programm sehen werden, gibt es möglicherweise bestimmte Dateien, die Sie nicht verschieben möchten. Beim Testen des Skripts möchten wir beispielsweise nicht, dass das Programm unsere Go-Dateien oder ausführbaren Dateien/Binärdateien in ein anderes Verzeichnis verschiebt. Um dies zu verhindern, müssen wir eine Blacklist erstellen, die alle Dateien enthält, die wir unberührt lassen möchten.

Schreiben Sie Folgendes in unsere main.go-Datei:

1

2

3

4

5

6

var blacklist = []string{

    "go",

    "mod",

    "exe",

    "ps1",

}

Nach dem Login kopieren
Nach dem Login kopieren

Hier habe ich die Dateierweiterung für Dateien hinzugefügt, die unsortiert bleiben sollen. „.go“ und „.mod“ sind Erweiterungen für Go-Dateien. Da ich einen Windows-Rechner verwende, hat meine Binärdatei die Erweiterung „.exe“. Ich habe auch „.ps1“ eingefügt, weil ich in der Entwicklung gerne mit Powershell-Skripten arbeite – wie Sie sehen werden.

Als nächstes schreiben wir einige Hilfsfunktionen.

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

71

72

73

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

}

Nach dem Login kopieren
Nach dem Login kopieren

Die meisten davon sind selbsterklärend, aber ich möchte gerne über die Funktion „mkdir“ sprechen. Die Funktion „mkdir“ erstellt ein Verzeichnis mit dem als Argument übergebenen Namen – die Funktion gibt jedoch keinen Fehler zurück, wenn das Verzeichnis bereits existiert oder ein „os.PathError“ vorliegt.

Jetzt erstellen wir eine Struktur, die die fileAnalyzer-Schnittstelle implementiert:

1

2

3

4

5

6

7

8

9

package main

 

type fileAnalyzer interface {

    analyzeAndSort() error

}

 

func analyze(fa fileAnalyzer) error {

    return fa.analyzeAndSort()

}

Nach dem Login kopieren
Nach dem Login kopieren

Die fileTypeAnalyzer-Struktur verfügt über zwei Eigenschaften: wd, das den Namen des aktuellen Arbeitsverzeichnisses und einen Mapper enthält. Die Schlüssel des Mappers sind der Typ der erkannten Datei, während seine Werte eine Liste der mit dem Schlüssel verknüpften Dateierweiterungen sind. Anschließend erstellen wir eine Konstruktorfunktion und stellen dem Mapper die Dateitypen sowie deren assoziative Dateierweiterungen zur Verfügung. Sie können der Liste gerne weitere Dateitypen und Erweiterungen hinzufügen. Die Methode „anaylyzeAndSort“ ruft einige Hilfsfunktionen und -methoden auf, die die Dateierweiterung einem Dateityp zuordnen, das Dateitypverzeichnis erstellen und die Datei in dieses Verzeichnis verschieben. Ich habe auch einen „Misc“-Ordner hinzugefügt, um Dateien zu speichern, die nicht vom Mapper erfasst wurden – mit Ausnahme der Dateien auf der schwarzen Liste natürlich.

Wir möchten Dateien auch nach Erstellungsdatum organisieren können. Erstellen wir eine weitere Struktur, die die fileAnalyzer-Schnittstelle implementiert, Dateien aber nach Datum organisiert.

1

2

3

4

5

6

var blacklist = []string{

    "go",

    "mod",

    "exe",

    "ps1",

}

Nach dem Login kopieren
Nach dem Login kopieren

Ein Großteil der Logik ist mit der des fileTypeAnalyzer identisch. Der Hauptunterschied besteht darin, dass wir keinen Mapper bereitstellen – stattdessen beziehen wir das Erstellungsdatum aus den Dateiinformationen und erstellen entsprechend Verzeichnisse.

Jetzt fassen wir alles in unserer Hauptfunktion zusammen:

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

71

72

73

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

}

Nach dem Login kopieren
Nach dem Login kopieren

Wir konfigurieren einen Logger; Rufen Sie das aktuelle Arbeitsverzeichnis ab, um es als Argument an unsere FileAnalyzer-Implementierung zu übergeben. Erstellen Sie eine Modusvariable, um Werte zu speichern, die als Flags an die Anwendung übergeben werden, und eine Switch-Anweisung, um zu steuern, wie wir sortieren möchten. Schließlich rufen wir die Analysefunktion auf und übergeben unsere fileAnalyzer-Implementierung als Argument.

Das ist alles. Lassen Sie uns unsere Binärdatei erstellen und testen. Ich habe meinen Sortierer angerufen. Mit „go build -o [name]“

können Sie Ihres so nennen, wie Sie es möchten

Hier ist ein Ordner voller Dateien unterschiedlicher Art:

Organize your desktop: Build a file organizer in Go.

Lassen Sie uns nach Dateityp organisieren:

Organize your desktop: Build a file organizer in Go.

Organize your desktop: Build a file organizer in Go.

Lassen Sie uns nach Dateierstellungsdatum organisieren:

Organize your desktop: Build a file organizer in Go.

Organize your desktop: Build a file organizer in Go.

Als Bonus, wenn Sie einen Windows-Rechner verwenden und Powershell verwenden, finden Sie hier ein Skript, das Ihnen dabei hilft, das Testen Ihres Programms zu vereinfachen.

Erstellen Sie eine task.ps1-Datei und geben Sie Folgendes ein:

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

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

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

}

Nach dem Login kopieren

So erstellen Sie Ihre Binärdatei mit dem Skript:

Organize your desktop: Build a file organizer in Go.

So desorganisieren Sie Dateien mit dem Skript:

Organize your desktop: Build a file organizer in Go.

Um Verzeichnisse mit einem Skript zu löschen:

Organize your desktop: Build a file organizer in Go.

Das obige ist der detaillierte Inhalt vonOrganisieren Sie Ihren Desktop: Erstellen Sie einen Datei-Organizer in Go.. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
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

Heiße Artikel -Tags

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

GO Language Pack Import: Was ist der Unterschied zwischen Unterstrich und ohne Unterstrich? GO Language Pack Import: Was ist der Unterschied zwischen Unterstrich und ohne Unterstrich? Mar 03, 2025 pm 05:17 PM

GO Language Pack Import: Was ist der Unterschied zwischen Unterstrich und ohne Unterstrich?

Wie kann ich kurzfristige Informationsübertragung zwischen Seiten im BeEGO-Framework implementieren? Wie kann ich kurzfristige Informationsübertragung zwischen Seiten im BeEGO-Framework implementieren? Mar 03, 2025 pm 05:22 PM

Wie kann ich kurzfristige Informationsübertragung zwischen Seiten im BeEGO-Framework implementieren?

Wie schreibe ich Scheinobjekte und Stubs zum Testen in Go? Wie schreibe ich Scheinobjekte und Stubs zum Testen in Go? Mar 10, 2025 pm 05:38 PM

Wie schreibe ich Scheinobjekte und Stubs zum Testen in Go?

Wie kann ich Tracing -Tools verwenden, um den Ausführungsfluss meiner GO -Anwendungen zu verstehen? Wie kann ich Tracing -Tools verwenden, um den Ausführungsfluss meiner GO -Anwendungen zu verstehen? Mar 10, 2025 pm 05:36 PM

Wie kann ich Tracing -Tools verwenden, um den Ausführungsfluss meiner GO -Anwendungen zu verstehen?

Wie konvertieren Sie die Liste der MySQL -Abfrageergebnisse in eine benutzerdefinierte Struktur -Slice in Go -Sprache? Wie konvertieren Sie die Liste der MySQL -Abfrageergebnisse in eine benutzerdefinierte Struktur -Slice in Go -Sprache? Mar 03, 2025 pm 05:18 PM

Wie konvertieren Sie die Liste der MySQL -Abfrageergebnisse in eine benutzerdefinierte Struktur -Slice in Go -Sprache?

Wie kann ich benutzerdefinierte Typ -Einschränkungen für Generika in Go definieren? Wie kann ich benutzerdefinierte Typ -Einschränkungen für Generika in Go definieren? Mar 10, 2025 pm 03:20 PM

Wie kann ich benutzerdefinierte Typ -Einschränkungen für Generika in Go definieren?

Wie schreibe ich Dateien in Go Language bequem? Wie schreibe ich Dateien in Go Language bequem? Mar 03, 2025 pm 05:15 PM

Wie schreibe ich Dateien in Go Language bequem?

Wie schreibe ich Benchmarks, die die reale Leistung in Go genau widerspiegeln? Wie schreibe ich Benchmarks, die die reale Leistung in Go genau widerspiegeln? Mar 10, 2025 pm 05:36 PM

Wie schreibe ich Benchmarks, die die reale Leistung in Go genau widerspiegeln?

See all articles