Текстовый файл, созданный функцией CreateFile (), не отображается

Я пытаюсь открыть текстовый файл. если файл не существует, то он должен быть сначала создан и открыт.
Я написал следующий кусок кода для этой цели. Код работает нормально, он также создает файл в папке 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;
}

2

Решение

Я думал, что параметр «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,

4

Другие решения

Прежде всего, если hFile является INVALID_HANDLE_VALUE нет необходимости звонить CloseHandle, Удалить это утверждение. Кроме того, лучше, если вы CloseHandle перед возвращением, потому что всегда приятно освобождать любые ресурсы, которые вы используете. Если вы скопируете этот код в функцию и какое-то огромное приложение, которое вызывает эту функцию, у вас будет утечка ресурсов.

1