1*6777b538SAndroid Build Coastguard Worker // Copyright 2011 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #include "base/files/scoped_temp_dir.h" 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Worker #include "base/files/file_util.h" 8*6777b538SAndroid Build Coastguard Worker #include "base/logging.h" 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker namespace base { 11*6777b538SAndroid Build Coastguard Worker 12*6777b538SAndroid Build Coastguard Worker namespace { 13*6777b538SAndroid Build Coastguard Worker 14*6777b538SAndroid Build Coastguard Worker constexpr FilePath::CharType kScopedDirPrefix[] = 15*6777b538SAndroid Build Coastguard Worker FILE_PATH_LITERAL("scoped_dir"); 16*6777b538SAndroid Build Coastguard Worker 17*6777b538SAndroid Build Coastguard Worker } // namespace 18*6777b538SAndroid Build Coastguard Worker 19*6777b538SAndroid Build Coastguard Worker ScopedTempDir::ScopedTempDir() = default; 20*6777b538SAndroid Build Coastguard Worker ScopedTempDir(ScopedTempDir && other)21*6777b538SAndroid Build Coastguard WorkerScopedTempDir::ScopedTempDir(ScopedTempDir&& other) noexcept 22*6777b538SAndroid Build Coastguard Worker : path_(other.Take()) {} 23*6777b538SAndroid Build Coastguard Worker operator =(ScopedTempDir && other)24*6777b538SAndroid Build Coastguard WorkerScopedTempDir& ScopedTempDir::operator=(ScopedTempDir&& other) { 25*6777b538SAndroid Build Coastguard Worker if (!path_.empty() && !Delete()) 26*6777b538SAndroid Build Coastguard Worker DLOG(WARNING) << "Could not delete temp dir in operator=()."; 27*6777b538SAndroid Build Coastguard Worker path_ = other.Take(); 28*6777b538SAndroid Build Coastguard Worker return *this; 29*6777b538SAndroid Build Coastguard Worker } 30*6777b538SAndroid Build Coastguard Worker ~ScopedTempDir()31*6777b538SAndroid Build Coastguard WorkerScopedTempDir::~ScopedTempDir() { 32*6777b538SAndroid Build Coastguard Worker if (!path_.empty() && !Delete()) 33*6777b538SAndroid Build Coastguard Worker DLOG(WARNING) << "Could not delete temp dir in dtor."; 34*6777b538SAndroid Build Coastguard Worker } 35*6777b538SAndroid Build Coastguard Worker CreateUniqueTempDir()36*6777b538SAndroid Build Coastguard Workerbool ScopedTempDir::CreateUniqueTempDir() { 37*6777b538SAndroid Build Coastguard Worker if (!path_.empty()) 38*6777b538SAndroid Build Coastguard Worker return false; 39*6777b538SAndroid Build Coastguard Worker 40*6777b538SAndroid Build Coastguard Worker // This "scoped_dir" prefix is only used on Windows and serves as a template 41*6777b538SAndroid Build Coastguard Worker // for the unique name. 42*6777b538SAndroid Build Coastguard Worker if (!CreateNewTempDirectory(kScopedDirPrefix, &path_)) 43*6777b538SAndroid Build Coastguard Worker return false; 44*6777b538SAndroid Build Coastguard Worker 45*6777b538SAndroid Build Coastguard Worker return true; 46*6777b538SAndroid Build Coastguard Worker } 47*6777b538SAndroid Build Coastguard Worker CreateUniqueTempDirUnderPath(const FilePath & base_path)48*6777b538SAndroid Build Coastguard Workerbool ScopedTempDir::CreateUniqueTempDirUnderPath(const FilePath& base_path) { 49*6777b538SAndroid Build Coastguard Worker if (!path_.empty()) 50*6777b538SAndroid Build Coastguard Worker return false; 51*6777b538SAndroid Build Coastguard Worker 52*6777b538SAndroid Build Coastguard Worker // If |base_path| does not exist, create it. 53*6777b538SAndroid Build Coastguard Worker if (!CreateDirectory(base_path)) 54*6777b538SAndroid Build Coastguard Worker return false; 55*6777b538SAndroid Build Coastguard Worker 56*6777b538SAndroid Build Coastguard Worker // Create a new, uniquely named directory under |base_path|. 57*6777b538SAndroid Build Coastguard Worker if (!CreateTemporaryDirInDir(base_path, kScopedDirPrefix, &path_)) 58*6777b538SAndroid Build Coastguard Worker return false; 59*6777b538SAndroid Build Coastguard Worker 60*6777b538SAndroid Build Coastguard Worker return true; 61*6777b538SAndroid Build Coastguard Worker } 62*6777b538SAndroid Build Coastguard Worker Set(const FilePath & path)63*6777b538SAndroid Build Coastguard Workerbool ScopedTempDir::Set(const FilePath& path) { 64*6777b538SAndroid Build Coastguard Worker if (!path_.empty()) 65*6777b538SAndroid Build Coastguard Worker return false; 66*6777b538SAndroid Build Coastguard Worker 67*6777b538SAndroid Build Coastguard Worker if (!DirectoryExists(path) && !CreateDirectory(path)) 68*6777b538SAndroid Build Coastguard Worker return false; 69*6777b538SAndroid Build Coastguard Worker 70*6777b538SAndroid Build Coastguard Worker path_ = path; 71*6777b538SAndroid Build Coastguard Worker return true; 72*6777b538SAndroid Build Coastguard Worker } 73*6777b538SAndroid Build Coastguard Worker Delete()74*6777b538SAndroid Build Coastguard Workerbool ScopedTempDir::Delete() { 75*6777b538SAndroid Build Coastguard Worker if (path_.empty()) 76*6777b538SAndroid Build Coastguard Worker return false; 77*6777b538SAndroid Build Coastguard Worker 78*6777b538SAndroid Build Coastguard Worker bool ret = DeletePathRecursively(path_); 79*6777b538SAndroid Build Coastguard Worker if (ret) { 80*6777b538SAndroid Build Coastguard Worker // We only clear the path if deleted the directory. 81*6777b538SAndroid Build Coastguard Worker path_.clear(); 82*6777b538SAndroid Build Coastguard Worker } 83*6777b538SAndroid Build Coastguard Worker 84*6777b538SAndroid Build Coastguard Worker return ret; 85*6777b538SAndroid Build Coastguard Worker } 86*6777b538SAndroid Build Coastguard Worker Take()87*6777b538SAndroid Build Coastguard WorkerFilePath ScopedTempDir::Take() { 88*6777b538SAndroid Build Coastguard Worker return std::exchange(path_, FilePath()); 89*6777b538SAndroid Build Coastguard Worker } 90*6777b538SAndroid Build Coastguard Worker GetPath() const91*6777b538SAndroid Build Coastguard Workerconst FilePath& ScopedTempDir::GetPath() const { 92*6777b538SAndroid Build Coastguard Worker DCHECK(!path_.empty()) << "Did you call CreateUniqueTempDir* before?"; 93*6777b538SAndroid Build Coastguard Worker return path_; 94*6777b538SAndroid Build Coastguard Worker } 95*6777b538SAndroid Build Coastguard Worker IsValid() const96*6777b538SAndroid Build Coastguard Workerbool ScopedTempDir::IsValid() const { 97*6777b538SAndroid Build Coastguard Worker return !path_.empty() && DirectoryExists(path_); 98*6777b538SAndroid Build Coastguard Worker } 99*6777b538SAndroid Build Coastguard Worker 100*6777b538SAndroid Build Coastguard Worker // static GetTempDirPrefix()101*6777b538SAndroid Build Coastguard Workerconst FilePath::CharType* ScopedTempDir::GetTempDirPrefix() { 102*6777b538SAndroid Build Coastguard Worker return kScopedDirPrefix; 103*6777b538SAndroid Build Coastguard Worker } 104*6777b538SAndroid Build Coastguard Worker 105*6777b538SAndroid Build Coastguard Worker } // namespace base 106