Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 11 additions & 10 deletions file.go
Original file line number Diff line number Diff line change
Expand Up @@ -87,22 +87,23 @@ func (f *File) SaveAs(name string, opts ...Options) error {

// Close closes and cleanup the open temporary file for the spreadsheet.
func (f *File) Close() error {
var err error
var firstErr error
if f.sharedStringTemp != nil {
if err := f.sharedStringTemp.Close(); err != nil {
return err
}
firstErr = f.sharedStringTemp.Close()
f.sharedStringTemp = nil
}
for _, stream := range f.streams {
_ = stream.rawData.Close()
}
f.streams = nil
f.tempFiles.Range(func(k, v interface{}) bool {
if err = os.Remove(v.(string)); err != nil {
return false
if err := os.Remove(v.(string)); err != nil && firstErr == nil {
firstErr = err
}
return true
})
for _, stream := range f.streams {
_ = stream.rawData.Close()
}
return err
f.tempFiles.Clear()
return firstErr
}

// Write provides a function to write to an io.Writer.
Expand Down
22 changes: 22 additions & 0 deletions file_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"math"
"os"
"path/filepath"
"strconv"
"strings"
"sync"
"testing"
Expand Down Expand Up @@ -164,3 +165,24 @@ func TestZip64(t *testing.T) {
assert.NoError(t, f.Close())
})
}

func TestRemoveTempFiles(t *testing.T) {
tmp, err := os.CreateTemp("", "excelize-*")
if err != nil {
t.Fatal(err)
}
tmpName := tmp.Name()
tmp.Close()
f := NewFile()
// fill the tempFiles map with non-existing (erroring on Remove) "files"
for i := 0; i < 1000; i++ {
f.tempFiles.Store(strconv.Itoa(i), "/hopefully not existing")
}
f.tempFiles.Store("existing", tmpName)

require.Error(t, f.Close())
if _, err := os.Stat(tmpName); err == nil {
t.Errorf("temp file %q still exist", tmpName)
os.Remove(tmpName)
}
}
2 changes: 1 addition & 1 deletion lib.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ func (f *File) ReadZipReader(r *zip.Reader) (map[string][]byte, int, error) {
// unzipToTemp unzip the zip entity to the system temporary directory and
// returned the unzipped file path.
func (f *File) unzipToTemp(zipFile *zip.File) (string, error) {
tmp, err := os.CreateTemp(os.TempDir(), "excelize-")
tmp, err := os.CreateTemp("", "excelize-")
if err != nil {
return "", err
}
Expand Down
8 changes: 5 additions & 3 deletions rows.go
Original file line number Diff line number Diff line change
Expand Up @@ -139,8 +139,10 @@ func (rows *Rows) Error() error {
// Close closes the open worksheet XML file in the system temporary
// directory.
func (rows *Rows) Close() error {
if rows.tempFile != nil {
return rows.tempFile.Close()
tempFile := rows.tempFile
rows.tempFile = nil
if tempFile != nil {
return tempFile.Close()
}
return nil
}
Expand Down Expand Up @@ -366,7 +368,7 @@ func (f *File) getFromStringItem(index int) string {
}()
}
f.sharedStringItem = [][]uint{}
f.sharedStringTemp, _ = os.CreateTemp(os.TempDir(), "excelize-")
f.sharedStringTemp, _ = os.CreateTemp("", "excelize-")
f.tempFiles.Store(defaultTempFileSST, f.sharedStringTemp.Name())
var (
inElement string
Expand Down
2 changes: 1 addition & 1 deletion stream.go
Original file line number Diff line number Diff line change
Expand Up @@ -775,7 +775,7 @@ func (bw *bufferedWriter) Sync() (err error) {
return nil
}
if bw.tmp == nil {
bw.tmp, err = os.CreateTemp(os.TempDir(), "excelize-")
bw.tmp, err = os.CreateTemp("", "excelize-")
if err != nil {
// can not use local storage
return nil
Expand Down