忘れられない激○○料理

 いつもお世話になっています。

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

A 回答 (7件)

> 形は、普通の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やインターネットで調べてください。
    • good
    • 0

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さんの案を適用すれば出来るはずです。

では。
    • good
    • 0

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
で書き出せば出来るはずです。

この回答への補足

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

補足日時:2003/04/26 23:41
    • good
    • 0

追記して、どのようにしたいのかが不明なのですが


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

この回答への補足

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

補足日時:2003/04/26 23:49
    • good
    • 0

はじめまして。



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

この回答への補足

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

補足日時:2003/04/26 01:01
    • good
    • 0

INIファイルの記述は、セクション(?)/エントリ(?)内のキーはユニークで


なくてはならないので、重複したキー名称を指定することは出来ません。

参考資料が見つけられなかったのですが、以上のようになっています。

この回答への補足

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

補足日時:2003/04/25 19:11
    • good
    • 0

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



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

この回答への補足

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

補足日時:2003/04/25 18:20
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A