使用 CreateFile() 打开文件返回无效句柄,错误代码为 183

问题描述 投票:0回答:2

我正在尝试打开现有文件并将其内容作为流写入新创建的文件中:

#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 运行应用程序,则会返回无效句柄。

c windows visual-studio winapi createfile
2个回答
0
投票

这并不是真正的答案,但这是一个显示更多信息并纠正了评论中提到的一些错误的版本。

在 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;
}

-6
投票

如果您查看错误代码,您会发现它意味着 ERROR_ALREADY_EXISTS 183 (0xB7)

如果文件已经存在,则需要使用 OpenFile 打开它

参见https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-openfile

© www.soinside.com 2019 - 2024. All rights reserved.