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_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 で利用可能な完全なサンプルがあります:読み取りまたは書き込み用にファイルを開く

エクスプローラーでダブルクリックしたかのようにテキスト ファイルを開きたい場合は、ShellExecute関数を使用する必要があります。ファイルへのハンドルは必要なく、パスだけが必要です。当然、open指定したいのは動詞です。でファイルを開こうとするときは、ファイルへのオープン ハンドルを持ってはならないことに注意してくださいShellExecute。を使用してファイルを開いたり作成した場合は、 を呼び出す前にCreateFile必ず を呼び出してください。CloseHandle ShellExecute

于 2013-03-29T07:26:38.173 に答える
1

まず、 が である場合、hFileINVALID_HANDLE_VALUE呼び出す必要はありませんCloseHandle。その発言を削除してください。また、CloseHandle使用したリソースを解放するのは常に良いことなので、戻る前に行ったほうがよいでしょう。このコードを関数にコピーし、巨大なアプリケーションがその関数を呼び出すと、リソース リークが発生します。

于 2013-03-29T07:02:45.233 に答える