Editor PHP mengesyorkan menggunakan io.FS baharu untuk mengendalikan sistem fail, terutamanya apabila menggunakan fs.WalkDir dan menyenaraikan fail merentas jenis sistem fail. Ciri baharu ini boleh mengendalikan operasi fail dengan lebih fleksibel, membolehkan pengguna mendapatkan maklumat fail yang mereka perlukan dengan lebih mudah. Sama ada dalam proses pembangunan atau penyelenggaraan, fungsi ini boleh meningkatkan kecekapan dan mengurangkan operasi yang membosankan. Jika anda ingin mengetahui lebih lanjut tentang cara menggunakan fungsi ini, anda mungkin ingin meneruskan membaca dan kami akan memperkenalkan anda kepada langkah dan langkah berjaga-jaga yang terperinci.
Saya menggunakan abstraksi io.FS baharu untuk melintasi sistem fail dan membaca 128 bait pertama setiap fail yang sepadan dengan sambungan fail dalaman kami.
Fail ini terletak dalam sistem fail tempatan dan fail arkib dsb. (ZIP dan Tar I think).
Saya menggunakan fs.WalkDir, lulus dalam fs.FS (os.DIR dan fstest.MapFS dalam ujian saya). Apabila berjalan, saya mengembalikan satu set "fail" (sebenarnya ia adalah fail *.pzix dan *.pzi, yang merupakan format proprietari kami). Saya tidak dapat mencari cara yang sesuai untuk menggunakan antara muka FS untuk mendapatkan beberapa maklumat tentang fail yang saya sedang usahakan.
Saya mahu:
Saya dapati antara muka daripada Java/C# dalam Go agak mengelirukan. Saya ingin mengendalikan abstraksi, tetapi saya tidak tahu bagaimana untuk mendapatkan pelaksanaan lain bagi fail itu sendiri (cth. antara muka fail mempunyai Stat() dan baca).
Perkara paling mudah yang saya temui ialah menyimpan laluan dan nama fail dalam tatasusunan, kemudian apabila saya mengulangi tatasusunan, tentukan sama ada ia os.Dir atau fstest.MapFS, tetapi ini nampaknya agak bertentangan dengan intuisi:
func collectFiles(f fs.FS, root string) []string { var files []string fs.WalkDir(f, ".", func(p string, d fs.DirEntry, err error) error { if !d.IsDir() { // we also check a few other things in the filename here f = filepath.Abs(path.Join(root, p)) files = append(files, f) } } return files }
Ini memberi saya:
root = "m://" // mapfs files = { "m://id-198271.pzi", "m://id-7125-092581.pzix"}
Adakah cara yang lebih bijak untuk saya menangani abstraksi tanpa melakukan perkara ini? Kerana selepas mengembalikan tatasusunan, saya perlu "membuka" fail, membaca 128 bait pertama (tandatangan) dan cincang fail yang lain untuk memastikan ia "sah".
EDIT: Untuk menjelaskan, kaedah collectFiles
sedang mencipta senarai hit fail utama kami untuk diproses dalam kaedah lain. Saya ingin menghantar fail sistem tempatan, fail zip dan fail tar ke dalam kaedah supaya ia boleh melelar ke atas fail dalam arkib dan menambahkannya pada tatasusunan.
Semoga ada antara muka Fail yang boleh saya simpan dalam tatasusunan dan bukannya rentetan supaya pemanggil seterusnya boleh melakukan f.open() tanpa mengetahui apa yang ada di bawahnya.
p
ialah nama dalam sistem fail.
Dapatkan saiz dengan menghubungi fs.Stat(f, p)
Buka fail menggunakan f.Open(p)
Contoh:
f := os.DirFS("/etc") fs.WalkDir(f, ".", func(p string, d fs.DirEntry, err error) error { if !d.IsDir() { st, _ := fs.Stat(f, p) r, _ := f.Open(p) defer r.Close() // Read prefix var buf [md5.Size]byte n, _ := io.ReadFull(r, buf[:]) // Hash remainder h := md5.New() _, _ = io.Copy(h, r) s := h.Sum(nil) fmt.Printf("%s %d %x %x\n", p, st.Size(), buf[:n], s) } return nil })
Untuk ringkasnya, contoh ini mengabaikan ralat. Jangan lakukan ini dalam kod sebenar.
https://www.php.cn/link/b599e8250e4481aaa405a715419c8179
Atas ialah kandungan terperinci Gunakan io.FS baharu untuk fs.WalkDir dan senaraikan fail merentas jenis sistem fail. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!