Go ডিরেক্টরি তালিকা


197

আমি কীভাবে গো এর একটি একক ডিরেক্টরিতে ফাইল এবং ফোল্ডারগুলি তালিকাভুক্ত করতে পারি তা জানার চেষ্টা করছি।

আমি খুঁজে পেয়েছি filepath.Walk, তবে এটি স্বয়ংক্রিয়ভাবে সাব-ডিরেক্টরিতে চলে যায়, যা আমি চাই না। আমার অন্যান্য সমস্ত অনুসন্ধানে কোনও কিছুর উন্নতি হয়নি।

আমি নিশ্চিত যে এই কার্যকারিতাটি বিদ্যমান, তবে এটি খুঁজে পাওয়া সত্যিই কঠিন। আমার জানা উচিত কোথায় আমার জানা উচিত। ধন্যবাদ।

উত্তর:


359

আপনি প্যাকেজে রিডডির ফাংশনটি ব্যবহার করে দেখতে পারেন io/ioutil। দস্তাবেজগুলি:

রিডডির ডায়ারনেম নামের ডিরেক্টরিটি পড়ে এবং সাজানো ডিরেক্টরি এন্ট্রিগুলির একটি তালিকা ফেরত দেয়।

ফলস্বরূপ স্লাইসে os.FileInfoপ্রকারভেদ রয়েছে , যা এখানে তালিকাবদ্ধ পদ্ধতি সরবরাহ করে । এখানে একটি প্রাথমিক উদাহরণ যা বর্তমান ডিরেক্টরিতে প্রতিটি কিছুর নাম তালিকাভুক্ত করে (ফোল্ডারগুলি অন্তর্ভুক্ত রয়েছে তবে বিশেষভাবে চিহ্নিত করা হয়নি - আপনি IsDir()পদ্ধতিটি ব্যবহার করে কোনও আইটেম ফোল্ডার কিনা তা পরীক্ষা করতে পারেন ):

package main

import (
    "fmt"
    "io/ioutil"
     "log"
)

func main() {
    files, err := ioutil.ReadDir("./")
    if err != nil {
        log.Fatal(err)
    }

    for _, f := range files {
            fmt.Println(f.Name())
    }
}

7
আপনি শুধুমাত্র চান নাম একটি ডিরেক্টরি এবং গতি বিষয়বস্তুর নিষ্কর্ষ, নোট যে ব্যবহার করছে Readdirnames হয় মাত্রার আদেশ দ্রুত (প্রায় 20x দ্রুত আমার জন্য)
SquattingSlavInTracksuit

2
@ স্কোয়াটিংস্ল্যাভইনট্র্যাকসুইট: আমি এখানে আপনার মন্তব্যে একটি উত্তরের প্রচার করেছি, কারণ আমার মন্তব্য করার সুযোগ ছিল না। আপনি যদি এর চেয়ে উত্তর দিয়ে থাকেন এবং ক্রেডিট পান, এলএমকে।
জ্যাকব কোপজেনস্কি

2
@ স্কাটিং স্ল্যাভইন ট্র্যাকসুইট - এটি মাত্রার এক মাত্র আদেশ: পি
নাদবভদন

78

এমনকি সহজ, ব্যবহার করুন path/filepath:

package main    

import (
    "fmt"
    "log"
    "path/filepath"
)

func main() {
    files, err := filepath.Glob("*")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(files) // contains a list of all files in the current directory
}

8
দ্রষ্টব্যGlob ignores file system errors such as I/O errors reading directories. The only possible returned error is ErrBadPattern, when pattern is malformed.
জোন

3
গ্লোব এটি ব্যবহারের আগে কী করে তা অবশ্যই নিশ্চিত হন। golang.org/pkg/path/filepath/#Glob
Anfernee

65

আমরা বিভিন্ন গোলং স্ট্যান্ডার্ড লাইব্রেরি ফাংশন ব্যবহার করে ফাইল সিস্টেমে একটি ফোল্ডারের ভিতরে ফাইলগুলির একটি তালিকা পেতে পারি।

  1. filepath.Walk
  2. ioutil.ReadDir
  3. os.File.Readdir

package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "os"
    "path/filepath"
)

func main() {
    var (
        root  string
        files []string
        err   error
    )

    root := "/home/manigandan/golang/samples"
    // filepath.Walk
    files, err = FilePathWalkDir(root)
    if err != nil {
        panic(err)
    }
    // ioutil.ReadDir
    files, err = IOReadDir(root)
    if err != nil {
        panic(err)
    }
    //os.File.Readdir
    files, err = OSReadDir(root)
    if err != nil {
        panic(err)
    }

    for _, file := range files {
        fmt.Println(file)
    }
}
  1. ফাইলপথ.ওয়াল্ক ব্যবহার করা হচ্ছে

path/filepathপ্যাকেজ, এটি স্বয়ংক্রিয়ভাবে ডিরেক্টরির মধ্যে প্রতিটি উপ-ডিরেক্টরির স্ক্যান করবে একটি ডিরেক্টরির মধ্যে সমস্ত ফাইল স্ক্যান করতে একটি সহজ উপায় প্রদান করে।

func FilePathWalkDir(root string) ([]string, error) {
    var files []string
    err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
        if !info.IsDir() {
            files = append(files, path)
        }
        return nil
    })
    return files, err
}
  1. Ioutil.ReadDir ব্যবহার করা হচ্ছে

ioutil.ReadDir ডায়ারনেম অনুসারে ডিরেক্টরিটি পড়ে এবং ফাইলের নাম অনুসারে বাছাই করা ডিরেক্টরি তালিকা প্রবেশ করে list

func IOReadDir(root string) ([]string, error) {
    var files []string
    fileInfo, err := ioutil.ReadDir(root)
    if err != nil {
        return files, err
    }

    for _, file := range fileInfo {
        files = append(files, file.Name())
    }
    return files, nil
}
  1. Os.File.Readdir ব্যবহার করে

রিডডিয়ার ফাইলের সাথে সম্পর্কিত ডিরেক্টরিগুলির বিষয়বস্তু পড়েন এবং ডিরেক্টরি অনুসারে লস্ট্যাট দ্বারা ফেরত দেওয়া হিসাবে এন ফাইলআইএনফোর মানগুলির একটি স্লাইস প্রদান করে। একই ফাইলটিতে পরবর্তী কলগুলি পরবর্তী ফাইলআইনফসগুলি দেবে।

func OSReadDir(root string) ([]string, error) {
    var files []string
    f, err := os.Open(root)
    if err != nil {
        return files, err
    }
    fileInfo, err := f.Readdir(-1)
    f.Close()
    if err != nil {
        return files, err
    }

    for _, file := range fileInfo {
        files = append(files, file.Name())
    }
    return files, nil
}

বেঞ্চমার্ক ফলাফল।

বেঞ্চমার্ক স্কোর

এই ব্লগ পোস্টে আরও বিশদ পান


3
এখানে সবচেয়ে সম্পূর্ণ উত্তর। এটি লক্ষণীয় যে এই মাপকাঠি দ্বারা কোনও মেমরির ব্যবহার বা বরাদ্দ নেই। দ্রুত বাস্তবায়নগুলি আরও মেমরি ব্যবহার করে এটি সম্ভব। এটিও সম্ভব যে পরীক্ষকের কম্পিউটারে সিপিইউ কোরগুলির সংখ্যা সমবর্তীকে ব্যথা দেয় / সহায়তা করে filepath.Walk। তদাতিরিক্ত, filepath.Walkপুনরাবৃত্তি শালীন সমর্থন করে os.File.Readdirএবং ioutil.ReadDirনা।
জিওনক্রস

24

ioutil.ReadDirএটি একটি ভাল সন্ধান, তবে আপনি যদি উত্সটি ক্লিক করেন এবং সন্ধান করেন তবে দেখবেন যে এটি OS.File এর পদ্ধতিটিকে Readdir বলে । আপনি যদি ডিরেক্টরি আদেশের সাথে ঠিক থাকেন এবং তালিকাটি বাছাইয়ের প্রয়োজন না হয় তবে এই Readdir পদ্ধতিটি আপনার প্রয়োজন।


7

আপনার বিবরণ থেকে, আপনি সম্ভবত যা চান তা হ'ল রিডডিরনাম

func (f *File) Readdirnames(n int) (names []string, err error)

Readdirnames ফাইলের সাথে সম্পর্কিত ডিরেক্টরিগুলির বিষয়বস্তু পড়ে এবং ডিরেক্টরি অনুসারে ডিরেক্টরিতে ফাইলের নাম পর্যন্ত এক স্লাইস প্রদান করে। একই ফাইলটিতে পরবর্তী কলগুলি আরও নাম প্রকাশ করবে।

...

যদি এন <= 0 হয় তবে Readdirnames ডিরেক্টরি থেকে সমস্ত নাম একক টুকরোতে ফেরত দেয়।

স্নিপেট:

file, err := os.Open(path)
if err != nil {
    return err
}
names, err := file.Readdirnames(0)
if err != nil {
    return err
}
fmt.Println(names)

ক্রেডিট SquattingSlavInTracksuit এর মন্তব্য ; আমি যদি উত্তর দিতে পারি তবে তাদের মন্তব্যে জবাব দেওয়ার পরামর্শ দিয়েছিলাম।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.