|
|
|
|
|
|
|
|
|
|
|
|
|
#include <nan.h> |
|
#include <Shlwapi.h> |
|
|
|
#include "path_util.h" |
|
|
|
namespace path_util { |
|
|
|
const wchar_t* to_wstring(const Nan::Utf8String& str) { |
|
const char *bytes = *str; |
|
unsigned int sizeOfStr = MultiByteToWideChar(CP_UTF8, 0, bytes, -1, NULL, 0); |
|
wchar_t *output = new wchar_t[sizeOfStr]; |
|
MultiByteToWideChar(CP_UTF8, 0, bytes, -1, output, sizeOfStr); |
|
return output; |
|
} |
|
|
|
bool file_exists(std::wstring filename) { |
|
DWORD attr = ::GetFileAttributesW(filename.c_str()); |
|
if (attr == INVALID_FILE_ATTRIBUTES || (attr & FILE_ATTRIBUTE_DIRECTORY)) { |
|
return false; |
|
} |
|
return true; |
|
} |
|
|
|
|
|
std::wstring get_shell_path(std::wstring filename) { |
|
std::wstring shellpath; |
|
|
|
if (file_exists(filename)) { |
|
return shellpath; |
|
} |
|
|
|
wchar_t buffer_[MAX_ENV]; |
|
int read = ::GetEnvironmentVariableW(L"Path", buffer_, MAX_ENV); |
|
if (!read) { |
|
return shellpath; |
|
} |
|
|
|
std::wstring delimiter = L";"; |
|
size_t pos = 0; |
|
std::vector<std::wstring> paths; |
|
std::wstring buffer(buffer_); |
|
while ((pos = buffer.find(delimiter)) != std::wstring::npos) { |
|
paths.push_back(buffer.substr(0, pos)); |
|
buffer.erase(0, pos + delimiter.length()); |
|
} |
|
|
|
const wchar_t *filename_ = filename.c_str(); |
|
|
|
for (int i = 0; i < paths.size(); ++i) { |
|
std::wstring path = paths[i]; |
|
wchar_t searchPath[MAX_PATH]; |
|
::PathCombineW(searchPath, const_cast<wchar_t*>(path.c_str()), filename_); |
|
|
|
if (searchPath == NULL) { |
|
continue; |
|
} |
|
|
|
if (file_exists(searchPath)) { |
|
shellpath = searchPath; |
|
break; |
|
} |
|
} |
|
|
|
return shellpath; |
|
} |
|
|
|
} |
|
|