マクロで扱えるINIファイルの大きさについNo.25251
YK さん 05/11/26 11:25
 
いつも、お世話になっています。
秀丸メール4.59、秀丸5.10、Win Meを使っています。

メールの処理に、writeininum、writeinistrを使って、重宝していたのですが、
INIファイルが65.5kbyte程度以降は、書き込めないような状況となりました。
扱えるファイルの大きさに制限事項がありますか。
また、使い方が問題かどうか、切り分ける方法はありますでしょうか。

試しに、マクロで書き込めなくなったファイルから数行を削除すれば、
また少し書き込めるので、マクロ自体は動いているように思えます。

アドバイスをいただければ幸いです。

[ ]
RE:25251 マクロで扱えるINIファイルの大No.25256
h-tom さん 05/11/26 20:43
 

h-tom です。

単なるユーザーです。

>いつも、お世話になっています。
>秀丸メール4.59、秀丸5.10、Win Meを使っています。
>
>メールの処理に、writeininum、writeinistrを使って、重宝していたのですが、
>INIファイルが65.5kbyte程度以降は、書き込めないような状況となりました。
>扱えるファイルの大きさに制限事項がありますか。
iniファイルは64kまでという制限があったと思いますよ。
(マクロの仕様ではなく、Windows側の仕様)

Googleで検索したらこんなのが見つかりました。
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdnw95/htm/netwr6.asp

[ ]
RE:25256 マクロで扱えるINIファイルの大No.25258
三月 さん 05/11/26 21:36
 
>>秀丸メール4.59、秀丸5.10、Win Meを使っています。
>>
>>メールの処理に、writeininum、writeinistrを使って、重宝していたのですが、
>>INIファイルが65.5kbyte程度以降は、書き込めないような状況となりました。
>>扱えるファイルの大きさに制限事項がありますか。
>iniファイルは64kまでという制限があったと思いますよ。
>(マクロの仕様ではなく、Windows側の仕様)
>
WinXPとかWin2000なら、64kの制限はないようです。

[ ]
RE:25258 マクロで扱えるINIファイルの大No.25269
YK さん 05/11/27 12:27
 
h-tomさん、三月さん、コメントありがとうございました。
知識不足で場違いな質問をして申し訳有りません。
Windowsの仕様から来るのですか、分かりました。

64kではあまりに小さいので、別のファイルを作って、そこで地道に検索など
でデータを取り扱うよりなさそうで、そうなると処理時間がずいぶん違うだろ
うなと考えているところです。

いずれにしてもありがとうございました。

[ ]
RE:25269 マクロで扱えるINIファイルの大No.25292
どみにか さん 05/11/28 13:02
 
YKさん、こんにちは。 どみにかと申します。

遅レスですけども。
しかも1回、間違い投稿しました。みなさんごめんなさい。m(_ _)m
本題ですが、下記のマクロで処理時間も含めて機能的に問題がなければ、テキトーに
改良してご使用ください。
かなり無駄な処理してますけども、検索からR/Wまで全てマクロでやるよりはマシだ
と思います。
今ご使用のマクロの改造時間も含めて。

 注1) ざーっと作りました。バグがあったらすいません。
 注2) INIファイルは、「ファイル名+連番+拡張子」となります。
 注3) 田楽DLLを使用してます。

//-----------------------------
Main:
  call StartInit;                                   // 開始処理
  call WriteIniNum "TestSec1", "TestKey1", 1;       // 数値書込み
  call WriteIniStr "TestSec2", "TestKey2", "Test";  // 文字列書込み
  call GetIniNum "TestSec1", "TestKey1";            // 数値読込み
  message str(##return);                            // 結果表示
  call GetIniStr "TestSec2", "TestKey2";            // 文字列読込み
  message $$return;                                 // 結果表示
  call EndMacro;                                    // 終了処理
endmacro;

StartInit:
  $ININAME = windir + "\\Test"; // INIファイル名
  $INITYPE = ".ini";            // INIファイル拡張子文字列(何でもいい)
  #INISIZE = 60000;             // 書込制限サイズ(少なめにしとく)
  if(#INISIZE > 0) {
    loaddll "DengakuDLL.dll";   // 田楽DLLのロード
    if(!result) { message "田楽DLLが見つかりません。"; call EndMacro; }
  }
return;

EndMacro:
  if(loaddllfile != "") freedll;  // DLLの解放
endmacro;                         // マクロ終了

//-----------------------------
WriteIniNum:
  call WriteIniStr $$1, $$2, str(##3);
return ##return;

WriteIniStr:
  if(#INISIZE <= 0) {
    // 制限なしの場合はそのまま処理して終了
    writeinistr $ININAME + $INITYPE, $$1, $$2, $$3;
    ##Rtn = result;

  }else{
    // すでにある場合は必ず削除する必要がある・・・と思う。
    ##FNo = 1;
    while(true){
      $$FName = $ININAME + str(##FNo) + $INITYPE;
      // 存在しない場合はループを抜ける
      if (!(existfile($$FName)))  { break;  }
      writeinistr $$FName, $$1, $$2, 0;
      ##FNo = ##FNo + 1;
    }

    ##FNo = 1;
    while(true){
      $$FName = $ININAME + str(##FNo) + $INITYPE;
      // ファイルサイズ取得(ファイルがなければ""が返る)
      $$DllRtn = dllfuncstr("SIZEOF", "'" + $$FName + "'");
      if ($$DllRtn == "") {
        // 存在しない場合は作ってしまう(ついでに書き込む)
        $$Value = "[" + $$1 + "]\n" + $$2 + "=" + $$3 + "\n";
        call CreateIni $$FName, $$Value;
        ##Rtn = ##return; break;
      }

      // 書き込み可能なサイズの場合のみ処理する
      if (val($$DllRtn) < #INISIZE) {
        writeinistr $$FName, $$1, $$2, $$3;
        ##Rtn = result; break;
      }
      ##FNo = ##FNo + 1;
    }
  }
return ##Rtn;

//-----------------------------
GetIniNum:
  call GetIniStr $$1, $$2;
return val($$return);

GetIniStr:
  if(#INISIZE <= 0) {
    // 制限なしの場合はそのまま処理して終了
    $$Rtn = getinistr($ININAME + $INITYPE, $$1, $$2);

  }else{
    ##FNo = 1;
    while(true){
      $$FName = $ININAME + str(##FNo) + $INITYPE;
      // 存在しない場合は""を返す
      if (!(existfile($$FName)))  { $$Rtn = ""; break;  }
      // INIファイルから値を取得
      $$Rtn = getinistr($$FName, $$1, $$2);
      // 取得できている場合は処理を抜ける
      if ($$Rtn != "") {  break;  }
      ##FNo = ##FNo + 1;
    }
  }
return $$Rtn;

//-----------------------------
CreateIni:
  ##hWnd = hidemaruhandle(0);       // ハンドル退避
  openfile "/h";                    // 新規作成
  if($$2 != "") { insert $$2; }     // 書きこむ
  saveas $$1;                       // 名前をつけて保存
  setactivehidemaru ##hWnd;         // マクロ制御を戻す
  closehidemaru findhidemaru($$1);  // 閉じる
return result;
//-----------------------------

[ ]
RE:25292 マクロで扱えるINIファイルの大No.25389
YK さん 05/12/04 16:18
 
どみにかさん、コメントありがとうございます。
返信が遅れて、たいへん申し訳有りません。

マクロまで作っていただき、ありがとうございます。
オリジナルの都合上、インターフェース部分の変更と、書き込み位置を
探索する処理を追加して、さっそく組み込ませていただこうと考えてい
ます。

本当にありがとうございました。

[ ]