如何在C++ UWP/WinRT应用中不依赖异常判断文件夹全路径是否存在
可行实现方案
下面给出两种完全避免异常抛出的实现方式,可根据你的项目权限情况选择:
方案1:使用Win32 API/标准库实现(最优,性能最好,完全无异常)
UWP应用支持调用符合沙箱规则的Win32 API,也支持C++17的std::filesystem,判断文件夹存在完全可以不用绕UWP Storage API:
- 如果你使用C++17及以上标准,直接用
std::filesystem::exists即可,注意额外判断路径是否为文件夹:
#include <filesystem> bool UWP_Based_TestFolder(const std::wstring& path) { std::error_code ec; bool exists = std::filesystem::exists(path, ec); bool is_dir = std::filesystem::is_directory(path, ec); return !ec && exists && is_dir; }
- 如果需要兼容旧标准,可直接用Win32的
GetFileAttributesW实现:
#include <windows.h> bool UWP_Based_TestFolder(const std::wstring& path) { DWORD attr = GetFileAttributesW(path.c_str()); return attr != INVALID_FILE_ATTRIBUTES && (attr & FILE_ATTRIBUTE_DIRECTORY); }
注意:你示例里原生C++的判断结果异常是因为错误使用
std::ifstream判断文件夹,ifstream仅支持打开文件,打开文件夹必然返回失败,属于原生写法错误,和UWP逻辑无关。
以上两种方式都不会抛出任何异常,也不会在输出窗口打印错误日志,性能远高于UWP Storage的异步API。
方案2:仅用UWP Storage API实现(无异常版本)
如果你判断完存在后需要拿到StorageFolder实例做后续操作,可以用C++/WinRT提供的非抛异常重载调用GetFolderFromPathAsync,自行处理错误码即可:
#include <winrt/Windows.Storage.h> using namespace winrt::Windows::Storage; winrt::IAsyncOperation<bool> TestFolderAsync(const winrt::hstring& path) { // 调用返回HRESULT的重载,不会抛出异常 auto asyncOp = StorageFolder::GetFolderFromPathAsync(path); auto hr = co_await winrt::get_async_status(asyncOp); if (SUCCEEDED(hr)) { // 如需StorageFolder实例可直接返回asyncOp.GetResults() co_return true; } co_return false; }
这种方式也不会触发异常抛出,自然不会在输出窗口打印异常日志。
权限说明
以上两种方案都要求你要访问的路径在应用的访问权限范围内:
- 应用安装目录、应用数据目录默认可以访问
- 用户库目录需要在清单里声明对应的能力(图片、视频、文档库等)
- 任意磁盘路径需要在清单里声明
broadFileSystemAccess受限能力,且用户手动开启文件系统访问权限
内容的提问来源于stack exchange,提问作者orion elenzil
相关产品推荐
相关产品推荐

