BLI: Add utility to access system-wide temporary directory
It provides path to a directory suitable for storing temporary files which satisfies the following conditions: - The directory exists. - The return path has trailing directory separator. It is based on the code used in the appdir.c to get the temporary directory. For the C++ people: this is similar to the temp_directory_path() from the std::filesystem. No functional changes expected as it is a new code which is planned to be used on other places as a followup development.
This commit is contained in:
committed by
Sergey Sharybin
parent
18a15bafe8
commit
8c38d29feb
27
source/blender/blenlib/BLI_tempfile.h
Normal file
27
source/blender/blenlib/BLI_tempfile.h
Normal file
@@ -0,0 +1,27 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-or-later
|
||||
* Copyright 2023 Blender Foundation. */
|
||||
|
||||
/** \file
|
||||
* \ingroup bli
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "BLI_sys_types.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Get the path to a directory suitable for temporary files.
|
||||
*
|
||||
* The return path is guaranteed to exist and to be a directory, as well as to contain a trailing
|
||||
* directory separator.
|
||||
*
|
||||
* At maximum the buffer_size number of characters is written to the temp_directory. The directory
|
||||
* path is always null-terminated. */
|
||||
void BLI_temp_directory_path_get(char *temp_directory, const size_t buffer_size);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@@ -147,6 +147,7 @@ set(SRC
|
||||
intern/task_pool.cc
|
||||
intern/task_range.cc
|
||||
intern/task_scheduler.cc
|
||||
intern/tempfile.c
|
||||
intern/threads.cc
|
||||
intern/time.c
|
||||
intern/timecode.c
|
||||
@@ -347,6 +348,7 @@ set(SRC
|
||||
BLI_system.h
|
||||
BLI_task.h
|
||||
BLI_task.hh
|
||||
BLI_tempfile.h
|
||||
BLI_threads.h
|
||||
BLI_timecode.h
|
||||
BLI_timeit.hh
|
||||
@@ -533,6 +535,7 @@ if(WITH_GTESTS)
|
||||
tests/BLI_string_utf8_test.cc
|
||||
tests/BLI_task_graph_test.cc
|
||||
tests/BLI_task_test.cc
|
||||
tests/BLI_tempfile_test.cc
|
||||
tests/BLI_uuid_test.cc
|
||||
tests/BLI_vector_set_test.cc
|
||||
tests/BLI_vector_test.cc
|
||||
|
||||
42
source/blender/blenlib/intern/tempfile.c
Normal file
42
source/blender/blenlib/intern/tempfile.c
Normal file
@@ -0,0 +1,42 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-or-later
|
||||
* Copyright 2023 Blender Foundation. */
|
||||
|
||||
#include "BLI_tempfile.h"
|
||||
|
||||
#include "BLI_fileops.h"
|
||||
#include "BLI_path_util.h"
|
||||
#include "BLI_string.h"
|
||||
|
||||
void BLI_temp_directory_path_get(char *temp_directory, const size_t buffer_size)
|
||||
{
|
||||
temp_directory[0] = '\0';
|
||||
|
||||
const char *env_vars[] = {
|
||||
#ifdef WIN32
|
||||
"TEMP",
|
||||
#else
|
||||
/* Non standard (could be removed). */
|
||||
"TMP",
|
||||
/* Posix standard. */
|
||||
"TMPDIR",
|
||||
#endif
|
||||
};
|
||||
|
||||
for (int i = 0; i < ARRAY_SIZE(env_vars); i++) {
|
||||
const char *tmp = BLI_getenv(env_vars[i]);
|
||||
if (tmp && (tmp[0] != '\0') && BLI_is_dir(tmp)) {
|
||||
BLI_strncpy(temp_directory, tmp, buffer_size);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (temp_directory[0] == '\0') {
|
||||
BLI_strncpy(temp_directory, "/tmp/", buffer_size);
|
||||
}
|
||||
else {
|
||||
/* Add a trailing slash if needed. */
|
||||
BLI_path_slash_ensure(temp_directory, buffer_size);
|
||||
}
|
||||
|
||||
BLI_dir_create_recursive(temp_directory);
|
||||
}
|
||||
27
source/blender/blenlib/tests/BLI_tempfile_test.cc
Normal file
27
source/blender/blenlib/tests/BLI_tempfile_test.cc
Normal file
@@ -0,0 +1,27 @@
|
||||
/* SPDX-License-Identifier: Apache-2.0 */
|
||||
|
||||
#include "BLI_tempfile.h"
|
||||
|
||||
#include "BLI_fileops.h"
|
||||
#include "BLI_path_util.h"
|
||||
|
||||
#include "testing/testing.h"
|
||||
|
||||
namespace blender::tests {
|
||||
|
||||
TEST(BLI_tempfile, BLI_temp_directory_path_get)
|
||||
{
|
||||
char temp_dir[FILE_MAX];
|
||||
BLI_temp_directory_path_get(temp_dir, sizeof(temp_dir));
|
||||
|
||||
ASSERT_STRNE(temp_dir, "");
|
||||
|
||||
EXPECT_EQ(temp_dir[strlen(temp_dir) - 1], SEP);
|
||||
|
||||
EXPECT_TRUE(BLI_exists(temp_dir));
|
||||
EXPECT_TRUE(BLI_is_dir(temp_dir));
|
||||
|
||||
EXPECT_TRUE(BLI_path_is_abs_from_cwd(temp_dir));
|
||||
}
|
||||
|
||||
} // namespace blender::tests
|
||||
Reference in New Issue
Block a user