You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 14:06:03