我正在尝试打开现有文件并将其内容作为流写入新创建的文件中:
#include <Windows.h>
#include <stdio.h>
#define BUFFER_LENGTH 2048
int main(void) {
BYTE buffer[BUFFER_LENGTH];
DWORD readCount;
// Program breaks here.
HANDLE hReadFile = CreateFile(L"file.mp4", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hReadFile == INVALID_HANDLE_VALUE) {
printf("Error: %d\n", GetLastError());
return 1;
}
HANDLE hWriteFile = CreateFile(L"out.mp4", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hWriteFile == INVALID_HANDLE_VALUE) {
printf("Error: %d\n", GetLastError());
CloseHandle(hReadFile);
return 1;
}
while (ReadFile(hReadFile, buffer, BUFFER_LENGTH, &readCount, NULL) && readCount > 0) {
if (!WriteFile(hWriteFile, buffer, BUFFER_LENGTH, &readCount, NULL)) {
CloseHandle(hReadFile);
CloseHandle(hWriteFile);
printf("Error: %d\n", GetLastError());
return 1;
}
memset(buffer, 0, sizeof(buffer));
}
CloseHandle(hReadFile);
CloseHandle(hWriteFile);
return 0;
}
程序退出,因为
CreateFile()
返回无效句柄。根据 docs (ERROR_ALREADY_EXISTS: Cannot create a file when that file already exists.)
,错误代码为 183。
然后我分别比较每个手柄后检查结果:
HANDLE hReadFile = CreateFile(L"file.mp4", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
HANDLE hWriteFile = CreateFile(L"out.mp4", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
BOOL isInvalid_hRead = hReadFile == INVALID_HANDLE_VALUE;
BOOL isInvalid_hWrite = hWriteFile == INVALID_HANDLE_VALUE;
为什么当我尝试打开文件时程序会抛出这种错误。
编辑:我导航到输出可执行文件所在的文件夹并运行它,它按预期工作。但如果我从 Visual Studio 运行应用程序,则会返回无效句柄。
这并不是真正的答案,但这是一个显示更多信息并纠正了评论中提到的一些错误的版本。
在 Visual Studio 下运行此程序,并向我们展示您获得的逐字输出。
#include <Windows.h>
#include <stdio.h>
#define BUFFER_LENGTH 2048
int main(void) {
BYTE buffer[BUFFER_LENGTH];
DWORD readCount;
int rv = 0;
printf("Test Program\n");
WCHAR currentdir[_MAX_PATH];
GetCurrentDirectory(_MAX_PATH, currentdir);
wprintf(L"Current dir: %s\n", currentdir);
HANDLE hReadFile = CreateFile(L"file.mp4", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hReadFile == INVALID_HANDLE_VALUE) {
DWORD err = GetLastError();
printf("Error %d opening input file.\n", err);
return 1;
}
HANDLE hWriteFile = CreateFile(L"out.c", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hWriteFile == INVALID_HANDLE_VALUE) {
DWORD err = GetLastError();
printf("Error %d opening output file.\n", err);
CloseHandle(hReadFile);
return 1;
}
do
{
if (!ReadFile(hReadFile, buffer, BUFFER_LENGTH, &readCount, NULL))
{
DWORD err = GetLastError();
printf("Error %d while reading file.\n", err);
rv = 1;
break;
}
if (readCount > 0)
{
DWORD writeCount;
if (!WriteFile(hWriteFile, buffer, readCount, &writeCount, NULL)) {
DWORD err = GetLastError();
printf("Error %d while writing file.\n", err);
rv = 1;
break;
}
if (readCount != writeCount)
{
printf("readCount (%d) is different from writeCount (%d). This is unlikely to happen.\n", readCount, writeCount);
}
}
} while (readCount);
CloseHandle(hReadFile);
CloseHandle(hWriteFile);
return rv;
}
如果您查看错误代码,您会发现它意味着 ERROR_ALREADY_EXISTS 183 (0xB7)
如果文件已经存在,则需要使用 OpenFile 打开它
参见https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-openfile