| | |
| | |
| | |
| | |
| | |
| |
|
| | #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; |
| | } |
| |
|
| | } |
| |
|