| // 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 |