> 백엔드 개발 > Golang > GO에서 다운로드를 정리하세요

GO에서 다운로드를 정리하세요

Linda Hamilton
풀어 주다: 2024-10-31 05:44:30
원래의
1051명이 탐색했습니다.

Organizador de seus downloads em GO

안녕하세요 이온들이 또 왔습니다

AI가 언젠가 성취할 무언가를 배울 것이라는 두려움 때문에 저는 완전히 괴로워합니다. 하지만 "문제 해결"이 여전히 미래 인류에게 부과된 요구 사항이라면 지속하지 않겠습니까?

이번에는 또 다른 튜토리얼을 가져왔습니다. 첫 번째보다 덜 쓸모가 있습니다. 따라서 "문제"의 구조를 정의해 봅시다. 왜냐하면 우리는 이미 한 가지를 알고 있기 때문입니다. 문제가 없는 사람들은 충분히 보이지 않았기 때문입니다. 아직 찾지 못한 분들도 만들 수 있게 되는 것은 시간문제일 뿐입니다.

프로젝트 구조

가장 간단한 프로그램 구조는 다음과 같습니다.

  • 폴더 검색(예: 다운로드 폴더 또는 다른 디렉터리)
  • 해당 디렉터리에 있는 각 파일의 유형을 확인하세요
  • 파일을 해당 유형(이미지, 비디오, 문서...)에 해당하는 하위 폴더로 이동

프로젝트 시작

디렉토리를 만들고 탐색하세요.

mkdir organizador
cd organizador
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

organizer.go 파일을 만들고 해당 모듈을 시작합니다.

touch organizador.go
go mod init organizador.go
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

다음과 비슷해야 합니다.

~/organizador
.
├── go.mod
└── organizador.go
로그인 후 복사
로그인 후 복사
로그인 후 복사

1부: 디렉토리가 존재하는지 확인하기

조직을 수행할 소스 디렉터리dirOrigem을 정의해 보겠습니다. 정의한 후 실제로 존재하는지 확인해 보겠습니다. 그렇지 않으면 오류가 반환됩니다.

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

로그인 후 복사
로그인 후 복사
로그인 후 복사

이제 위 코드에 대해 몇 가지 고려해 보겠습니다.

  • os.Stat 함수는 os.FileInfo 유형과 오류 err의 두 값을 반환합니다.
  1. FileInfo는 자세한 파일 정보를 반환하는 인터페이스인데, 이 경우에는 필요하지 않습니다. 따라서 이 인터페이스를 무시하려면 _,를 사용합니다. 그러나 우리는 오류를 무시하고 싶지 않습니다: if _, err := ...
  2. 오류 err을 os.IsNotExist() 함수에 매개 변수로 전달합니다. 디렉터리가 존재하지 않으면 os.Stat() 함수가 NOT NULL 오류를 반환하여 os.IsNotExist()는 true를 반환하고 다음 메시지를 실행합니다: BAD DIR :(
  3. os.IsNotExist()가 false를 반환하면 else 조건: GOOD DIR의 메시지를 인쇄합니다. :)

2부: 콜백 함수 개념이 이상해요!

여기서 우리는 기계식 키보드의 사운드에 맞춰 조금씩 비트와 바이트를 즐기고 있다는 것을 알고 계셨나요? _차카차카붐! _

이제 콜백 함수를 만들어 보겠습니다. 실제로 배운 적이 없거나 Golang 이전 생활에서 Python 코드에서 이 개념을 사용한 적이 있는지 질문할 만큼 호기심이 없었던 것입니다.

콜백 함수는 인수와 함께 다른 함수에 전달되는 함수입니다.

이미 개념을 알고 계시다면 축하하고 그렇지 않다면 축하합니다. 즉, 축하드립니다!

이제 다른 함수에 인수로 전달될 filepath.Walk 콜백 함수를 만들어 보겠습니다.

mkdir organizador
cd organizador
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
touch organizador.go
go mod init organizador.go
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

잠깐만요, filepath.Walk는 콜백 함수를 어떻게 호출하나요?

filepath.Walk(sourcedir, listFiles)를 호출하면 filepath.Walk 함수는 sourcedir 내의 모든 파일과 하위 디렉터리를 탐색하는 무거운 작업을 수행합니다.

발견된 각 파일이나 디렉터리에 대해 세 가지 인수를 사용하여 listFiles 함수를 호출합니다.

  • 경로: 현재 파일 또는 디렉터리의 전체 경로입니다.
  • info: 파일/디렉토리에 대한 정보(예: 이름, 디렉터리인지 여부, 크기 등)가 포함된 os.FileInfo 개체입니다.
  • err: 이 파일이나 디렉터리에 액세스할 때 문제가 발생하는 경우 오류입니다.

Go는 filepath.Walk가 정확히 다음 서명을 따르는 함수를 기대하기 때문에 listFiles가 이 세 가지 매개변수를 받아야 한다는 것을 자동으로 이해합니다.

~/organizador
.
├── go.mod
└── organizador.go
로그인 후 복사
로그인 후 복사
로그인 후 복사

Walk 함수가 오류를 반환한다는 점에 유의하세요! 이것은 관련이 있습니다!

그래서 우리는 함수 filepath.Walk(dirOrigem,listarArquivos)를 오류:
와 동일시합니다.

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

로그인 후 복사
로그인 후 복사
로그인 후 복사

결국 오류를 반환하기 때문에 오류입니다 XD

실제 사례

각 단계에서 어떤 일이 일어나는지 자세히 살펴보세요.

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)
    }
}
로그인 후 복사
로그인 후 복사

dirOrigem의 각 파일 또는 디렉터리에 대해 filepath.Walk는 다음과 같은 것처럼 listFiles를 호출합니다.

// 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
}
로그인 후 복사

이 예에서는 각 통화에 대해 다음을 수행합니다.

  • path: 파일이나 디렉터리의 경로를 받습니다.
  • info: 이 항목에 대한 정보(예: 이름, 유형)가 포함됩니다.
  • err: 파일/디렉토리에 액세스하는 동안 특정 오류를 잡는 데 사용됩니다.

콜백 함수

listFiles는 filepath.Walk가 이러한 값을 사용하여 자동으로 호출하는 콜백 함수입니다. 이렇게 하면 경로, 정보 및 오류 값 설정에 대해 걱정할 필요가 없습니다. filepath.Walk는 이미 이 작업을 수행하고 있습니다.

피!

이제 터미널에서 장난스러운 테스트를 수행해 보세요.

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

// Tipo WalkFunc
type WalkFunc func(path string, info os.FileInfo, err error) error
로그인 후 복사

결과를 얻을 수 있습니다:

err := filepath.Walk(dirOrgiem, listarArquivos)
로그인 후 복사

또는:

//Percorrer e listar os arquivos no diretório
err := filepath.Walk(dirOrigem, listarArquivos)
로그인 후 복사

이 경우에는 Origin 디렉토리가 올바르지 않도록 "다운로드"에 "s"를 추가로 넣었습니다.

이제 listFiles 함수를 사용하지 않을 것이므로 삭제하세요.

농담입니다. 이름을 바꾸고 다른 로직을 추가하겠습니다.

3부: 정리 != 정리

정리도 좋고, 정리도 짱입니다.

제가 훌륭하게 관찰한 후에 우리가 정말 관심을 갖는 부분인 전체 구성으로 넘어가겠습니다.

인생의 아이러니하게도 파일을 정리하기 전에 다음 단계를 위한 아이디어를 정리해야 합니다.

다음 기능에는 기본적으로 다음이 필요합니다.

  • dirOrigem 디렉토리가 존재하지 않는 경우 각 파일의 확장자를 기반으로 하위 폴더를 만듭니다.
  • 파일을 확장자에 따라 해당 폴더로 이동하세요.
  • 그러나 파일이 이미 정리 하위 폴더에 있는 경우 해당 파일을 다시 생성해서는 안 됩니다.

이 코드의 각 부분이 수행하는 작업을 살펴보겠습니다.

mkdir organizador
cd organizador
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

OrganisationFiles 함수의 구조

organizeFiles 함수는 디렉터리 구조에 있는 각 파일이나 폴더에 대해 호출됩니다. 확장자에 따라 각 파일을 정리하기 위한 조건을 확인하고, 필요한 경우 하위 폴더를 생성하고 파일을 이동합니다.

touch organizador.go
go mod init organizador.go
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

여기서 OrganisationFiles 함수는 세 가지 매개변수를 사용합니다.

  • 경로: 현재 파일 또는 디렉터리의 전체 경로입니다.
  • info: os.FileInfo 유형에서 얻은 파일 또는 디렉토리 정보.
  • err: 해당 항목에 접근하려고 할 때 발생할 수 있는 오류입니다.

첫 번째 확인은 파일/디렉토리에 접근할 때 오류가 있는지 여부입니다. 그렇다면 즉시 반환됩니다.

파일 필터링 및 숨겨진 디렉터리 무시

~/organizador
.
├── go.mod
└── organizador.go
로그인 후 복사
로그인 후 복사
로그인 후 복사

이 스니펫은 두 가지 사항을 확인합니다.

  • !info.IsDir(): 항목이 디렉터리(즉, 파일)가 아닌지 확인합니다.
  • !strings.HasPrefix(info.Name(), "."): 파일 이름이 "."로 시작하지 않는지 확인하고 Unix 기반 시스템에서는 숨겨진 파일을 무시합니다.

두 조건이 모두 충족되면 파일이 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)
    }
}

로그인 후 복사
로그인 후 복사
로그인 후 복사

여기:

  • strings.ToLower(filepath.Ext(info.Name())): 파일 확장자(예: .txt)를 추출하고 일관성을 보장하기 위해 소문자로 변환합니다.
  • subfolder := filepath.Join(sourcedir, Extension[1:]): 파일이 이동될 하위 폴더의 전체 경로를 생성합니다. 확장자[1:]는 확장자에서 시작점(.)을 제거하여 txt와 같은 하위 폴더 이름을 형성합니다.

하위 폴더가 아직 없는 경우 만들기

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)
    }
}
로그인 후 복사
로그인 후 복사

여기서 기능은 다음과 같습니다.

  • os.Stat를 사용하여 하위 폴더가 이미 존재하는지 확인하세요.
  • 하위 폴더가 존재하지 않는 경우(os.IsNotExist(err)) os.Mkdir(subfolder, os.ModePerm)을 사용하여 생성됩니다.
  • os.ModePerm은 새 폴더에 대한 기본 권한을 설정합니다. 폴더 생성시 오류가 발생하면 표시되어 반환됩니다.

파일 대상 경로 설정

mkdir organizador
cd organizador
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

이 시점에서 DestinationPath는 파일이 이동될 최종 경로를 나타냅니다. 하위 폴더 경로를 파일 이름에 결합하기 위해 filepath.Join을 사용하여 구성됩니다.

파일이 이미 대상 폴더에 있는지 확인

touch organizador.go
go mod init organizador.go
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
  • 이 스니펫은 대상 경로를 현재 파일 경로와 비교합니다. 동일하다면 파일이 이미 올바른 하위 폴더에 있다는 의미이므로 메시지(fmt.Printf)와 함께 무시됩니다.
  • 그렇지 않으면 os.Rename(path, DestinationPath)은 파일을 하위 폴더로 이동합니다. 이동 중 오류가 발생하면 반송됩니다.

최종 요약

기능:

  1. 디렉토리를 스크롤하여 각 항목을 확인하세요.
  2. 숨겨진 디렉터리와 파일을 무시합니다.
  3. 파일 확장자와 대상 하위 폴더를 결정합니다.
  4. 하위 폴더를 생성합니다(아직 존재하지 않는 경우).
  5. 파일이 이미 하위 폴더에 있지 않으면 하위 폴더로 이동합니다.

filepath.Walk(dirOrigem,organizeFiles)를 사용하면 이 함수가 디렉터리 내의 각 파일에 전달되어 모든 파일이 자동으로 정리됩니다.

이 코드는 효율적이고 조직화된 형태의 구조인 단일 함수에서 생성 및 이동 로직을 처리하므로 파일 정리 기능에 잘 맞습니다.

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


***지구상의 또 다른 하루,
이온

위 내용은 GO에서 다운로드를 정리하세요의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿