iniファイルについて


駆け出し  2005-08-23 20:44:44  No: 17214

iniファイルの中身が破壊(項目が減っていた、など)されることがありました。その原因の可能性を探っています。

下記は一般的なiniファイルの読み書きかと思いますが、最後の「INI.Free;」を実行しなかった場合に、iniファイルの中身を破壊することはありますか?
その他に、内容が破壊されるような可能性、状況などはありますか?

---------------------------------------------------
INI:= TIniFile.Create(strIniFile);
{処理}
strData1 := INI.ReadString('項目', 'データ1', '');

INI.WriteString('項目', 'データ1', '書き換え');
INI.UpdateFile;
{処理}
INI.Free;


にしの  2005-08-23 22:10:56  No: 17215

オブジェクトが残っていれば、他の場所で操作できるため、項目の削除等できてしまいます。
不要になったら解放するのがよいかと。

INI操作のAPIには、扱えるファイルサイズに制限があります。
# win2000系でも制限されていたかは覚えていませんが
そして、TIniFileクラスは、該当するAPIを使っています。

TMemIniFileを使った方がよいかもしれません。


deldel  2005-08-24 00:43:42  No: 17216

私は、以下のような構文を95〜XPまでずっと使用していますが、
不具合が出たことがありません。というより、不具合は出ないと
信じ切ってますが、まずいでしょうか?

    Ini := TIniFile.Create(strIniFile);
    try
      Ini.WriteString(('項目', 'データ1', '書き換え');
    finally
      Ini.Free;
    end;


にしの  2005-08-24 01:12:05  No: 17217

いや、とんでもなく大きな文字列を渡せば不具合が出ます、ということです。
例えば、次の2つを比べてみてください。
TIniFileとTMemIniFileの違いだけです。
# 文字列Sの最後に'Z'を追加しているのは、最後までデータが書き込まれたかのチェックです。

procedure TForm1.Button1Click(Sender: TObject);
var
  Ini: TIniFile;
  S: String;
  i: integer;
begin
  Ini := TIniFile.Create(ChangeFileExt(Application.ExeName, '.ini'));
  try
    S := '';
    for i := 0 to 1024*1024 - 1 do
    begin
      S := S + IntToHex(i mod 16, 1);
    end;
    S := S + 'Z';
    Ini.WriteString('Section', 'Ident', S);
  finally
    Ini.UpdateFile;
    Ini.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Ini: TMemIniFile;
  S: String;
  i: integer;
begin
  Ini := TMemIniFile.Create(ChangeFileExt(Application.ExeName, '.ini'));
  try
    S := '';
    for i := 0 to 1024*1024 - 1 do
    begin
      S := S + IntToHex(i mod 16, 1);
    end;
    S := S + 'Z';
    Ini.WriteString('Section', 'Ident', S);
  finally
    Ini.UpdateFile;
    Ini.Free;
  end;
end;


駆け出し  2005-08-24 02:23:50  No: 17218

ありがとうございます。
破壊された理由はいまのところはっきりしませんが、文字数には気をつけたいと思います。

ところでなんですが、VCのタイマー使わずに、一定時間その場で処理をとめる関数ありますか?
よろしくお願いします。


deldel  2005-08-24 02:26:51  No: 17219

私の環境(win2k,D5)では違いは出ませんでした。
他のOSでは違いが出るのかなぁ・・・


deldel  2005-08-24 02:29:19  No: 17220

sleepとか、以下とかです。

procedure pWaitMiliSec(lwMiliSec: Longword);
{
lwMiliSec: 待ち時間(単位:ミリ秒)
}
var
  StartTime, WaitTime: TDateTime;
begin
  WaitTime := lwMiliSec/1000/24/60/60;
  StartTime := Now;
  while True do begin
    Application.ProcessMessages;
    if StartTime + WaitTime < Now then Break;
  end;
end;


駆け出し  2005-08-24 02:37:01  No: 17221

deldelさん、ありがとうございます。
今から試してみます。

ちなみににしのさんのPGですが、文字数を倍にすると、TIniFileではエラーが出ました。
TMemIniFileでは大丈夫だったので、そのくらい大きな場合のようですね。

> for i := 0 to 1024*1024*2 - 1 do
さらに倍、どん!
竹下景子さんに・・・


alone55  2005-08-29 00:04:06  No: 17222

当方でもIniファイルの書き込みでエラーが発生した事が
あります。
その場合の対応は、INIファイルと称するtextfileで
入出力しています。
一般的にINIファイルのサイズは64KBがMax(Windows3.1)
です。
Windows2000あたりからINIファイルの挙動が多少あやしい
感じがします(あくまで私感ですが・・・)


Fusa  2005-08-29 04:19:46  No: 17223

関連付いてなんですが
INIファイルは[;]セミコロン記号でコメントアウトできるはずですが
TMemIniFileはそのコメントアウトした行を
削除してしまいませんか?

前に試した時にそうだったのですが、
あまり追求しませんでした。

TIniやAPI直接利用ならコメントアウト行は消えないのかな、、、

どなたか詳しい方、教えてください。

少しだけ関連付いて、こんなページもありました。どうぞ。

Nichiyo Delphian, Tips & Samples for Delphi
http://www.d1.dion.ne.jp/~aide/misc/deltips/deltip07.html


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加