diff options
author | Russ Cox <rsc@golang.org> | 2011-03-03 14:51:49 -0500 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2011-03-03 14:51:49 -0500 |
commit | 9ebe384b71c8abffd64c50aa619fc4e4b9163261 (patch) | |
tree | ea79acac458f100db4dd8ad2cf5a536e624a5871 | |
parent | da833474f57150a98d73c10df214a6364d475c5c (diff) | |
download | go-9ebe384b71c8abffd64c50aa619fc4e4b9163261.tar.gz go-9ebe384b71c8abffd64c50aa619fc4e4b9163261.zip |
io/ioutil: add TempDir
It's a little confusing that os.TempDir and ioutil.TempDir have
different meanings. I don't know what to change the names to,
if anything. At least they also have different signatures.
R=golang-dev, bradfitzgo, r, gri
CC=golang-dev
https://golang.org/cl/4247051
-rw-r--r-- | src/pkg/io/ioutil/tempfile.go | 32 | ||||
-rw-r--r-- | src/pkg/io/ioutil/tempfile_test.go | 24 |
2 files changed, 54 insertions, 2 deletions
diff --git a/src/pkg/io/ioutil/tempfile.go b/src/pkg/io/ioutil/tempfile.go index 114eca2b50..c7cc67b1b7 100644 --- a/src/pkg/io/ioutil/tempfile.go +++ b/src/pkg/io/ioutil/tempfile.go @@ -46,6 +46,7 @@ func TempFile(dir, prefix string) (f *os.File, err os.Error) { nconflict := 0 for i := 0; i < 10000; i++ { + // TODO(rsc): use filepath.Join name := dir + "/" + prefix + nextSuffix() f, err = os.Open(name, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0600) if pe, ok := err.(*os.PathError); ok && pe.Error == os.EEXIST { @@ -58,3 +59,34 @@ func TempFile(dir, prefix string) (f *os.File, err os.Error) { } return } + +// TempDir creates a new temporary directory in the directory dir +// with a name beginning with prefix and returns the path of the +// new directory. If dir is the empty string, TempDir uses the +// default directory for temporary files (see os.TempDir). +// Multiple programs calling TempDir simultaneously +// will not choose the same directory. It is the caller's responsibility +// to remove the directory when no longer needed. +func TempDir(dir, prefix string) (name string, err os.Error) { + if dir == "" { + dir = os.TempDir() + } + + nconflict := 0 + for i := 0; i < 10000; i++ { + // TODO(rsc): use filepath.Join + try := dir + "/" + prefix + nextSuffix() + err = os.Mkdir(try, 0700) + if pe, ok := err.(*os.PathError); ok && pe.Error == os.EEXIST { + if nconflict++; nconflict > 10 { + rand = reseed() + } + continue + } + if err == nil { + name = try + } + break + } + return +} diff --git a/src/pkg/io/ioutil/tempfile_test.go b/src/pkg/io/ioutil/tempfile_test.go index d949a86cf0..6013ec1d4a 100644 --- a/src/pkg/io/ioutil/tempfile_test.go +++ b/src/pkg/io/ioutil/tempfile_test.go @@ -23,11 +23,31 @@ func TestTempFile(t *testing.T) { t.Errorf("TempFile(dir, `ioutil_test`) = %v, %v", f, err) } if f != nil { + f.Close() + os.Remove(f.Name()) re := regexp.MustCompile("^" + regexp.QuoteMeta(dir) + "/ioutil_test[0-9]+$") if !re.MatchString(f.Name()) { t.Errorf("TempFile(`"+dir+"`, `ioutil_test`) created bad name %s", f.Name()) } - os.Remove(f.Name()) } - f.Close() +} + +func TestTempDir(t *testing.T) { + name, err := TempDir("/_not_exists_", "foo") + if name != "" || err == nil { + t.Errorf("TempDir(`/_not_exists_`, `foo`) = %v, %v", name, err) + } + + dir := os.TempDir() + name, err = TempDir(dir, "ioutil_test") + if name == "" || err != nil { + t.Errorf("TempDir(dir, `ioutil_test`) = %v, %v", name, err) + } + if name != "" { + os.Remove(name) + re := regexp.MustCompile("^" + regexp.QuoteMeta(dir) + "/ioutil_test[0-9]+$") + if !re.MatchString(name) { + t.Errorf("TempDir(`"+dir+"`, `ioutil_test`) created bad name %s", name) + } + } } |