1b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Use of this source code is governed by a BSD-style license that can be 3b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// found in the LICENSE file. 4b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 5b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/files/scoped_temp_dir.h" 6b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 7b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/files/file_util.h" 8b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/logging.h" 9b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 10b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace base { 11b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 12b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratScopedTempDir::ScopedTempDir() { 13b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 14b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 15b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratScopedTempDir::~ScopedTempDir() { 16b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (!path_.empty() && !Delete()) 17b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat DLOG(WARNING) << "Could not delete temp dir in dtor."; 18b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 19b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 20b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratbool ScopedTempDir::CreateUniqueTempDir() { 21b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (!path_.empty()) 22b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return false; 23b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 24b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // This "scoped_dir" prefix is only used on Windows and serves as a template 25b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // for the unique name. 26b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (!base::CreateNewTempDirectory(FILE_PATH_LITERAL("scoped_dir"), &path_)) 27b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return false; 28b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 29b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return true; 30b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 31b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 32b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratbool ScopedTempDir::CreateUniqueTempDirUnderPath(const FilePath& base_path) { 33b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (!path_.empty()) 34b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return false; 35b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 36b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // If |base_path| does not exist, create it. 37b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (!base::CreateDirectory(base_path)) 38b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return false; 39b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 40b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Create a new, uniquely named directory under |base_path|. 41b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (!base::CreateTemporaryDirInDir(base_path, 42b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FILE_PATH_LITERAL("scoped_dir_"), 43b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat &path_)) 44b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return false; 45b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 46b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return true; 47b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 48b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 49b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratbool ScopedTempDir::Set(const FilePath& path) { 50b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (!path_.empty()) 51b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return false; 52b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 53b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (!DirectoryExists(path) && !base::CreateDirectory(path)) 54b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return false; 55b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 56b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat path_ = path; 57b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return true; 58b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 59b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 60b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratbool ScopedTempDir::Delete() { 61b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (path_.empty()) 62b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return false; 63b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 64b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool ret = base::DeleteFile(path_, true); 65b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (ret) { 66b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // We only clear the path if deleted the directory. 67b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat path_.clear(); 68b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 69b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 70b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return ret; 71b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 72b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 73b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratFilePath ScopedTempDir::Take() { 74b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FilePath ret = path_; 75b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat path_ = FilePath(); 76b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return ret; 77b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 78b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 793a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelliconst FilePath& ScopedTempDir::GetPath() const { 803a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli DCHECK(!path_.empty()) << "Did you call CreateUniqueTempDir* before?"; 813a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli return path_; 823a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli} 833a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli 84b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratbool ScopedTempDir::IsValid() const { 85b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return !path_.empty() && DirectoryExists(path_); 86b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 87b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 88b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} // namespace base 89