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