不显示由CreateFile()函数创建的文本文件

时间:2013-03-29 06:44:50

标签: c++ windows winapi text-files createfile

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

CODE SNIPPET

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

2 个答案:

答案 0 :(得分:4)

  

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

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

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

如果您想要这种行为,您可以指定OPEN_EXISTING,只有当文件(或设备)已存在时才会打开文件(或设备)的句柄。如果它不存在,CreateFile函数将返回错误。

请记住,正如其他人所指出的那样,您需要通过调用CreateFile来跟踪每次成功通话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上提供了完整的示例:Opening a File for Reading or Writing

如果要打开文本文件,就像在资源管理器中双击它一样,则需要使用ShellExecute function。它不需要文件的句柄,只需要路径。当然,open动词是您要指定的动词。请注意,当您尝试使用ShellExecute打开文件时,应该打开文件句柄。如果您使用CreateFile打开/创建了文件,请务必在致电CloseHandle之前致电ShellExecute

答案 1 :(得分:1)

首先,如果hFileINVALID_HANDLE_VALUE,则无需拨打CloseHandle。删除该声明。此外,如果您在返回之前CloseHandle更好,因为释放您使用的任何资源总是很好。如果您将此代码复制到一个函数和一个名为该函数的巨大应用程序,那么您将遇到资源泄漏。