1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 11:02:59 +02:00

Support/FileSystem: Add create_director{y,ies} implementations.

llvm-svn: 120790
This commit is contained in:
Michael J. Spencer 2010-12-03 05:42:11 +00:00
parent ec560cdae3
commit 96236c93ff
3 changed files with 49 additions and 0 deletions

View File

@ -671,6 +671,21 @@ error_code is_relative(const Twine &path, bool &result) {
namespace fs {
error_code create_directories(const Twine &path, bool &existed) {
SmallString<128> path_storage;
StringRef p = path.toStringRef(path_storage);
StringRef parent;
bool parent_exists;
if (error_code ec = path::parent_path(p, parent)) return ec;
if (error_code ec = fs::exists(parent, parent_exists)) return ec;
if (!parent_exists)
return create_directories(parent, existed);
return create_directory(p, existed);
}
} // end namespace fs
} // end namespace sys
} // end namespace llvm

View File

@ -146,6 +146,20 @@ error_code copy_file(const Twine &from, const Twine &to, copy_option copt) {
return make_error_code(errc::success);
}
error_code create_directory(const Twine &path, bool &existed) {
SmallString<128> path_storage;
StringRef p = path.toNullTerminatedStringRef(path_storage);
if (::mkdir(p.begin(), 0700) == -1) {
if (errno != EEXIST)
return error_code(errno, system_category());
existed = true;
} else
existed = false;
return make_error_code(errc::success);
}
error_code exists(const Twine &path, bool &result) {
SmallString<128> path_storage;
StringRef p = path.toNullTerminatedStringRef(path_storage);

View File

@ -181,6 +181,26 @@ error_code copy_file(const Twine &from, const Twine &to, copy_option copt) {
return make_error_code(errc::success);
}
error_code create_directory(const Twine &path, bool &existed) {
SmallString<128> path_storage;
SmallVector<wchar_t, 128> path_utf16;
if (error_code ec = UTF8ToUTF16(path.toStringRef(path_storage),
path_utf16))
return ec;
if (!::CreateDirectoryW(path_utf16.begin(), NULL)) {
error_code ec = make_error_code(windows_error(::GetLastError()));
if (ec == make_error_code(windows_error::already_exists))
existed = true;
else
return ec;
} else
existed = false;
return make_error_code(errc::success);
}
error_code exists(const Twine &path, bool &result) {
SmallString<128> path_storage;
SmallVector<wchar_t, 128> path_utf16;