• ベストアンサー

iniファイルに追記がしたいです。

 いつもお世話になっています。  iniファイルの中のあるデータをGetPrivateProfileStringで調べて、その中になければデータを  追記したいです。  WritePrivateProfileStringの場合、iniファイルにあるデータが追記したい内容がないだけで、他のデータが 入っていても、上書きされてしまうんですよね?  もしその中に他のデータが入っていた場合は、追記をしたいのですが、それができるAPI関数って  何かありますか?  iniファイルに関して、ネットで調べていると、WritePrivateProfileStringなどしか出てこなくて・・・。  もしできないようでしたら、追記できるような何かいいアイディアがあれば・・・と思っています。  すみませんが、よろしくお願いします。  わかりづらい文章で申し訳ありません。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.6

> 形は、普通のiniファイルの >"WriteData=OldData" >"WriteData=NewData"にしたいので・・・。 ということであれば、それはWritePrivateProfileStringでは出来ません。(INIファイルの規格外の使い方だから) また、GetPrivateProfileStringでは最初のOldDataしか取得できません。(試してないので推測です) そこで ・設定ファイル(INI)にキーと値をまとめて書き込む(WritePrivateProfileSection) ・設定ファイル(INI)からキーと値をまとめて読み込む(GetPrivateProfileSection) を使えば出来ると思います。 つまり、 strPair = _ "OtherKey=" & strOtherData & vbNullChar & _ "WriteData=" & strOldData & vbNullChar & _ "WriteData=" & strNewData & vbNullChar & vbNullChar として書きこむ文字列を作成し(#5の方の配列による方法が使えます) lngRet = WritePrivateProfileSection( SectionName, strPair, InifaileName ) で書きこみます。 ただし、書きこんだ"WriteData"の値をすべて読み出す場合は GetPrivateProfileSectionを使ってセクション内の文字列を読み出してから 自力でキーと値に分離する必要があります。(Split命令が有るのでそんなに大変じゃないけど) WritePrivateProfileSectionやGetPrivateProfileSectionの使い方についてはMSDNやインターネットで調べてください。

その他の回答 (6)

  • BlueRay
  • ベストアンサー率45% (204/453)
回答No.7

BlueRayです。 >セクション(?)/エントリ(?)内のキーはユニーク 前回、上記のように書き込み詳しく書いてなかったのですが No.5,6さんの言う通りのことが言いたかったのです。 言い訳になりますが、時間が無かったので簡単に書いてしまいました。 [Section] Key = Value となってる場合に、Key名はユニークと言うことです。 [TEST] TEST1 = 1  ○ TEST1 = 2  × TEST1 = 3  × GetPrivate~/WritePrivate~は、上記のように同一名称は 無視されるので、記述はしていても有効にはなりません。 >2番目の引数lpKeyNameが同じでも3番目の引数のlpStringが違えば記述されていますが・・・。 > (元からあるiniファイルの話で、プログラム上でいじくっているわけではありませんが・・・。 これは、Open/Closeを使用して直接読み書きしていると思われます。 一応、こちらからの補足をさせていただきました。 方法は、No.5,6さんの案を適用すれば出来るはずです。 では。

  • PAPA0427
  • ベストアンサー率22% (559/2488)
回答No.5

TEST.iniファイルにブロックとセクションを追加する場合は以下のとおりでOKなはずです。 Open "TEST.ini" For Append As #1 Print #1, "[BlockName]" Print #1, "SectionName = Section" Close #1 ただし、 [BLOCK1] SectionName = A SectionName = B と設定しても、最初の行しか有効になりません。ですから設定されるのであれば、別ブロックで設定しないと「A」が「B」に書き換えられてしまうわけです。 この場合は [BLOCK1] SectionName = A [BLOCK2] SectionName = B としなければ、両方設定することは出来ません。 また、iniファイル全体を編集したいのであれば Dim strLine(100) as string Dim i as Long dim j as Long Open "ETST.ini" For Input As #1  i=0  do untile eof   i = i + 1   input #1,strLine(i)  loop Close #1 で配列等に保存し、プログラムで文字列を編集してから Open "TEST.ini" For Output As #1  For j= 1 to i   Print #1,strLine(j)  Next Close #1 で書き出せば出来るはずです。

hema123
質問者

補足

 わざわざ細かい説明ありがとうございました!!  どうしても同じキー名のところに設定したいので、2番目の配列を利用するやり方を  考えてみようと思います。  私が実際思いついたやりかたといえば、キー名を指定しないで、値にキー名+値を  追記しするか、拡張子をテキストに変えて文字列操作するとかくらいしか  思いつきませんでした。  ちなみにキー名を指定しないで追記すると、値の前にどうしても"="が入ってしまうので、  どうしようか途方にくれてました。  あと、ふたつめの拡張子を変えるっていうのはアイディアだけで、  実際にそのやり方はわかりません。  

回答No.4

追記して、どのようにしたいのかが不明なのですが 登録されている値をOldData、 追記したい値をNewData、 実際に書きこまれる値をWriteDataとすると WriteData = OldData & Newdata というのではダメですか?

hema123
質問者

補足

 ”キー名=値+値”にするってことですか?  それはちょっと考えていないので・・・すみません。  形は、普通のiniファイルの "WriteData=OldData" "WriteData=NewData"にしたいので・・・。

  • PAPA0427
  • ベストアンサー率22% (559/2488)
回答No.3

はじめまして。 iniファイルはただの、テキストファイルと同じですから、テキストファイルの編集と同じようやってみたらいかがでしょう?

hema123
質問者

補足

 テキストファイルと同じように編集・・・。  それはAPI関数を使うとしたら、どのような関数を使うことになりますか?  VBの関数でもできるのでしたら、その方が良いんですが・・・。

  • BlueRay
  • ベストアンサー率45% (204/453)
回答No.2

INIファイルの記述は、セクション(?)/エントリ(?)内のキーはユニークで なくてはならないので、重複したキー名称を指定することは出来ません。 参考資料が見つけられなかったのですが、以上のようになっています。

hema123
質問者

補足

 え?そうなんですか?  2番目の引数lpKeyNameが同じでも3番目の引数のlpStringが違えば記述されていますが・・・。  (元からあるiniファイルの話で、プログラム上でいじくっているわけではありませんが・・・。   ”重複したキー名称を指定することはできない”とは、プログラム上での話ですか?)。  さきほど、補足で書いたのが2番目の引数が“セクション名”と書きましたが、2番目はキー名の間違えでした。  

  • taknt
  • ベストアンサー率19% (1556/7783)
回答No.1

追記されると思いますが・・・。

参考URL:
http://www36.tok2.com/home/np/vb/api/wpps.html
hema123
質問者

補足

 takntさんから追記されるとのご指摘がありまして、早速試しましたが、やはり上書きされました。  私がやりたいことは、WritePrivateProfileStringの2番目の引数のセクションが追記したいものと  元からあるものが同じときに、上書きせずに追記したい・・・という話なんです。  WritePrivateProfileStringの場合、2番目の引数のセクションが同じ場合、3番目の引数の値が上書きされてしまいますよね?  説明不足で申し訳ありません。

関連するQ&A