mirror of
https://github.com/golang/go
synced 2024-11-22 03:14:41 -07:00
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
This commit is contained in:
parent
da833474f5
commit
9ebe384b71
@ -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) {
|
|||||||
}
|
}
|
||||||
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) {
|
|||||||
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user