Delphi での読み取りと書き込み (I/O) に使用される 3 つのファイル タイプ
1. 古いパスカル ファイル タイプ
F:text、F:File などの古いファイル変数で表されるファイル タイプ。型付き、型なし、文字型、および一部の Delphi ファイル操作関数 (例: AssignPRn、Writeln) の 3 つのカテゴリが定義されています。これらのファイル クラスは Windows に似ています。ファイルハンドルに互換性がありません
2. Windowsファイルハンドル(ハンドル)
オブジェクト指向 Pascal ファイル ハンドルは Windows ファイル ハンドル タイプをカプセル化し、ファイル操作関数ライブラリは Windows API 関数をカプセル化します。たとえば、「Fileread」は Windows API 関数「ReadFile」を呼び出します。 Windows API に精通している場合は、Windows ファイル ステートメントを使用してファイル操作を実行できます。
3. ファイルストリーム
ファイル ストリームは TFileStream クラスのオブジェクト インスタンスであり、TFileStream は Windows ファイル ハンドル タイプを操作するために使用できる属性です。
ファイルの種類の選択方法
Windows ファイル ハンドルは、柔軟な同期および非同期ファイルの読み取りおよび書き込み制御を提供する下位レベルのファイル操作タイプです。次に、Windows ファイル ハンドル タイプを使用したファイル同期と非同期操作の疑似コードの説明を示します。
同期操作:
bResult = ReadFile(hFile, &inBuffer, nBytesToRead, &nBytesRead, NULL);
// eof をチェックする
if (bResult && nBytesRead == 0, ) {
// ファイルの終わりに来ました
}
非同期操作:
// 重複する構造体フィールドを設定します
gOverLapped.Offset = 0;
gOverLapped.OffsetHigh = 0;
gOverLapped.hEvent = NULL;
// 非同期読み取り操作を試行します
bResult = ReadFile(hFile, &inBuffer, nBytesToRead, &nBytesRead,
&g重複) ;
// 問題があった場合、または非同期操作がまだ保留中の場合 ...
if (!bResult)
{
// エラーコードに対処する
スイッチ (dwError = GetLastError())
{
ケース ERROR_HANDLE_EOF:
{
// ファイルの終わりに達しました
//ReadFile の呼び出し中
// それを処理するコード
}
ケース ERROR_IO_PENDING:
{
// 非同期 I/O はまだ進行中です
// しばらく別のことをする
GoDoSomethingElse() ;
// 非同期読み取りの結果を確認する
bResult = GetOverlappedResult(hFile, &gOverlapped,
&nBytesRead、FALSE) ;
// 問題があった場合...
if (!bResult)
{
// エラーコードに対処する
スイッチ (dwError = GetLastError())
{
ケース ERROR_HANDLE_EOF:
{
// ファイルの終わりに達しました
非同期操作中のファイル
}
// 他のエラーケースに対処する
}
}
} // 終了ケース
// 他のエラーケースに対処する
} // 終了スイッチ
} // if 終了
Windows ファイル ハンドルは柔軟なファイル制御を提供しますが、より多くのエラー処理コードを記述する必要があります。
Windows API に慣れていない場合は、Delphi が推奨する古いファイル変数タイプを使用してください。
Delphi の古いファイル タイプは、AssignFile を使用してファイル変数を物理ファイルに関連付けます。これは、Delphi によって定義されています。
ファイルへのアクセスと操作を完了するためのファイル変数に対するさまざまな操作は、次のとおりです。
タイプ オペレーション コードの説明:
変数
F: テキストファイル;
S: 文字列。
始める
if OpenDialog1.Execute then { [開く] ダイアログ ボックスを表示する }
始める
AssignFile(F, OpenDialog1.FileName); { ダイアログ ボックスで選択されたファイル }
リセット(F);
Readln(F, S); { ファイルの最初の行を読み取ります }
Edit1.Text := S; TEdit コントロールに文字列を挿入します }
ファイルを閉じる(F);
終わり;
終わり;
ファイル ストリームはストリームのサブクラス (ストリーム クラス) であるため、これを使用する利点の 1 つは、たとえば、動的ストリーム クラスを作成する場合に、その親クラスのプロパティを自動的に継承できることです。メモリ ブロック ディスクへの書き込みは、TFileStream と TMemoryStream を使用して完了できます。