2

我正在尝试打开一个文本文件。如果文件不存在,则必须先创建并打开它。为此,我编写了以下代码。该代码工作正常,它还在 BIN 文件夹中创建文件,但是当我执行此代码时,我仍然看不到任何文件被打开。请告诉我的代码有什么问题。

代码片段:

#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <string>
using namespace std;

int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
  HANDLE  hFile;
  DWORD dwBytesRead, dwBytesWritten, dwPos;
  TCHAR szMsg[1000];

    hFile = CreateFile (("File.txt"),      // Open File.txt.
                        GENERIC_WRITE,          // Open for writing
                        0,                      // Do not share
                        NULL,                   // No security
                        OPEN_ALWAYS,            // Open or create
                        FILE_ATTRIBUTE_NORMAL,  // Normal file
                        NULL);                  // No template file

  if (hFile == INVALID_HANDLE_VALUE)
  {
    wsprintf (szMsg, TEXT("Could not open File.txt"));
    CloseHandle (hFile);            // Close the file.
    return 0;
  }

return 0;
}
4

2 回答 2

4

我以为 CREATE_FILE() 的参数“OPEN_ALWAYS”会打开我面前的文本文件

不,它实际上不会打开您面前的文件,就像您在资源管理器中双击它一样。

相反,OPEN_ALWAYS参数的意思是打开文件的句柄,例如,您可以通过编程方式读取或写入文件。如果您指定OPEN_ALWAYS,该CreateFile函数将成功创建文件并打开它的句柄,即使该文件已经存在。

如果您希望这种行为,您可以指定OPEN_EXISTING,它仅在文件(或设备)已经存在时打开文件(或设备)的句柄。如果不存在,该CreateFile函数将返回错误。

请记住,正如其他人指出的那样,您需要在每次成功调用 to 之后CreateFile调用 to CloseHandle。这可以确保您打开文件(或设备)的句柄被正确释放,并防止您的应用程序泄漏资源。但只有在调用成功时才需要这样做CreateFile。如果失败,返回INVALID_HANDLE_VALUE,你不应该调用CloseHandle那个句柄。

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    HANDLE hFile;
    DWORD  dwBytesRead, dwBytesWritten, dwPos;
    TCHAR  szMsg[1000];

    // If the file already exists, open a handle to it for writing.
    // If the file does not exist, create it and then open a handle to it.
    hFile = CreateFile(TEXT("File.txt"),       // Open File.txt.
                       GENERIC_WRITE,          // Open for writing
                       0,                      // Do not share
                       NULL,                   // No security
                       OPEN_ALWAYS,            // Open or create
                       FILE_ATTRIBUTE_NORMAL,  // Normal file
                       NULL);                  // No template file

    // Test for and handle failure...
    if (hFile == INVALID_HANDLE_VALUE)
    {
        wsprintf(szMsg, TEXT("Could not open File.txt"));
        MessageBox(NULL, szMsg, NULL, MB_OK | MB_ICONERROR);
        // don't close the file here because it wasn't opened!
        return 0;
    }

    // Read from, write to, or otherwise modify the file here,
    // using the hFile handle.
    // 
    // For example, you might call the WriteFile function.
    // ...

    // Once we're finished, close the handle to the file and exit.
    CloseHandle (hFile);            // Close the file.
    return 0;
}

MSDN 上有一个完整的示例:Open a File for Reading or Writing

如果要像在资源管理器中双击一样打开文本文件,则需要ShellExecute使用. 它不需要文件句柄,只需要路径。自然,open动词是您要指定的动词。请注意,当您尝试使用ShellExecute. 如果您已经使用 . 打开/创建了文件CreateFile,请确保在调用CloseHandle 之前先调用ShellExecute.

于 2013-03-29T07:26:38.173 回答
1

首先,如果hFile是 anINVALID_HANDLE_VALUE则无需调用CloseHandle。删除该声明。此外,如果您CloseHandle在返回之前更好,因为释放您使用的任何资源总是很好的。如果您将此代码复制到一个函数中,并且某个巨大的应用程序调用了该函数,那么您就会发生资源泄漏。

于 2013-03-29T07:02:45.233 回答