Home | History | Annotate | Download | only in memory
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "base/memory/scoped_temp_dir.h"
      6 
      7 #include "base/file_util.h"
      8 #include "base/logging.h"
      9 
     10 ScopedTempDir::ScopedTempDir() {
     11 }
     12 
     13 ScopedTempDir::~ScopedTempDir() {
     14   if (!path_.empty() && !Delete())
     15     LOG(WARNING) << "Could not delete temp dir in dtor.";
     16 }
     17 
     18 bool ScopedTempDir::CreateUniqueTempDir() {
     19   if (!path_.empty())
     20     return false;
     21 
     22   // This "scoped_dir" prefix is only used on Windows and serves as a template
     23   // for the unique name.
     24   if (!file_util::CreateNewTempDirectory(FILE_PATH_LITERAL("scoped_dir"),
     25                                          &path_))
     26     return false;
     27 
     28   return true;
     29 }
     30 
     31 bool ScopedTempDir::CreateUniqueTempDirUnderPath(const FilePath& base_path) {
     32   if (!path_.empty())
     33     return false;
     34 
     35   // If |base_path| does not exist, create it.
     36   if (!file_util::CreateDirectory(base_path))
     37     return false;
     38 
     39   // Create a new, uniquely named directory under |base_path|.
     40   if (!file_util::CreateTemporaryDirInDir(
     41           base_path,
     42           FILE_PATH_LITERAL("scoped_dir_"),
     43           &path_))
     44     return false;
     45 
     46   return true;
     47 }
     48 
     49 bool ScopedTempDir::Set(const FilePath& path) {
     50   if (!path_.empty())
     51     return false;
     52 
     53   if (!file_util::DirectoryExists(path) &&
     54       !file_util::CreateDirectory(path))
     55     return false;
     56 
     57   path_ = path;
     58   return true;
     59 }
     60 
     61 bool ScopedTempDir::Delete() {
     62   if (path_.empty())
     63     return false;
     64 
     65   bool ret = file_util::Delete(path_, true);
     66   if (ret) {
     67     // We only clear the path if deleted the directory.
     68     path_.clear();
     69   } else {
     70     LOG(ERROR) << "ScopedTempDir unable to delete " << path_.value();
     71   }
     72 
     73   return ret;
     74 }
     75 
     76 FilePath ScopedTempDir::Take() {
     77   FilePath ret = path_;
     78   path_ = FilePath();
     79   return ret;
     80 }
     81 
     82 bool ScopedTempDir::IsValid() const {
     83   return !path_.empty() && file_util::DirectoryExists(path_);
     84 }
     85