From 32ae45d9928718f1f9b8b68d54c154514a3d8a48 Mon Sep 17 00:00:00 2001 From: baldurk Date: Sun, 2 Aug 2015 15:42:33 +0200 Subject: [PATCH] Create any parent directory required for log file --- renderdoc/core/core.cpp | 2 ++ renderdoc/os/linux/linux_stringio.cpp | 24 ++++++++++++++++++++++++ renderdoc/os/os_specific.h | 2 ++ renderdoc/os/win32/win32_stringio.cpp | 14 ++++++++++++++ 4 files changed, 42 insertions(+) diff --git a/renderdoc/core/core.cpp b/renderdoc/core/core.cpp index f7fbc82e0..83793971c 100644 --- a/renderdoc/core/core.cpp +++ b/renderdoc/core/core.cpp @@ -736,6 +736,8 @@ void RenderDoc::SetLogFile(const char *logFile) if(m_LogFile.substr(m_LogFile.length()-4) == ".rdc") m_LogFile = m_LogFile.substr(0, m_LogFile.length()-4); + + FileIO::CreateParentDirectory(m_LogFile); } void RenderDoc::SetProgress(LoadProgressSection section, float delta) diff --git a/renderdoc/os/linux/linux_stringio.cpp b/renderdoc/os/linux/linux_stringio.cpp index 184058e9b..107a60a21 100644 --- a/renderdoc/os/linux/linux_stringio.cpp +++ b/renderdoc/os/linux/linux_stringio.cpp @@ -145,6 +145,30 @@ namespace FileIO return ret + filename; } + void CreateParentDirectory(const string &filename) + { + string fn = dirname(filename); + + // want trailing slash so that we create all directories + fn.push_back('/'); + + if(fn[0] != '/') + return; + + size_t offs = fn.find('/', 1); + + while(offs != string::npos) + { + // create directory path from 0 to offs by NULLing the + // / at offs, mkdir, then set it back + fn[offs] = 0; + mkdir(fn.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); + fn[offs] = '/'; + + offs = fn.find_first_of('/', offs+1); + } + } + string GetFullPathname(const string &filename) { char path[512] = {0}; diff --git a/renderdoc/os/os_specific.h b/renderdoc/os/os_specific.h index 7b0fc563f..3eb968104 100644 --- a/renderdoc/os/os_specific.h +++ b/renderdoc/os/os_specific.h @@ -177,6 +177,8 @@ namespace FileIO string GetAppFolderFilename(const string &filename); string GetReplayAppFilename(); + void CreateParentDirectory(const string &filename); + string GetFullPathname(const string &filename); void GetExecutableFilename(string &selfName); diff --git a/renderdoc/os/win32/win32_stringio.cpp b/renderdoc/os/win32/win32_stringio.cpp index 436f9c585..d01539bf5 100644 --- a/renderdoc/os/win32/win32_stringio.cpp +++ b/renderdoc/os/win32/win32_stringio.cpp @@ -170,6 +170,20 @@ namespace FileIO return StringFormat::Wide2UTF8(wstring(path)); } + void CreateParentDirectory(const string &filename) + { + wstring wfn = StringFormat::UTF82Wide(filename); + + wfn = dirname(wfn); + + // This function needs \\s not /s. So stupid! + for(size_t i=0; i < wfn.size(); i++) + if(wfn[i] == L'/') + wfn[i] = L'\\'; + + SHCreateDirectoryExW(NULL, wfn.c_str(), NULL); + } + string GetReplayAppFilename() { HMODULE hModule = NULL;