LinkCheckについて

220115:作成完了
220822::VS2022に変え、多少の修正をした
野鳥紀トップページ

概要

このページはLinkCheck.exeという自作のプログラムの解説、動作説明のページです。
このサイトの各ページのリンク切れの検査をする為に作りました。
ローカルフォルダに構築してあるサイトのHTMLファイルを読み込み、その中のリンクが正しいかを調べます。
サイトの維持の為に、このような作業もしている、という事の紹介です。

動機

サイトの運営をしていて気になるの事の一つがリンク切れです。
これまでは、リンク切れのチェックにはHPB15のビジュアルサイトビューを使っていました。

少し前、PCのOSをWin10からWin11に換えたところ、このビジュアルサイトビューが正常に動かなくなりました。
つまり、リンク切れチェックが効かなくなりました。
いえ、多少のファイル数のサイトでは期待通り動いています。検査結果もちゃんと出て、リンクエラーがある場合は表示されます。
ただ、私のこのサイトは、220822現在、ローカルフォルダにあるファイルが約176,000個、その中のHTMLファイルは5,900個ほどあります。
この私のサイトを対象にしてビジュアルサイトビューを動かすと、エラーを吐いたり、HPB15が強制終了したりします。(追記あり)
まあ、HPBも最新版を使え、ということでしょうけどね。
しかし、HPB15も普通に使う分には動作に問題ありません。現在、このページを作る作業はHPB15でやっています。

HPB15のビジュアルサイトビューは、Win10では何とか動いていました。
ただ、設定次第では結果が出ない事もありました。
正常な時も、結果が出るまでに5分とか10分とかかかっていました。(私のPCのスペックはパソコンメモのページに記載)
この機能は頻繁に使うものではないので、我慢して使っていました。
これが、現在のWin11ではうまくいきません。

そこで、一念発起、自分で作ることにしました。
今、使える環境はHSPかVS2019のC#です。
C#の方が早いことは分かっていましたので、これを使いました。

私の貧相な知識の範囲で書いていますが、C#の方が(VS2019の方が)圧倒的に便利です。
この作業で必要不可欠な作業が、ファイルの収集に使う再帰でしょう。
この再帰が(再帰に代わるものが)C#にあります。コマンドが準備されています。
(コマンドというのか、スクリプトというのか、関数というのか、メソッドなのか用語は分かりませんが、)
指定のフォルダ以下のサブフォルダを含んで、中にあるファイルを収集する作業が一行で終わります。
しかも、オプション次第で、全部のファイルを収集することも、特定の拡張子のファイルだけを収集することもできます。
それが、Directory.EnumerateFilesです。便利なものです。
これに気付いたことが、このプログラムを作ろうと思い立った、完成の目途が付いた、理由の一つです。
このコマンドの実行時間は、先の数のファイルを収集するのに数秒で終わります。

ついでに書いておくと、今回発見したC#の便利なコマンドには、
Path.Combine、相対パス(../)を絶対パスへ変換してくれるもの、
String.Compare、大文字と小文字を区別しないで比較する(href=でもHref=でも同じように扱える)もの、
str.Split('\"')、文字列を引用符で分解してくれるもの、
等があります。

相対パスは、実際、リンク先の表示によく使われています。
例えば、リンク対象の写真が一つ上のフォルダにある時や、隣のフォルダにある時など、です。
これを絶対パス(?フルパス)に変換しないと、正誤のチェックができません。
当初、こんな便利なものがあるのを知らず、2段(../../)までは力技で関数を作って変換していました。
ただ、3段もあるかもしれないと心配した時、ようやく既存の関数を探すことに思い至りました。
そこで、Path.Combineを発見しました。
結果、私のサイトには2段までしかありませんでした。
この関数では、少なくとも3段までは変換できる事を試してあります。多分制限は無いのでしょう。

str.Split('\"')も、今回重宝しました。
本来は文字列をコンマなどで分割するコマンドなのでしょうが、この際、「”」を指定すると「”」で分割してくれます。
例えば、<a href="index.htm">トップページ</a>、という文字列を、”(実際は半角)で分割すると、
とても簡単に、配列の2番目の要素に求めるリンク先を入れてくれます。
どこから分割を始めるか、対象の文字列の先頭に気を付けるだけです。
今回のリンク先の文字列は全部これで収集しています。収集できています。
プログラム的には必要十分ではなく、これで収拾できていないリンク先があるのかは分からないのですが。

220118追記
今日、HPBのビジュアルサイトビューを試してみたら動きました。改善されたのか、偶然なのか分かりません。
とにかく最低限の設定にしてあります。
レベル数は1、サイトビューのフォルダツリー表示は、トップフォルダとリンクエラーの二つだけ選択しています。
作業時間は5分でした。リンクエラーだけ表示されます。

前提条件

私のサイトの文字コードはShift_JIS(改行はCR+LF)です。つまり、この文字コードのHTMLファイルが前提です。
この点、いろいろ勉強するうちに、現在ではHTMLファイルはUTF-8N(BOM無し、以下同じ)が標準だと気付きました。
ですので、一応、UTF-8Nには対応させました。いずれも改行はCRLFです。
どちらかというと、この改行コードが大事で、CRLF以外のコードだとファイル全体が一行だと判断されてしまうはずです。
そうなると、ちょっと厄介です。この件、改行コードがCRLFではない場合については、試してはいません。

調べるリンクのタグは「href」と「src」の二つです。
実際にはタグが他にもいくつかあるのかも知れませんが、私のサイトではこの二つしか使っていません。チェック出来るのはこの二つだけです。

プログラムへの指示、設定は、下に書いている設定ファイルを作って指示します。
設定ファイルのリンクタグの説明の所で、この件についても詳しく解説しています。

プログラムの進捗状況

作業を進めて行くうちに、リンクには、リンク先の正誤をどうやって判定するかによって、いくつかに分類できる事に気付きました。
このリンクの種類に応じて、エラーの判定をしていきます。

具体的には、
1、一般的な、リンク先が指定のフォルダ以下のファイルになっている場合、つまり、自分のサイト内にあるもの、
2、リンク元のページ内の違う行に飛ぶように指定されているもの、(リンク先の表示に#が付いている場合、)
3、これの変種で、リンク元とは違うページの特定の行が指定されているもの、(やはり、#が付いています。)
4、外部リンク、リンク先が別のサイトのページになっているもの、(リンク先がhttp://等)
5、リンク先がJavaScript形式、JavaScriptで飛ぶようになっているもの、
6、リンク先がmailtoとなっているもの、
です。

現在、上の分類で、JavaScript形式とmailtoについては、リンク先の正誤を判別していません。リストアップするだけです。
プログラムでは、残りのものも含めて、種類ごとに一覧表を作って、作業経過とともにクリップボードへ転送し、利用できるようにしています。
外部リンクについては、私が理解できるコマンドが見つからず、苦労しました。
しかしながら、ようやく、ネットに紹介されているものを使うことができました。

この外部リンクに関しては、判定に要する時間を心配しました。
私のサイトでは、外部リンクの総数は2600個程度でした。(この数字もこのプログラムで確認しました。)
ただ、大半のリンク先は同じページを指しています。この重複分を省いた純粋な件数は84個になりました。
この84個でリンク先の正誤を試したところ、判定に要する時間は21秒でした。(私のPCのスペックはパソコンメモのページに記載)
通常のリンクの正誤を調べる場合に比べたら莫大な時間がかかっていますが、私のサイトでは数がそんなに多くなるものでもありません。
容認できる時間だと思います。
万一、外部リンクが1000個にでもなると、ここだけで4分かかる計算になります。

外部リンクに関しては、当初、15個ほどのリンクエラーがありました。
やはり、このプログラムで発見したものです。
そのエラー分を訂正廃棄して残ったものが実質84個で、これに関しては現在全部正常なリンクです。
外部リンクがエラーの場合でも、正しい場合でも、判定時間には大きな違いはなさそうです。

ここで、気付きました。HPB15のビジュアルサイトビューでは、この外部へのリンクは調べていない、ということです。
調べてあるのなら、このリンクエラーが検出されていたはずです。
ということは、この私のプログラムは、まんざらでもないという事になります。
もっとも、ビジュアルサイトビューでは他にも色々な作業をしています。私のプログラムはリンクチェックだけです。

外部リンクについて、その後、事件がありました。
外部リンクを検査している途中で、応答なし、になりました。
応答なしはrelease版でのことで、debugでは強制的に終了は出来ました。
画面で検査状況のカウントをしています。リストの2番目で止まっています。

別途、動かして、検査直前で止めて、リストの順番を調べました。
原因は、我がサイトのトップページでした。
ブラウザで確認すると、Chromeでは表示はしますが、読み込み中のマークが消えません。Chromeの強力なキャッシュのせいです。
Edgeでは読み込みさえしません。
ネットで調べるとサーバーが落ちている様です。さくらインターネットです。
サーバーのトラブルはやがて解消し、私のプログラムも正常になりました。

しかし、問題点は残りました。
私は、プログラムの動作テストのため、通常使わないHTMLファイルに、まったく架空のリンク先を仕込んでチェックさせています。
この架空のURLでは正常にエラーを返します。リンク先が無いという判定をしてくれます。止まらないのです。
今回のさくらのケースでは対応のしようがありません。
そこはそれ、ネットで見つけて参照(正確にはほぼ丸写し)させていただいたコードです。問題が起きても対応できないのです。
想像するに、サーバー側が何やら変な動きをして、あいまいな状態になっているのでしょうね。

ただまあ、めったには発生しないケースだとは思います。
そこで、今の処置は、その外部リンクの検査の際、逐一、検査先のURLを画面に表示することにしました。
これで、今回のような場合には、画面に問題のあるURLを表示して止まるでしょうから、発生源は分かるはずです。
また、この点、検査数のカウントだけしていく場合と、検査中のURLを逐一表示する場合の実行速度に違いはありませんでした。
検査に要する時間が大半で、表示する時間は大したことがないという事です。

更に、外部リンクに関しては検査する、しないの選択が出来るようにしました。
理由は、上の例のように対応が出来ないリンク先があるかもしれない事と、
本来、そんなに変わるものではないので、一番時間がかかる処理をスキップ出来るようにした、
という事です。

リンク先のリストだけを作って、プログラムで正誤を調べていないものは、
リンク先がJavaScriptとmailtoになっているものです。
JavaScriptは、全部JavaScript:history.go(-1)です。戻るボタンです。こちらも2600個ほどありました。
正誤を調べる必要が無いですし、方法も分かりません。
mailtoも同じです。こちらは、私の過去のサイトに残っている場合がありますが、現在のサイトにはありません。
いずれも、無視してよさそうです。

文字コードは、Shift_JISとUTF-8Nで、設定ファイルとHTMLファイルの文字コードを同じにする、としています。
HTMLがUTF-8Nなら、設定ファイルもUTF-8Nで作らないといけません。
ただ、実際に試してみると、設定ファイルとHTMLファイルも文字コードが違う場合でも動作しています。
検査結果を見るとき、ファイル名等に全角があると文字化けしているだけです。

しかしながら、ここで例外が発生したことがあります。
何度か試してみて、文字化けが起きているURLを検査しようとして発生していることが分かりました。
私の想像ですが、文字化けによって、URLに使ってはいけない文字が含まれている場合に発生するのだと思います。
そこで、URLの検査の直前に、形式チェックを入れて、不正な形式の場合は、検査をせずに、エラーに分類するようにしました。
全角URLで文字化けの時はこれで弾くようです。この場合の結果は形式不正として区別しています。
文字コードを適正に指定しておけば発生しませんし、全角のURLはあまり出てこないでしょうから、これでいいと思います。

設定ファイルの内容


概要
設定ファイルは、LinkCheck.txtというShift_JIS形式もしくはUTF-8N形式のテキストファイルです。
これ以外の文字コードに関しては試していません。
改行コードはどちらもCRLFです。CRLFでないと正常に動かないはずです。
どちらかというと文字コードより改行コードの方が大事です。

プログラムでは、この設定ファイルを、まずShift_JIS(CRLF)で読み込み、エラーになるようならUTF-8N(CRLF)で読み込み直します。
これでもエラーなら終了します。
なお、設定ファイルの文字コードはHTMLファイルの文字コードのフラグになっています。
設定ファイルの文字コードでHTMLファイルも読み込みます。
つまり、設定ファイルはHTMLファイルと同じ文字コードにする必要があります。
HTMLファイルの方は文字コードのチェックをしません。

この設定ファイルを、実行ファイルLinkCheck.exeと同じフォルダに置いておきます。
このファイルに作業上必要な項目を決められた形式で指定します。
具体的にはファイルは下のようになっています。

-----------------------------------
<トップページのあるフォルダ>
G:/Hp/hp2/
<検査対象ファイルの拡張子>
*.htm
*.html
<収集するリンクのタグ>
href
src
<検査を除外するフォルダ>
backup
<検査を除外するファイル>
index2.htm
<ここが行末>
-----------------------------------

全体的な注意点
<>で囲んである行は項目名です。この項目名は必須です。一文字でも違うとエラーです。順番も変えられません。

プログラムで使うのは、
<トップページのあるフォルダ>、から
<ここが行末>、までの間だけです。
この行の前後の文字列、文章は無視されます。
つまり、メモ書きとして使えます。
上下の点線は必要ありません。あっても構いません。

項目行間の指定内容は、一つだけ指定する場所と複数指定できる場所があります。
何も指定しなくてもいい場所もあります。
指定内容の先頭に、;、セミコロン(実際は半角)を付けると、その行は無視されます。コメントアウトの記号として使います。
当然、項目名の行に;を付けるとエラーになります。

プログラムでは、この設定ファイルを読み込むだけです。変更や書き込みはしません。

フォルダを表す記号は/です。\を使っていても、プログラムで/に変換します。

以下、項目名ごとに説明します。


<トップページのあるフォルダ>
このプログラムの検査対象のフォルダを指定します。
このフォルダ以下のサブフォルダを全部含み、存在するファイルを全部収集します。
検査対象から外したいサブフォルダやファイルがある場合は、下の項目で除外できます。

ここで指定できるフォルダは一つだけです。
一行に一つだけのファルダをフルパスで書いておきます。
フォルダを表す記号は/です。\で書いてあっても/に変換されます。

なお、この<トップページのあるフォルダ>は、起動時にこの設定ファイルを読み込んで画面のボックスに表示されます。
検査開始前に、このボックスを書き換えることが出来ます。
この場合、テキストボックスに表示されているフォルダ名が優先され、そこのフォルダ以下を検査します。
ただ、フォルダ指定を変える場合は、設定ファイルで変更する方法が簡単かつ安全でしょう。
フォルダが見つからない場合は警告を出して、先へ進みません。

各項目の内容は、上に書いている通りで、;セミコロンが先頭にある行は無視されます。
例えば、
;G:/a/b/
G:/a/c/
;G:/a/d/
と書き込んであれば、G:/a/c/以下のフォルダで作業します。
動作試験中に、簡単に変更できるようにした機能です。

重要
プログラムの都合上、各ドライブのルートフォルダで作業すると例外が発生する場合があります。
この作業フォルダ(トップページのあるフォルダ)としてルートフォルダは指定出来ない様にしてあります。(例:G:/)
その為、作業フォルダはサブフォルダという前提です。
ここでルートフォルダを指定すると、その旨の警告が出ます。
ルートフォルダの判定は、文字列が3文字以内かどうかで判断しています。


<検査対象ファイルの拡張子>
ここは、普通に検索する時と同じ要領でワイルドカードを使って拡張子を指定します。
*.htm、みたいな感じです。
これと、先に説明したDirectory.EnumerateFilesを組み合わせると、指定フォルダ以下の拡張子.htmのファイルを全部収集します。
これで、拡張子がhtmのファイルが全部、検査対象とします。
ワイルドカードの面倒な書式は試していません。どこまで許されるのかは分かりません。
これを指定したら希望通りに動きましたので、それ以上は追及していません。正規表現とか、私は分からないのです。

大事なことは、テキスト形式のテキストファイルを収集しないといけない事です。
例えば、*.*等と指定すると、JPGファイル等も検査対象になってしまい、まずエラーになるでしょう。
試してはいませんが、帰ってこない可能性まであります。

この性質から、直接ファイル名を指定すると、そのファイルだけを収集します。
ファイルを一つ指定する事で、動作試験にも使えます。
例えばindex.htmと指定すると、index.htmだけを読み込み、検査します。

動作試験用のフォルダを作るのが面倒な場合、ここで単一のファイルを指定して動かせばいいわけです。
また、新しいファイルだけ検査していない、一つのファイルだけが怪しい、というような場合にも使え、作業時間短縮にもなります。

この項目、拡張子の指定は複数指定できます。
ここで、重複して収集されるような指定をすると、結果も重複するはずです。

ここを何も指定しないとエラーになり、先へ進めません。


<収集するリンクのタグ>
リンクを示すHTMLタグを書いておきます。
想定しているのは、hrefとsrcの2個です。
私のサイトでは、この2個のタグを使っています。プログラムも、この二つだけを調べます。
これ以外のタグも実際にはあるのかもしれませんが、想定していません。使用方法が分かりませんので。

プログラムはここで指定されたタグを発見したら、その直後の引用符("")の中を取り出しています。
具体的には、
<TD><A href="mlindex.htm"><B><FONT size="-1">観察野鳥</FONT></B></A></TD>
という行があると、
href=の直後の""の中にあるmlindex.htmという文字列を取り出します。
そして、これをフルパスに変換して、先に収集していた全ファイルのリストと照合します。

このタグに使う文字は、大文字小文字を区別しません。どちらでも同じです。
という事で、逆に、href="とHref="と二つを別々に指定すると、どちらも同じに扱いますので、二重に集計されてしまいます。
一応、この点はプログラムでチェックしています。
実質、同じタグが指定されていたら、設定ファイルの修正を促して止まります。

(注) このページの説明用に書いているhref="云々という文字列は検査対象にならないか、という心配があります。
でも、ソースを見ると対象にならないことが分かります。

src="の場合もまったく同じ作業をしています。

同じ行に、複数の異なるタグが含まれている場合には複数のタグを収集します。

同じ行に、同じタグが複数ある場合も全部を収集します。
これは当初、想定していませんでした。
試してみたら、以外にも、このケースが多数あることが分かりました。我がサイトのトップページにもありました。

例えば、下のように書くと、一行に二つの同じ形式のリンクが簡単にでき上がります。
具体例:「設定ファイルの内容」と「画面の説明
このような行のリンクも全て収集し、検査しています。

ここで、改行コードの問題が出てきます。
改行コードはCRLFが大前提です。
コードが想定外の、例えばCRだったら、一ファイル全部が一行とみなされます。
この件、実際には試していません。

設定ファイルでの指定がhrefとだけ書いてあった場合(="が無い場合)は、プログラムで組み立てて、href="という文字列に直しています。
href ="と指定していた場合、例えばhref ="とかhref = "など、=の前後にスペースがあるとチェックされません。
そこで、このスペース込みのタグも検査したい場合は、そのように指定します。
href="
href ="
href= "
href = "
こう指定すると大体のタグは検査できます。
スペースが2個連続とかは必要ないでしょうが、指定したら動くはずです。

この形で検査するときは最後の="の形になっていることが必要です。
=だけとか"だけとかの場合は訂正するように促して止まります。

また、注意点が一つ、hrefと指定しておくと、プログラムでhref="と変換して作業をします。
href="と指定すると、そのまま調べます。
そこで、hrefとhref="と二つ指定するとプログラムでは同じものだと判断し、て止まります。

私のサイトでは、当初は必要ないと思っていたのですが、実際にこれ(スペースを含んだタグ)を調べてみたら、5個のタグが新たに発見されました。
いずれもsrc = "(=の両側に一個のスペースがあります)で、facebookの動画を引用している構文の中にありました。
私は、この新たなリンクに異常がないことを確認して、以降はこの手(スペースを含んだタグ)の検査をすることをやめました。
検査するタグが増えると、その分時間が掛りますし、めったに発生するものでは無いという判断です。

なお、この=の前後にスペースの入ったタグを指定すると、想定外だと警告が出ます。
その際は、指示の通りOKボタンを押して作業を続ける事になります。


<検査を除外するフォルダ>
例えば、サイトを形成しているフォルダの中に、バックアップファイルだけを入れているサブフォルダがある場合、
リンクの記述はその呼び出し元のファイルからの相対的な記述になっていますので、
検査対象として読み込んでしまえば、大半のリンクがエラーになります。本来あるべきフォルダではないからです。
このようなフォルダを一括で、除外するフォルダ、として指定しておくと、手間をかけなくて済みます。

指定の基本的な方法は、フォルダ名で指定します。
プログラムでは指定されたフォルダ名が検査対象のファイルのフルパスに含まれていれば検査対象から除外しています。

フォルダを単体で指定する場合は前後の/は必要ありません。

ただ、ここで、フルパスの中に同じフォルダ名が複数あるような場合には、誤動作が発生する可能性があります。
具体的に、
G:/a/b/c/b/etc/、とあるフォルダ構造の場合、bを除外フォルダとして指定すると、G:/a/b/以下にあるファイルが全部除外されます。
指定のフォルダ名がフルパスに含まれているかどうかだけで判断していますので。
目的はG:/a/b/c/b/以下のファイルだった場合、G:/a/b/c/b/あるいは/c/b/と指定しておくと目的通りに処理されます。
この際、フルパスで指定すると紛れはありません。

ここは何も指定しなくても構いません。
制限はありません。大量に書くこともできます。作業時間に対しての影響はさほどないはずです。

実際に比較するときは、指定のフォルダ名の前後に/を付けて調べます。
abcと指定しておくと、比較するときには/abc/で比較します。
よって、例えば、abcと指定した場合には、abcdeというフォルダは除外されません。
同様に、実際には存在しないフォルダ名を指定した場合には、なにも除外されません。


<検査を除外するファイル>
指定のフォルダの中に検査しないでいいファイルがある時、そのファイル名をここに書いておきます。
私の場合は、やはりバックアップの為とか、書き換えたファイルの元のファイルを残しておきたい時に、ファイル名を変えて保存しておく事があります。この古いファイルを指定しておくと、検査をスキップします。
<トップページのあるフォルダ>を省略した相対パスかフルパスで記述しておきます。
プログラムが相対パスと判断した場合は、フルパスに変換して、全部のファイルリストの中から削除します。

ここは何も指定しなくても構いません。
制限はありません。大量に書くこともできます。作業時間に対しての影響は試していません。
多分、作業時間がすくなくなる方に作用すると思います。

具体的には、
まず、指定の拡張子でファイルを収集し、
その後、そのリストの中に場外するファイルがあれば削除し、
残ったファイルの検査をする、
という段取りになっています。


<ここが行末>
この項目が実質の設定ファイルの末尾です。
プログラムは、この行より下の行に何を書いても無視します。
メモ書きとして使えます。
コメントアウト記号;も必要ありません。


画面の説明


トップページのあるフォルダ
(テキストボックス)
設定ファイルに書き込んである同名の項目のフォルダがここに表示されます。
このボックスは検査開始前なら書き換え可能です。
書き換えると、設定ファイルでの指定を無視して、書き換えたフォルダでの作業をします。
しかし、総合的には、設定ファイルを書き換えて、プログラムを再起動した方がよろしかろうと思います。
ルートフォルダを指定すると動きません。フルパスでサブフォルダを指定してください。


作業ページ
(テキストボックス)
作業中のページ数(HTMLファイル数)が表示されます。作業に時間が掛る時の暇つぶしです。
作業が終わった時の数字が総数です。


リンク総数

(テキストボックス)
作業で収集したリンクの数が表示されます。作業に時間が掛る時の暇つぶしです。
作業が終わった時の数字が総数です。


外部リンク数

(テキストボックス)
外部リンクを検査している時の外部リンクの数が表示されます。作業に時間が掛る時の暇つぶしです。
この作業に関しては総数も同時に表示されます。
外部リンクの検査は、重複しているリンク先は省略したリストに基づいてを検査しています。
ですので、重複しているものはエラーを修正しても再度エラーが指摘される場合があります。
また、外部リンクの検査の時は、下の作業状況のボックスに検査しているURLを逐一表示します。


経過記録
(チェックボックス)
このプログラムの作業経過を必ずクリップボードに書き込みます。
通常はこのチェックボックスは使いません。OFFの状態で作業をします。OFFでもクリップします。
つまり、それまでコピーしてあるデータが上書きされます(重要)。コピー&ペーストのコピーです。

このプログラムでは、作業の経過記録を作っているのですが、この記録が二種類あります。
簡易な経過記録と詳細な経過記録、です。

簡易な経過記録とは、このリンク検査の作業結果が主になります。
普通には、これ以上の情報は必要ありません。チェックはOFFで作業します。

この簡易な経過記録には収集した各種のリストを含みます。
このリストは、現在、19種になっています。
全部のファイル、全部のHTMLファイル、全部のリンク部分、種類別に分けたリンク、種類ごとのエラーリンク、です。
プログラムでは、この作業結果をクリップボードに貼り付けて終わります。
これをテキストエディタ等に張り付けることで、作業の細かい成果を確認できます。
このため、作業前のクリップボードの内容は上書きされてしまいます。

詳細な経過記録とは、このプログラムの動作を調べるために、変数や実行順を記録するものです。
この記録には、作業結果である簡易な経過記録も含めて記録、クリップされます。
この詳細な経過記録は、プログラムの作成状況で徐々に削っていきます。動作確認が取れれば必要ないものですので。
プロクラムの作成初期のころは、詳細な作業経過だと、プログラムの実行時間にかなりの影響が出ますし、プログラムの動作の記録が大半になりますので、本来の目的とは違うものになります。

これのチェックがONの時は、その下に赤字で警告が表示されます。
数十、数百程度のファイルしかないフォルダの検査だと問題ないのですが、私の環境で、11000個のファイルのあるフォルダで、当初、86分掛かっていました。

私のこのサイトは、全ファイルが16000個、検査対象のHTMLファイルが5700個ほどあります。(数字は上で修正)
このプログラムの本来の目的のフォルダです。
現在、これを指定して実行すると、経過記録なしで90秒ぐらい。経過記録ありで300秒ぐらいで結果を出せるようになっています。
この時、このクリップされたテキストを保存してみると、簡易な経過記録でのテキストファイルは500KB、詳細な経過記録では3900KBでした。
時間も容量も、プログラムの完成度合いで差がなくなっていきます。

作業の成果として作られる各種のリンクなどのリストについては、リストの内容が多い場合は省略して記録します。
省略量はリストの性格で区分けしてあり、1000件を超えると省略するもの、100件を超えると省略するもの、数が多くても全部を表示するもの(リンクエラー等)のような区分けになっています。

この経過記録は、検査開示ボタンを押すごとに初期化されます。
つまり、複数回検査開始ボタンを押しても、直前の回の記録だけが残ります。


外部リンク
(チェックボックス)
初期値は、OFF、外部リンクは検査ししません、です。
チェックをONにすると外部リンクも検査します。
検査する場合には、赤字でその旨を表示します。

外部リンクの検査には、二つの問題を抱えています。
一つには、他の検査に比べて時間が掛るという事、
相手先の条件次第では例外が発生するかもしれないという事、
の二点です。
この対策で、検査しない、という選択肢を付けました。

検査時間は、例えば、動作試験の時の時間ですが、
HTMLファイル数5700、検査する外部リンク数85の時、総作業時間60秒のうちの19秒を使っています。
また、HTMLファイル数970、検査する外部リンク数27の時、総作業時間8秒のうちの6秒を使っていました。
これで分かるように、そこそこの検査数の場合は、この外部リンク検査にかなりの影響を与えています。
外部リンクは、というよりリンクそのものがそんなに変化するものではありません。
そこで、時間のかかる外部リンクの検査は必要な時だけ指定する、という事にしました。


ファイルの文字コードは
(ラベル)
設定ファイルの文字コードを表示します。
文字コードはShift_JISかUTF-8Nだけです。UTF-8Nとは、いわゆるBOMなしUTF-8です。
設定ファイルの文字コードはこの二つだけを調べます。これ以外の文字コードの場合は、警告を出して止まります。
正確には、この二つの文字コードで読み込んでみて、解釈出来なかった場合は止まります。
そして、設定ファイルの文字コードが、つまり、この表示がHTMLの文字コードだとして作業を進めます。
改行コードはいずれの場合もCRLFです。


作業状況
(テキストボックス)
簡単な作業経過が表示されます。
エラーメッセージもここに表示されます。
外部リンクの検査の際は、検査中のURLを逐一表示します。


検査開始
(ボタン)
作業を開始します。
通常はフォーカスがこのボタンにありますので、Enterキーで始められます。
作業を開始すると、ほかのボタン類が使えなくなります。
結果が出るまで待つだけです。
使えるボタンは、事実上、フォームの右肩にある終了ボタン「X」だけです。

検査作業が終わると、作業経過のテキストボックスにその旨の表示が出ます。
それと、作業経過とあるラベルが「作業終了」に変わります。
作業結果をクリップボードに転送します、の文字が、作業結果をクリップボードに転送しました、に変わります。
ですので、その前にコピーされているクリップボードの内容は上書きされてしまいます。
対策として、クリップボード履歴をONにしておくと便利です。


外部リンク
(ボタン)
このボタンは、起動時は無効化されています。
一通り検査が終わると有効になります。
外部リンクの検査をしない場合でも、一回目の作業で外部リンクのリストは作ってあります。
ですので、外部リンク(重複なしの)の正誤の検査だけを実施することができます。
作業経過が書き換わりますので、この作業の前に、そこまでの経過を取り出しておくべきです。


作業中断
(ボタン)
作業途中で作業をやめたい時、このボタンを使うつもりでした。
うまくいきません。
コマンドが最適ではないようで、いったん検査を開始するとボタンが効かなくなります。
作業途中で中断したい時は、窓の右肩の終了ボタン「X」で終了してください。

当初、結果が出るまでに一時間以上かかる場合があって、その状態を中断するために考えました。
ボタン自体は有効に動きませんが、最近では作業の方が長くても2分程度で終わるようになりました。
つまり、あまりこのボタンの意味がありません。

表示されている作業ページ等の数字や作業経過欄の表示で、残り時間がある程度は判断できます。
ですので、あきらめるか続けるかの判断材料になります。


リンクエラー総数
(テキストボックス)
作業が終わると、リンクエラーの総数を表示します。
普通は0になるはずです。
ここで私はプログラムの動作チェックのために、エラーのリンクのあるページを作ってあります。
もちろん、実際の表示に影響のない独立したページです。外部からのリンクはありません。
このリンクエラーが抽出されることで動作チェックになります。


エラー明細
(リストボックス、表題なし)
作業結果のリンクエラーの箇所を表示します。

通常のリンク、
内部リンク、
外部リンク、の三つに分類されて表示されます。

表示の形式は、
リンクエラーのあるファイル名+リンクエラーのある行数+フルパスで表示した場合のリンク先
となっています。

具体的には、例えば、
G:/Hp/ErrorTest.htm の 62行目 G:/Hp/err.htm
のような形で表示されます。


OK
(ボタン)
設定ファイルの「収集するリンクのタグ」の内容に既定のタグ以外のタグが指定されていると警告が出ます。
そこで、このOKボタン押すと表示を消し、検査開始ボタンを押せるようになります。
私は、FC2関係のページにurl="云々"というタグを見つけ、試しに、「収集するリンクのタグ」にurlを追加してみました。
プログラムではurl="という文字列を探します。
結果は、その一件しかありませんでした。

ここで、やたらなものを指定してあって、構わず実行させてしまうと、返ってこないかも知れません。
例えば、aとか指定してしまうと、全ファイル中のaという文字を拾って検査しますので、数限りなくあります。
私は試していません。
あ、実際にはaと指定するとa="を探しますので、さほど心配は要らないかもしれません。


操作説明
(ボタン)

このファイルを表示します。
もう一回押すと表示を消します。


作者HP
(リンクラベル)

作者が運営しているサイト、「野鳥紀」のトップページを開きます。