Commit 9ebe384b authored by Russ Cox's avatar Russ Cox

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
parent da833474
...@@ -46,6 +46,7 @@ func TempFile(dir, prefix string) (f *os.File, err os.Error) { ...@@ -46,6 +46,7 @@ func TempFile(dir, prefix string) (f *os.File, err os.Error) {
nconflict := 0 nconflict := 0
for i := 0; i < 10000; i++ { for i := 0; i < 10000; i++ {
// TODO(rsc): use filepath.Join
name := dir + "/" + prefix + nextSuffix() name := dir + "/" + prefix + nextSuffix()
f, err = os.Open(name, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0600) 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 { 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) { ...@@ -58,3 +59,34 @@ func TempFile(dir, prefix string) (f *os.File, err os.Error) {
} }
return 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
}
...@@ -23,11 +23,31 @@ func TestTempFile(t *testing.T) { ...@@ -23,11 +23,31 @@ func TestTempFile(t *testing.T) {
t.Errorf("TempFile(dir, `ioutil_test`) = %v, %v", f, err) t.Errorf("TempFile(dir, `ioutil_test`) = %v, %v", f, err)
} }
if f != nil { if f != nil {
f.Close()
os.Remove(f.Name())
re := regexp.MustCompile("^" + regexp.QuoteMeta(dir) + "/ioutil_test[0-9]+$") re := regexp.MustCompile("^" + regexp.QuoteMeta(dir) + "/ioutil_test[0-9]+$")
if !re.MatchString(f.Name()) { if !re.MatchString(f.Name()) {
t.Errorf("TempFile(`"+dir+"`, `ioutil_test`) created bad name %s", 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)
}
}
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment