xref: /aosp_15_r20/external/libchrome/base/files/scoped_temp_dir.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
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 Worker ScopedTempDir::~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 Worker bool 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 Worker bool 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 Worker bool 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 Worker bool 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 Worker FilePath 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 Worker const 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 Worker bool 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 Worker const 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