入門編 ~秀丸の設定に則って外部ファイルを読み込む~

  • 概要

    前節では、秀丸の機能を使って外部ファイルのエンコードを判定しましました。
    該当のソースでは、.NET Frameworkのクラスを利用して、テキストを読み込んでいますが、
    hm.NET では、秀丸から提供されている関数を利用したメソッドも提供しています。

    このように、あくまでも「あなたの秀丸エディタの設定」と一致したテキスト読み込み結果が欲しい場合に、このメソッドを利用します。

  • 秀丸でファイルのエンコードを判断し(この時、秀丸に設定されている内容に依存する)、
    その判断結果に基づいて、ファイルのテキスト内容を取得する。

    マクロ中でもマクロ中以外でも、常時取得することが出来ます。

    Hm.File.IHidemaruStreamReader Hm.File.Open( String filepath, [int hm_encode] )
    • Hm.File.IHidemaruStreamReader

      public interface IHidemaruStreamReader : IDisposable
      {
          IEncoding Encoding { get; }
          string FilePath { get; }
          void Close();
          string Read();
      }
      
      

      となっています。
      using 節にも対応しています。

    • C#側のソース

      MyTestForm.cs
      using System;
      using System.Windows.Forms;
      using Hidemaru;
      
      namespace HmTest
      {
          partial class HmTestForm
          {
              protected void MethodCreate()
              {
                  System.Diagnostics.Trace.WriteLine("フォーム生成時");
              }
              protected void MethodTick()
              {
                  try
                  {
                      var target_filepath = @"D:\test\test.txt";
      
                      // Open関数を利用することで、IHidemaruStreamReader型のインターフェイスを持ったオブジェクトが返ってくる。
                      // IHidemaruStreamReader は「Encoding」「FilePath」のプロパティと、「Read()」「Close()」のメソッドを持つ。
                      var sr = Hm.File.Open(target_filepath);
      
                      System.Diagnostics.Trace.WriteLine(sr.FilePath);
      
                      // 「Encoding」プロパティには、「HmEncode」と「MsCodePage」をプロパティとして持つオブジェクトが返ってくる。
                      var encoding = sr.Encoding;
                      System.Diagnostics.Trace.WriteLine(encoding.HmEncode);
                      System.Diagnostics.Trace.WriteLine(encoding.MsCodePage);
      
                      var text = sr.Read();
                      System.Diagnostics.Trace.WriteLine(text);
      
                      // ここでは明示的にクローズしているが、クローズし忘れても、sr が解放されれば、そのうち解放される。
                      // リソースのハンドルが残り続けるといったことはない。
                      sr.Close();
                  }
                  catch (Exception e)
                  {
                      System.Diagnostics.Trace.WriteLine("エラーが発生:" + e.Message);
                  }
              }
              protected void MethodDestroy()
              {
                  System.Diagnostics.Trace.WriteLine("フォームクローズ時");
              }
          }
      }
      
    • using節

      using節にも対応しているため、ファイル読み込みの部分は以下のような形にしてもよいでしょう。

      MyTestForm.cs
      using System;
      using System.Windows.Forms;
      using Hidemaru;
      
      namespace HmTest
      {
          partial class HmTestForm
          {
              protected void MethodCreate()
              {
                  System.Diagnostics.Trace.WriteLine("フォーム生成時");
              }
              protected void MethodTick()
              {
                  try
                  {
                      var target_filepath = @"D:\test\test.txt";
      
                      // ファイルのリード系などでよく利用されるパターン。例外が発生したとしても、using節から抜ける際に、暗黙でsr.Close() が呼び出される。
                      using (var sr = Hm.File.Open(target_filepath))
                      {
                          var text = sr.Read();
                          System.Diagnostics.Trace.WriteLine(text);
                      }
                  }
                  catch (Exception e)
                  {
                      System.Diagnostics.Trace.WriteLine("エラーが発生:" + e.Message);
                  }
              }
              protected void MethodDestroy()
              {
                  System.Diagnostics.Trace.WriteLine("フォームクローズ時");
              }
          }
      }
      
    • ファイルコードの指定

      秀丸の自動エンコード判定では、失敗する時、あるいは、事前にエンコードが決め打たれている場合には、
      エンコードを指定することが出来ます。
      とはいえ、エンコードが事前に分かっているのであれば、普通に .NET Frameworkのファイル読み込み系のクラスメソッドを利用したほうが良いでしょう。

      MyTestForm.cs
      using System;
      using System.Windows.Forms;
      using Hidemaru;
      
      namespace HmTest
      {
          partial class HmTestForm
          {
              protected void MethodCreate()
              {
                  System.Diagnostics.Trace.WriteLine("フォーム生成時");
              }
              protected void MethodTick()
              {
                  try
                  {
                      var target_filepath = @"D:\test\test.txt";
      
                      // 強制的に 秀丸の「encode」を指定上書きすることが可能。
                      // 例えば、「3」とは「EUC-JP」で、強制決め打ちして読み込み(前節の encode の一覧表を参照)。
      // 自動だと間違ってしまう場合に指定するのが良い。 using (var sr = Hm.File.Open(target_filepath, 3)) { var encoding = sr.Encoding; System.Diagnostics.Trace.WriteLine(encoding.HmEncode); System.Diagnostics.Trace.WriteLine(encoding.MsCodePage); var encoding_name = System.Text.Encoding.GetEncoding(encoding.MsCodePage).EncodingName; System.Diagnostics.Trace.WriteLine(ms_encoding); var text = sr.Read(); System.Diagnostics.Trace.WriteLine(text); } } catch (Exception e) { System.Diagnostics.Trace.WriteLine("エラーが発生:" + e.Message); } } protected void MethodDestroy() { System.Diagnostics.Trace.WriteLine("フォームクローズ時"); } } }
    • 秀丸マクロ側のソース

      前章の「HmNETTest.mac」と同一です。
      対象のパスにファイルを置いたり、ファイル名を変更したり、ファイルのエンコードを変更するなどして、
      いろいろと挙動を確認してみましょう。