どうも!リョクちゃです。
今回は、自身がアプリケーションを作ったとして。その動作として
テキストファイルを作る処理が書かれていたとします。
そんな時にでよくやってしまう、筆者のうっかりベスト3位を紹介します。
※リリースした時点で見つかるモノではなくデバッグ時に見つかるモノとしています。
リリースしてからだと、大惨事を招きかねないので
ちなみに前回は、こちらの記事になります。
それでは早速ベスト3を紹介していきます。
目次
3位:エンコード間違い(文字化けなど)
これ、意外とよくやってしまうんです……。
間違えることで文字化けや、破損ファイルになったり……。
これ有ると無いで、外部連携のアプリが動かなかったりっていうのが、実際にありました。
エンコードについては、下で補足していきます。
エンコードって?
エンコード(英: encode)、符号化(ふごうか)とは、アナログ信号やデジタルデータに特定の方法で、後に元の(あるいは類似の)信号またはデータに戻せるような変換を加えることである。
引用元:Wikipedia
エンコード(文字エンコード)にもいくつか種類があり、一般的には
- Shift_JIS(日本語)
CP932とも位置付けられる。(厳密には違うが広義(広く見て)としては同じ)
漢字を含む日本語を表現できる文字コードとして考え作られた規格 - Unicode
全世界で使われる全ての文字を使えるようにと考えて作られた文字コードの規格
符号化文字集合といわれる。 - UTF-8
世界で最もポピュラーな文字コードの規格
文字符号化式といわれ、UTF-16やUTF-32も同様 - UTF-16
- UTF-32
- ASCII(アスキー)
符号化文字集合といわれる
半角英数字や一部記号などを使えるように作られた文字コード。
があります。いくつかは聞いたことがあるのではないでしょうか?
例えば、アプリではShift_JISでテキストファイルを作ったけど、
別のアプリではUnicodeで開いたら文字化けしてしまった場合は、
おそらくエンコードでエラーが発生しているからということになります。
(下イメージになります。)
これが起きないためには、事前に連携する外部アプリがある場合は、
外部アプリの要件に合わせてエンコードを合わせておきましょう。
2位:保存先が見つからない!!
テキストファイルの保存先が見つからず、エラーが発生して止まってしまうことないですか?
筆者、意外とありまして……だいたいこういったときは、
アプリ側で保存先を作ろうとする処理でうっかりとやってしまいます。
これを回避するために、事前の保存先があるかチェックを行い、
なければ作成するといった対策を講じておきましょう。
そうすることでデバッグ時のエラーを防げます。
コードだと下のような感じになります。
1 2 3 4 5 6 7 8 9 10 11 |
Public Class ukkari Private Sub Main() ' 保存先のチェック If System.IO.Directory.Exists("./Save") = False Then ' 無ければフォルダを作成する System.IO.Directory.CreateDirectory("./Save") End If End Sub End Class |
保存先のチェックを
でチェックをしています。
保存先を作成するには、
で作成しています。
1位:別のプロセスで使われている!
栄えある?!第1位は、別のプロセスで使われているが故に、
テキストファイルを開くことができない。や
テキストファイルに書き込めないといったエラーに見舞われます。
これは、アプリ上でテキストファイルのオブジェクトを解放ができていないのが
最も多い原因といわれています。
アプリ外では、ユーザが該当のファイルを既に開いている場合が当てはまります。
意外と対策をしていそうでうっかりしていて対策を講じていないといった事が良くあります。
実際に、筆者も最初出くわしたときはかなり焦りました……。
今ではだいたい原因がわかっているので、「うっかりだ」といった風になりますが……(-_-;)
これを回避するには、オブジェクトの解放を忘れないことです。
これに尽きます。
対策コードとしては下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
Public Class ukkari Private Sub Main() ' テキストファイルに書き込む Dim sw As New System.IO.StreamWriter("./Save/test.txt", True, System.Text.Encoding.UTF8) sw.WriteLine("こんにちは") ' オブジェクトの解放 If sw IsNot Nothing Then sw.Close() sw.Dispose() sw = Nothing GC.Collect() End If ' 例えば、上記のオブジェクト解放を忘れると、 ' 下の読み込みはエラーが発生します。 ' テキストファイルを読み込む Dim sr As New System.IO.StreamReader("./Save/test.txt") Console.WriteLine(sr.ReadLine()) ' オブジェクトの解放 If sr IsNot Nothing Then sr.Close() sr.Dispose() sr = Nothing GC.Collect() End If End Sub End Class |
GC.Collect()は外部ファイルを使って書き込み・
読み込みをする場合は記述しておきましょう。
(不要になったメモリ領域を解放してくれるので。)
※ 自動的に解放されるのですが、外部ファイルを操作する場合は、
別途記述する必要があったはずです。
おわりに
今回は、筆者がよくやってしまうテキストファイル作成の際に
うっかりやらかしベスト3の紹介でした。
今でもよくやってしまうので、気を付けなきゃです。
皆さんの参考になってなれば嬉しいです。
最後に、VB.Netを勉強する上で参考になる書籍を下に取り上げています。
良ければご参考までにご覧いただければと思います。
・こちらの書籍を参考にVB.Net勉強しています。