16d528ed9Sopenharmony_ci// Copyright (c) 2011 The Chromium Authors. All rights reserved. 26d528ed9Sopenharmony_ci// Use of this source code is governed by a BSD-style license that can be 36d528ed9Sopenharmony_ci// found in the LICENSE file. 46d528ed9Sopenharmony_ci 56d528ed9Sopenharmony_ci#include "base/files/scoped_temp_dir.h" 66d528ed9Sopenharmony_ci 76d528ed9Sopenharmony_ci#include "base/files/file_util.h" 86d528ed9Sopenharmony_ci#include "base/logging.h" 96d528ed9Sopenharmony_ci 106d528ed9Sopenharmony_cinamespace base { 116d528ed9Sopenharmony_ci 126d528ed9Sopenharmony_cinamespace { 136d528ed9Sopenharmony_ci 146d528ed9Sopenharmony_ciconstexpr FilePath::CharType kScopedDirPrefix[] = 156d528ed9Sopenharmony_ci FILE_PATH_LITERAL("scoped_dir"); 166d528ed9Sopenharmony_ci 176d528ed9Sopenharmony_ci} // namespace 186d528ed9Sopenharmony_ci 196d528ed9Sopenharmony_ciScopedTempDir::ScopedTempDir() = default; 206d528ed9Sopenharmony_ci 216d528ed9Sopenharmony_ciScopedTempDir::~ScopedTempDir() { 226d528ed9Sopenharmony_ci if (!path_.empty() && !Delete()) 236d528ed9Sopenharmony_ci DLOG(WARNING) << "Could not delete temp dir in dtor."; 246d528ed9Sopenharmony_ci} 256d528ed9Sopenharmony_ci 266d528ed9Sopenharmony_cibool ScopedTempDir::CreateUniqueTempDir() { 276d528ed9Sopenharmony_ci if (!path_.empty()) 286d528ed9Sopenharmony_ci return false; 296d528ed9Sopenharmony_ci 306d528ed9Sopenharmony_ci // This "scoped_dir" prefix is only used on Windows and serves as a template 316d528ed9Sopenharmony_ci // for the unique name. 326d528ed9Sopenharmony_ci if (!base::CreateNewTempDirectory(kScopedDirPrefix, &path_)) 336d528ed9Sopenharmony_ci return false; 346d528ed9Sopenharmony_ci 356d528ed9Sopenharmony_ci return true; 366d528ed9Sopenharmony_ci} 376d528ed9Sopenharmony_ci 386d528ed9Sopenharmony_cibool ScopedTempDir::CreateUniqueTempDirUnderPath(const FilePath& base_path) { 396d528ed9Sopenharmony_ci if (!path_.empty()) 406d528ed9Sopenharmony_ci return false; 416d528ed9Sopenharmony_ci 426d528ed9Sopenharmony_ci // If |base_path| does not exist, create it. 436d528ed9Sopenharmony_ci if (!base::CreateDirectory(base_path)) 446d528ed9Sopenharmony_ci return false; 456d528ed9Sopenharmony_ci 466d528ed9Sopenharmony_ci // Create a new, uniquely named directory under |base_path|. 476d528ed9Sopenharmony_ci if (!base::CreateTemporaryDirInDir(base_path, kScopedDirPrefix, &path_)) 486d528ed9Sopenharmony_ci return false; 496d528ed9Sopenharmony_ci 506d528ed9Sopenharmony_ci return true; 516d528ed9Sopenharmony_ci} 526d528ed9Sopenharmony_ci 536d528ed9Sopenharmony_cibool ScopedTempDir::Set(const FilePath& path) { 546d528ed9Sopenharmony_ci if (!path_.empty()) 556d528ed9Sopenharmony_ci return false; 566d528ed9Sopenharmony_ci 576d528ed9Sopenharmony_ci if (!DirectoryExists(path) && !base::CreateDirectory(path)) 586d528ed9Sopenharmony_ci return false; 596d528ed9Sopenharmony_ci 606d528ed9Sopenharmony_ci path_ = path; 616d528ed9Sopenharmony_ci return true; 626d528ed9Sopenharmony_ci} 636d528ed9Sopenharmony_ci 646d528ed9Sopenharmony_cibool ScopedTempDir::Delete() { 656d528ed9Sopenharmony_ci if (path_.empty()) 666d528ed9Sopenharmony_ci return false; 676d528ed9Sopenharmony_ci 686d528ed9Sopenharmony_ci bool ret = base::DeleteFile(path_, true); 696d528ed9Sopenharmony_ci if (ret) { 706d528ed9Sopenharmony_ci // We only clear the path if deleted the directory. 716d528ed9Sopenharmony_ci path_.clear(); 726d528ed9Sopenharmony_ci } 736d528ed9Sopenharmony_ci 746d528ed9Sopenharmony_ci return ret; 756d528ed9Sopenharmony_ci} 766d528ed9Sopenharmony_ci 776d528ed9Sopenharmony_ciFilePath ScopedTempDir::Take() { 786d528ed9Sopenharmony_ci FilePath ret = path_; 796d528ed9Sopenharmony_ci path_ = FilePath(); 806d528ed9Sopenharmony_ci return ret; 816d528ed9Sopenharmony_ci} 826d528ed9Sopenharmony_ci 836d528ed9Sopenharmony_ciconst FilePath& ScopedTempDir::GetPath() const { 846d528ed9Sopenharmony_ci DCHECK(!path_.empty()) << "Did you call CreateUniqueTempDir* before?"; 856d528ed9Sopenharmony_ci return path_; 866d528ed9Sopenharmony_ci} 876d528ed9Sopenharmony_ci 886d528ed9Sopenharmony_cibool ScopedTempDir::IsValid() const { 896d528ed9Sopenharmony_ci return !path_.empty() && DirectoryExists(path_); 906d528ed9Sopenharmony_ci} 916d528ed9Sopenharmony_ci 926d528ed9Sopenharmony_ci// static 936d528ed9Sopenharmony_ciconst FilePath::CharType* ScopedTempDir::GetTempDirPrefix() { 946d528ed9Sopenharmony_ci return kScopedDirPrefix; 956d528ed9Sopenharmony_ci} 966d528ed9Sopenharmony_ci 976d528ed9Sopenharmony_ci} // namespace base 98