我正在尝试打开一个文本文件。如果文件不存在,则必须首先创建并打开它。 我为此目的编写了以下代码。代码工作正常,它还在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;
}
答案 0 :(得分:4)
我认为CREATE_FILE()的参数“OPEN_ALWAYS”会在我面前打开文本文件
不,它实际上不会在您面前打开文件,就好像您在资源管理器中双击它一样。
相反,OPEN_ALWAYS
参数意味着打开文件的句柄,以便例如,您可以通过编程方式读取或写入 。如果指定OPEN_ALWAYS
,CreateFile
函数将成功创建文件并打开文件句柄,即使该文件已存在。
如果您不想要这种行为,您可以指定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)
首先,如果hFile
是INVALID_HANDLE_VALUE
,则无需拨打CloseHandle
。删除该声明。此外,如果您在返回之前CloseHandle
更好,因为释放您使用的任何资源总是很好。如果您将此代码复制到一个函数和一个名为该函数的巨大应用程序,那么您将遇到资源泄漏。