mirror of https://github.com/PCSX2/pcsx2.git
FileSystem: Add CreateSymLink function
This commit is contained in:
parent
b8ff171127
commit
1ed3001358
|
@ -1961,6 +1961,26 @@ bool FileSystem::SetPathCompression(const char* path, bool enable)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool FileSystem::CreateSymLink(const char* link, const char* target)
|
||||||
|
{
|
||||||
|
// convert to wide string
|
||||||
|
const std::wstring wlink = GetWin32Path(link);
|
||||||
|
if (wlink.empty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
const std::wstring wtarget = GetWin32Path(target);
|
||||||
|
if (wtarget.empty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// check if it's a directory
|
||||||
|
DWORD flags = 0;
|
||||||
|
if (DirectoryExists(target))
|
||||||
|
flags |= SYMBOLIC_LINK_FLAG_DIRECTORY;
|
||||||
|
|
||||||
|
// create the symbolic link
|
||||||
|
return CreateSymbolicLinkW(wlink.c_str(), wtarget.c_str(), flags) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
bool FileSystem::IsSymbolicLink(const char* path)
|
bool FileSystem::IsSymbolicLink(const char* path)
|
||||||
{
|
{
|
||||||
// convert to wide string
|
// convert to wide string
|
||||||
|
@ -2541,6 +2561,11 @@ bool FileSystem::SetPathCompression(const char* path, bool enable)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool FileSystem::CreateSymLink(const char* link, const char* target)
|
||||||
|
{
|
||||||
|
return symlink(target, link) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
bool FileSystem::IsSymbolicLink(const char* path)
|
bool FileSystem::IsSymbolicLink(const char* path)
|
||||||
{
|
{
|
||||||
struct stat sysStatData;
|
struct stat sysStatData;
|
||||||
|
|
|
@ -178,6 +178,10 @@ namespace FileSystem
|
||||||
/// Does nothing and returns false on non-Windows platforms.
|
/// Does nothing and returns false on non-Windows platforms.
|
||||||
bool SetPathCompression(const char* path, bool enable);
|
bool SetPathCompression(const char* path, bool enable);
|
||||||
|
|
||||||
|
// Creates a symbolic link. Note that on Windows this requires elevated
|
||||||
|
// privileges so this is mostly useful for testing purposes.
|
||||||
|
bool CreateSymLink(const char* link, const char* target);
|
||||||
|
|
||||||
/// Checks if a file or directory is a symbolic link.
|
/// Checks if a file or directory is a symbolic link.
|
||||||
bool IsSymbolicLink(const char* path);
|
bool IsSymbolicLink(const char* path);
|
||||||
|
|
||||||
|
|
|
@ -7,8 +7,6 @@
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
static std::optional<std::string> create_test_directory()
|
static std::optional<std::string> create_test_directory()
|
||||||
{
|
{
|
||||||
for (u16 i = 0; i < UINT16_MAX; i++)
|
for (u16 i = 0; i < UINT16_MAX; i++)
|
||||||
|
@ -42,7 +40,7 @@ TEST(FileSystem, RecursiveDeleteDirectoryDontFollowSymbolicLinks)
|
||||||
std::string dir_to_delete = Path::Combine(*test_dir, "dir_to_delete");
|
std::string dir_to_delete = Path::Combine(*test_dir, "dir_to_delete");
|
||||||
ASSERT_TRUE(FileSystem::CreateDirectoryPath(dir_to_delete.c_str(), false));
|
ASSERT_TRUE(FileSystem::CreateDirectoryPath(dir_to_delete.c_str(), false));
|
||||||
std::string symlink_path = Path::Combine(dir_to_delete, "link");
|
std::string symlink_path = Path::Combine(dir_to_delete, "link");
|
||||||
ASSERT_EQ(symlink(target_dir.c_str(), symlink_path.c_str()), 0);
|
ASSERT_TRUE(FileSystem::CreateSymLink(symlink_path.c_str(), target_dir.c_str()));
|
||||||
|
|
||||||
// Delete the directory containing the symlink.
|
// Delete the directory containing the symlink.
|
||||||
ASSERT_TRUE(dir_to_delete.starts_with("/tmp/pcsx2_filesystem_test_"));
|
ASSERT_TRUE(dir_to_delete.starts_with("/tmp/pcsx2_filesystem_test_"));
|
||||||
|
|
Loading…
Reference in New Issue