【问题标题】:CreateFile2 returns access denied error in Windows 8CreateFile2 在 Windows 8 中返回访问被拒绝错误
【发布时间】:2012-08-28 02:39:18
【问题描述】:

我已经编写了以下代码行来打开 InstalledFolder 目录下的文件:

Platform::String^ locationPath = Platform::String::Concat(Package::Current->InstalledLocation->Path, "\\Assets\\Logo.png");

CREATEFILE2_EXTENDED_PARAMETERS extendedParams = {0};
extendedParams.dwSize = sizeof(CREATEFILE2_EXTENDED_PARAMETERS);
extendedParams.dwFileAttributes = FILE_ATTRIBUTE_NORMAL;
extendedParams.dwFileFlags = FILE_FLAG_SEQUENTIAL_SCAN;
extendedParams.dwSecurityQosFlags = SECURITY_ANONYMOUS;
extendedParams.lpSecurityAttributes = nullptr;
extendedParams.hTemplateFile = nullptr;

Wrappers::FileHandle file(
    CreateFile2(
        locationPath->Data(),
        GENERIC_READ,
        0,
        OPEN_EXISTING,
        &extendedParams
        )
    );

DWORD e = GetLastError();
if (file.Get() == INVALID_HANDLE_VALUE)
{
    throw ref new Platform::FailureException();
}

CreateFile2 返回拒绝访问错误。谁能帮帮我?

根据 JP Alioto 的建议,我已尝试使用 WinRT 文件 I/O,如下所示

    create_task(StorageFile::GetFileFromApplicationUriAsync(ref new Windows::Foundation::Uri("ms-appx:///Assets/Logo.png")))
    .then([=](StorageFile^ f)
    {
        auto p = create_task(f->OpenAsync(FileAccessMode::Read));
        p.wait();
    });

我仍然在 p.wait() 处收到以下错误:

一个无效参数被传递给一个认为无效参数致命的函数

谢谢,

【问题讨论】:

  • WinRT 应用在沙盒中运行,对文件系统的访问受到严格限制。你对此无能为力。
  • 但是我应该能够读取部署文件夹下的文件。我错过了什么吗?

标签: windows-8 windows-runtime visual-studio-2012


【解决方案1】:

您将 0 传递给 dwShareModeCreateFile2 的文档说这个值...

阻止其他进程在请求删除、读取或写入访问权限时打开文件或设备。仅当应用程序对文件具有写访问权限时,才授予对文件或目录的独占访问权限。

您没有对包中文件的写入权限,这就是您收到拒绝访问错误的原因。您需要将分享模式设置为FILE_SHARE_READ

【讨论】:

  • 就是这样。我在 Windows 8 RC 中编写了代码,它在那里工作。现在在 RTM 中它不起作用。使用 FILE_SHARE_MODE 它可以完美运行。谢谢。
  • 我不再安装 RC,但如果我不得不猜测,我猜在调试之前发生的部署没有正确设置包根权限,这可能已经失败当真正部署时(例如通过商店)。不过,这是一个疯狂的猜测。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-25
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 2011-09-26
  • 1970-01-01
相关资源
最近更新 更多