1b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Use of this source code is governed by a BSD-style license that can be 3b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// found in the LICENSE file. 4b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 5b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#ifndef BASE_FILES_SCOPED_TEMP_DIR_H_ 6b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define BASE_FILES_SCOPED_TEMP_DIR_H_ 7b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 8b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// An object representing a temporary / scratch directory that should be cleaned 9b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// up (recursively) when this object goes out of scope. Note that since 10b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// deletion occurs during the destructor, no further error handling is possible 11b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// if the directory fails to be deleted. As a result, deletion is not 12b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// guaranteed by this class. 13b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// 14b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Multiple calls to the methods which establish a temporary directory 15b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// (CreateUniqueTempDir, CreateUniqueTempDirUnderPath, and Set) must have 16b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// intervening calls to Delete or Take, or the calls will fail. 17b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 18b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/base_export.h" 19b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/files/file_path.h" 20cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#include "base/macros.h" 21b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 22b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace base { 23b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 24b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratclass BASE_EXPORT ScopedTempDir { 25b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public: 26b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // No directory is owned/created initially. 27b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ScopedTempDir(); 28b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 29b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Recursively delete path. 30b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ~ScopedTempDir(); 31b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 32b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Creates a unique directory in TempPath, and takes ownership of it. 33b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // See file_util::CreateNewTemporaryDirectory. 34b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool CreateUniqueTempDir() WARN_UNUSED_RESULT; 35b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 36b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Creates a unique directory under a given path, and takes ownership of it. 37b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool CreateUniqueTempDirUnderPath(const FilePath& path) WARN_UNUSED_RESULT; 38b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 39b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Takes ownership of directory at |path|, creating it if necessary. 40b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Don't call multiple times unless Take() has been called first. 41b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool Set(const FilePath& path) WARN_UNUSED_RESULT; 42b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 43b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Deletes the temporary directory wrapped by this object. 44b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool Delete() WARN_UNUSED_RESULT; 45b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 46b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Caller takes ownership of the temporary directory so it won't be destroyed 47b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // when this object goes out of scope. 48b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FilePath Take(); 49b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 50b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const FilePath& path() const { return path_; } 51b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 52b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Returns true if path_ is non-empty and exists. 53b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool IsValid() const; 54b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 55b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat private: 56b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FilePath path_; 57b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 58b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat DISALLOW_COPY_AND_ASSIGN(ScopedTempDir); 59b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}; 60b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 61b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} // namespace base 62b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 63b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif // BASE_FILES_SCOPED_TEMP_DIR_H_ 64