我的读取文件在调试模式下工作,但不是发布模式。出了什么问题?
My readfile is working in debug mode but not release mode. What's going wrong?
目前正在 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)。它在这里遇到文件结束错误肯定让我感到困惑。它正在访问的文件是项目的一部分,并且在其配置属性中,它被设置为从构建中排除:否(我已经尝试过此设置的两种方式),内容:是(将其设置为是对于进行调试至关重要mode work), Item type: Does not participate build (我没碰过这个设置).
如何使发布模式与调试模式的行为一致(在这种情况下,成功执行 fileio)?
好吧,这很尴尬,因为答案太简单了。当我添加我正在读取的文件(我在调试版本中添加它),编辑 属性 页面时,我从未将配置 属性 从 "Debug" 更改为 "All configurations"。更改它解决了我的问题,现在 ReadFile 可以像在调试模式下一样在发布模式下工作。
我一直在咆哮这么多错误的树。
目前正在 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)。它在这里遇到文件结束错误肯定让我感到困惑。它正在访问的文件是项目的一部分,并且在其配置属性中,它被设置为从构建中排除:否(我已经尝试过此设置的两种方式),内容:是(将其设置为是对于进行调试至关重要mode work), Item type: Does not participate build (我没碰过这个设置).
如何使发布模式与调试模式的行为一致(在这种情况下,成功执行 fileio)?
好吧,这很尴尬,因为答案太简单了。当我添加我正在读取的文件(我在调试版本中添加它),编辑 属性 页面时,我从未将配置 属性 从 "Debug" 更改为 "All configurations"。更改它解决了我的问题,现在 ReadFile 可以像在调试模式下一样在发布模式下工作。
我一直在咆哮这么多错误的树。