【问题标题】:My readfile is working in debug mode but not release mode. What's going wrong?我的 readfile 正在调试模式下工作,但不是发布模式。怎么了?
【发布时间】:2017-01-31 20:55:02
【问题描述】:

目前在 512 MB 模拟器上进行测试。我有以下代码在调试模式下可以正常执行:

StorageFolder^ appFolder = Windows::ApplicationModel::Package::Current->InstalledLocation;

String^ path = appFolder->Path;

std::wstring testFileName = std::wstring(path->Begin(), path->End()) + std::wstring(L"\\full-R23-0000000000000000Mapped");

_CREATEFILE2_EXTENDED_PARAMETERS extend = { 0 };
extend.dwSize = sizeof(CREATEFILE2_EXTENDED_PARAMETERS);
extend.dwFileAttributes = FILE_ATTRIBUTE_NORMAL;
extend.dwFileFlags = FILE_FLAG_NO_BUFFERING | FILE_FLAG_OVERLAPPED;
extend.dwSecurityQosFlags = SECURITY_ANONYMOUS;
extend.lpSecurityAttributes = nullptr;
extend.hTemplateFile = nullptr;

HANDLE dataFile = CreateFile2(
    testFileName.c_str(),
    GENERIC_READ | GENERIC_WRITE,
    0,
    OPEN_ALWAYS,
    &extend);

DWORD errcode = GetLastError();
OutputDebugString(L" Error Code: ");
OutputDebugString(std::to_wstring(errcode).c_str());

OVERLAPPED positionalData = { 0 };
positionalData.Offset = 0;
positionalData.OffsetHigh = 0;
positionalData.hEvent = 0;


byte* cacheTest = reinterpret_cast<byte*>(VirtualAlloc(
    NULL,
    datasetReadSectorSize,
    MEM_COMMIT | MEM_RESERVE,
    PAGE_READWRITE));

bool readsuccess = ReadFile(
    dataFile,
    &cacheTest[0],
    datasetReadSectorSize,
    NULL,
    &positionalData);

DWORD errcode2 = GetLastError();
OutputDebugString(L" Error Code 2: ");
OutputDebugString(std::to_wstring(errcode2).c_str());

DWORD temp_sector_size = datasetReadSectorSize;

GetOverlappedResult(
    dataFile,
    &positionalData,
    &temp_sector_size,
    true);

但是,此代码在发布模式下挂在最后一个 GetOverlappedResult 命令上。在调试模式下,它给出的错误代码是 183 和 997(分别为 ERROR_ALREADY_EXISTS 和 ERROR_IO_PENDING),这两个都不是问题。在发布模式下,它给出的错误代码是 183 和 38(分别为 ERROR_ALREADY_EXISTS 和 ERROR_HANDLE_EOF)。它在这里出现文件结束错误肯定让我感到困惑。它正在访问的文件是项目的一部分,并且在其配置属性中,它设置为 Excluded from build: NO(我已经尝试过使用此设置的两种方式),Content: YES(将其设置为 yes 对于进行调试至关重要模式工作),以及物品类型:不参与构建(我没有触及这个设置)。

如何使发布模式与调试模式一致(在这种情况下,成功执行 fileio)?

【问题讨论】:

  • 这不是 C++,而是一些方言(可能是 C++/CLI)。请相应地重新标记。
  • 不是 C++/CLI,windows phone 不支持。但是,重点是。
  • 看起来像winapi代码中常见的传统错误处理。当 winapi 函数实际上没有失败时显示 GetLastError() 的值会产生一个随机数。
  • @HansPassant 这不是真的。如果没有什么需要注意的,GetLastError() 将产生 0。根据提供给 CreateFile2 的参数,Error_Already_Exists 可能是或不是错误(如果设置了 Create_New 标志,则会导致失败。如果设置了 Open_Always 标志,则 Error_Already_Exists 表示成功)。 Error_Io_Pending 在处理异步 io 时同样可以指示成功。 Error_Handle_Eof 是合法的问题,并且不断弹出(同样,仅在发布模式下)。
  • 嗯,当然不是。从代码中可以明显看出您认为这是真的。事实并非如此。

标签: .net visual-c++ file-io visual-studio-2015 windows-phone-8.1


【解决方案1】:

嗯,这很尴尬,因为答案很简单。当我添加正在读取的文件(我在调试版本中添加它时),编辑属性页时,我从未将配置属性从“调试”更改为“所有配置”。改变它解决了我的问题,现在 ReadFile 在发布模式下工作,就像在调试模式下一样。

我一直在叫错很多树。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2018-07-31
    相关资源
    最近更新 更多