◀ANSI版開発トップへ
  • 1775 ファイル保存のバグ & すべて置換の速度アップ
    • 1776 Re:ファイル保存のバグ & すべて置換の速度アップ
    • 1825 Re: ファイル保存のバグ & すべて置換の速度アップ
      • 1826 Re2: ファイル保存のバグ & すべて置換の速度アップ
        • 1827 Re3: ファイル保存のバグ & すべて置換の速度アップ
    • 1832 Re: ファイル保存のバグ & すべて置換の速度アップ
      • 1836 Re2: ファイル保存のバグ & すべて置換の速度アップ
      • 1850 Re2: ファイル保存のバグ & すべて置換の速度アップ
        • 1851 Re3: ファイル保存のバグ & すべて置換の速度アップ
          • 1852 Re4: ファイル保存のバグ & すべて置換の速度アップ
            • 1853 Re5: ファイル保存のバグ & すべて置換の速度アップ
              • 1866 Re6: ファイル保存のバグ & すべて置換の速度アップ
                • 1874 Re7: ファイル保存のバグ & すべて置換の速度アップ
                  • 1886 Re8: ファイル保存のバグ & すべて置換の速度アップ
  • [1775] ファイル保存のバグ & すべて置換の速度アップ Azumaiya 2002年03月29日 20:11

    開発者のみなさん初めまして。

    ちょっと気になる部分があったので修正してみました。
    ・隠し属性が付いているファイルを保存できない。
    ・「すべて置換」時の置換速度。
     ・正規表現
     ・クリップボードから貼り付ける
     通常の置換にも一応手を入れたのですが、ほとんど速度は上がりませんでした。

    http://www.egroups.co.jp/files/sakura-editor/Developer/Source/CDocLineMgr_2002_03_25-29.zip
    • [1776] Re:ファイル保存のバグ & すべて置換の速度アップ やざき 2002年03月30日 22:30

      ▼ Azumaiyaさん
      > 開発者のみなさん初めまして。
      >
      > ちょっと気になる部分があったので修正してみました。
      > ・隠し属性が付いているファイルを保存できない。
      > ・「すべて置換」時の置換速度。
      >  ・正規表現
      >  ・クリップボードから貼り付ける
      >  通常の置換にも一応手を入れたのですが、ほとんど速度は上がりませんでした。
      >
      > http://www.egroups.co.jp/files/sakura-editor/Developer/Source/CDocLineMgr_2002_03_25-29.zip

      thanx! 取り込みました。
    • [1825] Re: ファイル保存のバグ & すべて置換の速度アップ げんた 2002年04月05日 10:58

      CBregexpのデストラクタでDeinitDllを呼び出していますが,CDllHandlerでライブラリ解放前にDeinitDll()を呼び出すようになっているのでこの記述が無くても大丈夫だと思います.

      と書きながら不安になったのですが,オブジェクトを削除したときは~CBregexp→~CDllHander→CBregexp::DeinitDllの順に呼び出されることになるんでしょうか.そうなるとCBregexpのデストラクタの後でDeinitDllが動くことになってまずいような気がする.

      CDllHandler::~CDllHandlerで派生クラスのメソッドをたたくのがよろしくないなら,CDllHanderを直して解放は派生クラスのデストラクタで個別に行うようにした方がいいですね.
      • [1826] Re2: ファイル保存のバグ & すべて置換の速度アップ Azumaiya 2002年04月06日 14:49

        ▼ げんたさん
        > CBregexpのデストラクタでDeinitDllを呼び出していますが,CDllHandlerでライブラリ解放前にDeinitDll()を呼び出すようになっているのでこの記述が無くても大丈夫だと思います.
        >
        > と書きながら不安になったのですが,オブジェクトを削除したときは~CBregexp→~CDllHander→CBregexp::DeinitDllの順に呼び出されることになるんでしょうか.そうなるとCBregexpのデストラクタの後でDeinitDllが動くことになってまずいような気がする.
        そうはならないみたいです。
        ちょっと私も自信がなかったものですから、簡単なテストプログラムを作ってテストしてみましたが、CDllHandler::~CDllHandler で派生クラス(CBregexp)のメソッド(DeinitDll)をたたくのは出来ないようです。
        CDllHandler クラスのメソッドがたたけるのは CDllHandler のメソッドでしかないみたいです。

        以下のようはプログラムプログラムを書いたとします。

        #include <stdio.h>
        class Parent
        {
        public:
        Parent(){};
        virtual ~Parent(){ DeinitDll(); };

        protected:
        virtual void DeinitDll(){ printf("Parent::Deinit()\r\n"); }
        };

        class Child : public Parent
        {
        public:
        Child(){};
        virtual ~Child(){};

        protected:
        virtual void DeinitDll(){ printf("Child::DeinitDll()\r\n"); }
        };

        int main(int argc, char* argv[])
        {
        Child hoge;
        return 0;
        }

        これで見てみますと、Child 開放時に Parent::~Parent 内部で呼ばれるのは Child::DeinitDll() ではなく、Parent::DeinitDll() が呼ばれるようです。
        ですので、派生クラスで DeinitDll を定義しなおしたら、派生クラスで開放時に ちゃんと呼び出さないとまずいようです。
        • [1827] Re3: ファイル保存のバグ & すべて置換の速度アップ げんた 2002年04月07日 01:37

          ▼ Azumaiyaさん
          > Child 開放時に Parent::~Parent 内部で呼ばれるのは Child::DeinitDll() ではなく、Parent::DeinitDll() が呼ばれるようです。
          なるほど。コンストラクタでは仮想関数のポリモーフィズムは行われないようにデストラクタでも行われないのですね。

          > 派生クラスで DeinitDll を定義しなおしたら、派生クラスで開放時に ちゃんと呼び出さないとまずいようです。
          この場合は~CDllHandlerでDeinitDllを呼び出すこと自体無意味ですね。
    • [1832] Re: ファイル保存のバグ & すべて置換の速度アップ げんた 2002年04月09日 12:39

      ▼ Azumaiyaさん
      >・隠し属性が付いているファイルを保存できない。
      この部分は以前 _lwriteなどの低水準入出力だったのを書き込み速度改善のためにf***系に変更した経緯があります.
      今回ファイル操作がC標準関数からWindows APIに変更されていますが,ライブラリによるバッファリングが行われれなくなって速度が低下するということは無いでしょうか.

      速度に影響するなら 属性取得→ファイル削除→ファイル保存(従来通り)→属性設定 の方が良いように思います.
      • [1836] Re2: ファイル保存のバグ & すべて置換の速度アップ やざき 2002年04月09日 22:28

        ▼ げんたさん
        > 速度に影響するなら 属性取得→ファイル削除→ファイル保存(従来通り)→属性設定 の方が良いように思います.

        で、速度に影響しましたか? > げんた
      • [1850] Re2: ファイル保存のバグ & すべて置換の速度アップ Azumaiya 2002年04月12日 23:48

        すいません。
        最近、急に忙しくなって、全くこちらへ来れませんでした。

        ▼ げんたさん
        > ▼ Azumaiyaさん
        > >・隠し属性が付いているファイルを保存できない。
        > この部分は以前 _lwriteなどの低水準入出力だったのを書き込み速度改善のためにf***系に変更した経緯があります.
        そういう経緯があったとは知りませんでした。

        > 今回ファイル操作がC標準関数からWindows APIに変更されていますが,ライブラリによるバッファリングが行われれなくなって速度が低下するということは無いでしょうか.
        試してみましたら、大きいファイルだと、ものすごく遅くなっていますね。
        これはかなりまずいかもしれませんね。

        > 速度に影響するなら 属性取得→ファイル削除→ファイル保存(従来通り)→属性設定 の方が良いように思います.
        そうですね。
        そのほうがいいと思います。
        ただ、削除してしまうというのは読み取り属性があっても、ファイルを消すことがあるような気がしますので、

        属性取得→属性変更(隠し属性と、システム属性を抜く)→ファイル保存(従来通り)→属性設定

        というのはどうでしょうか?
        • [1851] Re3: ファイル保存のバグ & すべて置換の速度アップ Azumaiya 2002年04月13日 00:41

          ▼ Azumaiyaさん
          > ただ、削除してしまうというのは読み取り属性があっても、ファイルを消すことがあるような気がしますので、
          >
          > 属性取得→属性変更(隠し属性と、システム属性を抜く)→ファイル保存(従来通り)→属性設定
          >
          > というのはどうでしょうか?
          私の引き起こした問題なので、修正しておきました。

          http://www.egroups.co.jp/files/sakura-editor/Developer/Source/ssrc_2002-04-12_13.zip

          にアップロードしてあります。

          しかし、普通に CreateFile して、WriteFile をするとあそこまで遅くなるものなのですねぇ。
          知りませんでした。
          • [1852] Re4: ファイル保存のバグ & すべて置換の速度アップ Azumaiya 2002年04月13日 00:45

            ▼ Azumaiyaさん
            > 属性取得→属性変更(隠し属性と、システム属性を抜く)→ファイル保存(従来通り)→属性設定
            抜くのでは上手くいかなかったので、こんな流れにしました。

            属性取得→属性変更(読み取り属性だけを残す)→ファイル保存(従来通り)→属性設定
            • [1853] Re5: ファイル保存のバグ & すべて置換の速度アップ やざき 2002年04月13日 01:06

              ▼ Azumaiyaさん
              > ▼ Azumaiyaさん
              > > 属性取得→属性変更(隠し属性と、システム属性を抜く)→ファイル保存(従来通り)→属性設定
              > 抜くのでは上手くいかなかったので、こんな流れにしました。
              >
              > 属性取得→属性変更(読み取り属性だけを残す)→ファイル保存(従来通り)→属性設定

              いただきましたー。
              これって明日にでもあげなおしたほうがいいかなぁ?
              それほどでもない?(あまり困ってない)
              • [1866] Re6: ファイル保存のバグ & すべて置換の速度アップ みく 2002年04月14日 16:42


                共通設定の「他プロセスからの上書きを禁止する」にチェックが
                入っていると、作成されたファイルに「リードオンリー」属性
                が付いてしまいます。

                CDocLineMgr.cpp:1016行目
                // ファイル属性を元に戻す。
                ::SetFileAttributes(pszPath, dwFileAttribute);
                を通ったとき。(Getしたときに排他制御している情報が読めてしまうため?)
                • [1874] Re7: ファイル保存のバグ & すべて置換の速度アップ Azumaiya 2002年04月14日 23:55

                  ▼ みくさん
                  > CDocLineMgr.cpp:1016行目
                  > // ファイル属性を元に戻す。
                  > ::SetFileAttributes(pszPath, dwFileAttribute);
                  > を通ったとき。(Getしたときに排他制御している情報が読めてしまうため?)
                  うーん。そうですか。
                  何とか、上手くいく方法を考えてみます。
                  C 標準関数で、隠し属性のついたファイルが書き込みできればよかったんですが・・・。

                  C 標準関数のソース(VC)を眺めたときに、内部で CreateFile を呼び出す寸前にファイルの属性を FILE_ATTRIBUTE_NORMAL に決め打ちしている部分がありました。
                  その部分さえ何とかできればよいのですが・・・。
                  • [1886] Re8: ファイル保存のバグ & すべて置換の速度アップ みく 2002年04月15日 21:51


                    原因がわかりました。
                    新しいファイルとして保存するとき、
                    dwFileAttribute = ::GetFileAttributes(pszPath);
                    が失敗します。このとき、dwFileAttribute = -1(0xffffffff)のまま
                    となり、ファイルクローズ後の
                    ::SetFileAttributes(pszPath, dwFileAttribute);
                    でとんでもない属性を設定してしまいます。

                    ですから、
                    ::GetFileAttributes(pszPath);
                    で失敗した場合はNORMALを設定するようにすればただしく動作します。