| // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "base/files/scoped_temp_dir.h" | 
 |  | 
 | #include "base/files/file_util.h" | 
 | #include "base/logging.h" | 
 |  | 
 | namespace base { | 
 |  | 
 | namespace { | 
 |  | 
 | constexpr FilePath::CharType kScopedDirPrefix[] = | 
 |     FILE_PATH_LITERAL("scoped_dir"); | 
 |  | 
 | }  // namespace | 
 |  | 
 | ScopedTempDir::ScopedTempDir() = default; | 
 |  | 
 | ScopedTempDir::~ScopedTempDir() { | 
 |   if (!path_.empty() && !Delete()) | 
 |     DLOG(WARNING) << "Could not delete temp dir in dtor."; | 
 | } | 
 |  | 
 | bool ScopedTempDir::CreateUniqueTempDir() { | 
 |   if (!path_.empty()) | 
 |     return false; | 
 |  | 
 |   // This "scoped_dir" prefix is only used on Windows and serves as a template | 
 |   // for the unique name. | 
 |   if (!base::CreateNewTempDirectory(kScopedDirPrefix, &path_)) | 
 |     return false; | 
 |  | 
 |   return true; | 
 | } | 
 |  | 
 | bool ScopedTempDir::CreateUniqueTempDirUnderPath(const FilePath& base_path) { | 
 |   if (!path_.empty()) | 
 |     return false; | 
 |  | 
 |   // If |base_path| does not exist, create it. | 
 |   if (!base::CreateDirectory(base_path)) | 
 |     return false; | 
 |  | 
 |   // Create a new, uniquely named directory under |base_path|. | 
 |   if (!base::CreateTemporaryDirInDir(base_path, kScopedDirPrefix, &path_)) | 
 |     return false; | 
 |  | 
 |   return true; | 
 | } | 
 |  | 
 | bool ScopedTempDir::Set(const FilePath& path) { | 
 |   if (!path_.empty()) | 
 |     return false; | 
 |  | 
 |   if (!DirectoryExists(path) && !base::CreateDirectory(path)) | 
 |     return false; | 
 |  | 
 |   path_ = path; | 
 |   return true; | 
 | } | 
 |  | 
 | bool ScopedTempDir::Delete() { | 
 |   if (path_.empty()) | 
 |     return false; | 
 |  | 
 |   bool ret = base::DeleteFile(path_, true); | 
 |   if (ret) { | 
 |     // We only clear the path if deleted the directory. | 
 |     path_.clear(); | 
 |   } | 
 |  | 
 |   return ret; | 
 | } | 
 |  | 
 | FilePath ScopedTempDir::Take() { | 
 |   FilePath ret = path_; | 
 |   path_ = FilePath(); | 
 |   return ret; | 
 | } | 
 |  | 
 | const FilePath& ScopedTempDir::GetPath() const { | 
 |   DCHECK(!path_.empty()) << "Did you call CreateUniqueTempDir* before?"; | 
 |   return path_; | 
 | } | 
 |  | 
 | bool ScopedTempDir::IsValid() const { | 
 |   return !path_.empty() && DirectoryExists(path_); | 
 | } | 
 |  | 
 | // static | 
 | const FilePath::CharType* ScopedTempDir::GetTempDirPrefix() { | 
 |   return kScopedDirPrefix; | 
 | } | 
 |  | 
 | }  // namespace base |