Я пытаюсь открыть текстовый файл. если файл не существует, то он должен быть сначала создан и открыт.
Я написал следующий кусок кода для этой цели. Код работает нормально, он также создает файл в папке 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;
}
Я думал, что параметр «OPEN_ALWAYS» CREATE_FILE () откроет текстовый файл передо мной
Нет, он не откроет файл перед вами, как если бы вы дважды щелкнули по нему в Проводнике.
Вместо того, что 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 доступен полный образец: Открытие файла для чтения или записи
Если вы хотите открыть текстовый файл, как если бы вы дважды щелкнули по нему в Проводнике, вам нужно использовать ShellExecute
функция. Он не требует дескриптора файла, только путь. Естественно, что open
глагол это тот, который вы хотите указать. Обратите внимание, что вы должны не иметь открытый дескриптор файла, когда вы пытаетесь открыть его с ShellExecute
, Если вы открыли / создали файл, используя CreateFile
обязательно позвоните CloseHandle
до призвание ShellExecute
,
Прежде всего, если hFile
является INVALID_HANDLE_VALUE
нет необходимости звонить CloseHandle
, Удалить это утверждение. Кроме того, лучше, если вы CloseHandle
перед возвращением, потому что всегда приятно освобождать любые ресурсы, которые вы используете. Если вы скопируете этот код в функцию и какое-то огромное приложение, которое вызывает эту функцию, у вас будет утечка ресурсов.