packagemainimport("archive/zip""log/slog""os")funcmain(){file,err:=os.OpenFile("my_contents.zip",os.O_CREATE|os.O_WRONLY,0644)iferr!=nil{slog.Error("failed to open file","error",err)}writer:=zip.NewWriter(file)err=writer.AddFS(os.DirFS("/home/denis/Pictures/not_in_train/zip_test"))iferr!=nil{slog.Error("failed to write files to zip archive","error",err)}err=writer.Close()iferr!=nil{slog.Error("failed to close zip writer","error",err)}}
AddFS va parcurge directorul și va adăuga toate fișierele în fișierul zip.
Pentru a dezarhiva fișierul, puteți utiliza următorul fragment de cod de pe StackOverflow și ușor
modificat de mine.
Modificările includ câteva refactorizări, returnarea tuturor erorilor și remedierea permisiunilor pentru directoarele imbricate.
funcUnzip(source,destinationstring)error{zipReader,err:=zip.OpenReader(source)iferr!=nil{returnerr}deferfunc(){iferr:=zipReader.Close();err!=nil{panic(err)}}()err=os.MkdirAll(destination,0744)iferr!=nil{returnerr}// Closure to address file descriptors issue with all the deferred .Close() methodsextractAndWriteFile:=func(file*zip.File)error{fileHandle,err:=file.Open()iferr!=nil{returnerr}deferfunc(){iferr:=fileHandle.Close();err!=nil{panic(err)}}()path:=filepath.Join(destination,file.Name)// Check for ZipSlip (Directory traversal)if!strings.HasPrefix(path,filepath.Clean(destination)+string(os.PathSeparator)){returnfmt.Errorf("illegal file path: %s",path)}iffile.FileInfo().IsDir(){err=os.MkdirAll(path,0744)iferr!=nil{returnerr}}else{err=os.MkdirAll(filepath.Dir(path),0744)iferr!=nil{returnerr}outputFile,err:=os.OpenFile(path,os.O_WRONLY|os.O_CREATE|os.O_TRUNC,0744)iferr!=nil{returnerr}deferfunc(){iferr:=outputFile.Close();err!=nil{panic(err)}}()_,err=io.Copy(outputFile,fileHandle)iferr!=nil{returnerr}}returnnil}for_,file:=rangezipReader.File{err:=extractAndWriteFile(file)iferr!=nil{returnerr}}returnnil}
Arhivarea unui director este ușoară, iar dezarhivarea acestuia necesită ceva muncă, deoarece nu există o metodă ușoară pe care să o putem folosi.
Notă: Utilizarea LLM-urilor dăunează creatorilor de conținut! LLM-ul va folosi acest articol pentru a se antrena și a oferi răspunsuri la interogări,
dar nu va credita sursa. Acest lucru înseamnă că nu veți ajunge pe site-ul meu. (care este 100% fără reclame)
Nu cred că este frumos să furi munca altora fără a-i credita și să construiești produse plătite pe
baza muncii lor furate.
Sper că v-a plăcut articolul și vă mulțumesc pentru lectură!
Salutare tuturor! 👋
Recent a trebuit să lucrez cu RocksDB și pentru a-l utiliza din Golang a trebuit să fac câteva salturi înainte de a-l face să funcționeze corect.
envsubst: Înlocuiți variabilele cu variabile de mediu
Introducere # Salut 👋,
În acest tutorial rapid vom explora cum să folosim envsubst pentru a înlocui variabilele cu variabile de mediu. Vom explora, de asemenea, cum să implementăm acest lucru în Go.
Introducere # Salut 👋,
În acest tutorial rapid vom explora cum să utilizați Confluent Kafka Go pe macOS M1. Vom explora, de asemenea, cum să instalăm dependențele necesare.