こんにちは、イオンです。
AI がいつか達成するであろう何かを学習するのではないかという恐怖で、私は完全に心が痛みます。しかし、「問題を解決する」ことが未来の人類に課せられた要件であるならば、なぜ固執しないのでしょうか?
今回は別のチュートリアルを紹介します。最初のものよりも役に立たない。それでは、「問題」の構造を定義しましょう。なぜなら、私たちはすでに 1 つのことを知っているからです。問題を抱えていない人は、十分に調べていないからです。まだ見つけていない人も、作成できるようになるのは時間の問題です。
プログラムの最も単純な構造は次のとおりです:
ディレクトリを作成し、そこに移動します:
mkdir organizador cd organizador
organizer.go ファイルを作成し、そのモジュールを開始します:
touch organizador.go go mod init organizador.go
おおよそ次のようなものが必要です:
~/organizador . ├── go.mod └── organizador.go
編成を実行するソース ディレクトリ 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) } }
ここで、上記のコードについていくつか考慮してみましょう:
ここではメカニカルキーボードの音を少しずつ楽しんでいるのにお気づきでしょうか。 _チャカチャカブーム! _
そして今、コールバック関数を作成します。これは、私が実際に学んだこともなければ、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 内のすべてのファイルとサブディレクトリをたどるという重労働を実行します。
見つかったファイルまたはディレクトリごとに、次の 3 つの引数を指定して listFiles 関数を呼び出します。
Go は、filepath.Walk がまさにこのシグネチャに従う関数を期待しているため、listFiles がこれら 3 つのパラメータを受け取る必要があることを自動的に理解します。
~/organizador . ├── go.mod └── organizador.go
Walk 関数がエラーを返すことに注意してください。これは関係あります!
これが、関数 filepath.Walk(dirOrigem,listarArquivos) を err:
とみなす理由です。
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 }
この例では、各呼び出しに対して次のようになります。
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 関数は使用しないので、削除します。
冗談ですが、彼女の名前を変更して他のロジックを追加するだけです。
整理整頓は良いことですが、整理整頓は素晴らしいです。
私のこの素晴らしい観察の後、私たちが本当に興味を持っている部分、つまり全体を整理する部分に移りましょう。
人生の皮肉として、ファイルを整理する前に、次のステップに向けてアイデアを整理する必要があります。
次の関数は基本的に次のものが必要です:
このコードの各部分が何をするのかを理解しましょう:
mkdir organizador cd organizador
organizeFiles 関数は、ディレクトリ構造内で見つかったファイルまたはフォルダーごとに呼び出されます。拡張子に基づいて各ファイルを整理するための条件をチェックし、必要に応じてサブフォルダーを作成し、ファイルを移動します。
touch organizador.go go mod init organizador.go
ここで、organizeFiles 関数は 3 つのパラメータを取ります:
最初のチェックは、ファイル/ディレクトリへのアクセス時にエラーがないかどうかです。その場合は直ちに返却されます。
~/organizador . ├── go.mod └── organizador.go
このスニペットは 2 つのチェックを行います:
両方の条件が満たされる場合、ファイルは 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) } }
こちら:
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) } }
ここでの関数:
mkdir organizador cd organizador
この時点で、destinationPath はファイルが移動される最終的なパスを表します。これは、filepath.Join を使用して構築され、サブフォルダーのパスをファイル名に結合します。
touch organizador.go go mod init organizador.go
機能:
filepath.Walk(dirOrigem, OrganizeFiles) を使用すると、この関数がディレクトリ内の各ファイルに渡され、すべてのファイルが自動的に整理されます。
このコードは、作成と移動のロジックを 1 つの関数で処理するため、ファイル整理関数として適切です。これは効率的で組織化された構造形式です。
リポジトリ: https://github.com/ionnss/organizador
***地球上の別の日、
イオン
以上がGO でダウンロードを整理するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。