« TeamViewerでメインPCを遠隔操作再び | トップページ | WD製2TBのHDD買ってきた »

2011年10月25日 (火)

リンク切れしたファイル/フォルダのショートカットを一括削除するアプリを作ってみた

今会社で作っている”ファイル登録”のVBアプリは、登録と同時にショートカットファイルを作るようにしてるんですが、元ファイルを消したらリンク切れのショートカットファイルに変わってしまいます。

またファイルサーバーのフォルダ構成が整理されて、多くの人のPC内にリンク切れのショートカットができたりしました。

まあリンク切れのショートカットができることなんて、日常茶飯事です。

このリンク切れしたショートカットファイルを自動で削除したい。

と思ってググってみたのですが、どういうわけか見つかりません。

切れたインターネットリンクを消すアプリは多いんですが。例えばこんなの。

窓の杜:Favorite Cleaner

ファイル/フォルダショートカットの一括削除は見つかりません。

あまり需要ないんですかね・・・

でもなんとなく作れそうな気がしたので、作ってみました。

アプリ本体 : リンク切れショートカット削除アプリ

このVBアプリ、フォルダを選択するとそのフォルダ内のショートカットを検索し、リンク切れしてるものだけ消去してくれます。

Windows 2000以上、.Netframework 2.0以上が入ってれば動きます。

まずはリンクを用意。

Shrtkiller01

リンク切れをしているファイル/フォルダの頭に(切)を付けておきました。

これだけが消えて、(生)とついた生きてるリンクのみが残るはずです。

Shrtkiller02

これがアプリ本体。

整理したいショートカットの入ったフォルダを白い枠の中にドラッグ&ドロップしてもらうか、”参照”をクリックしてフォルダを選択します。

Shrtkiller03

フォルダを選んだら”OK”ボタンをクリック。

Shrtkiller04

リンク切れしたショートカットがあると、このように消去した旨を知らせてくれます。

Shrtkiller06

消すものがないと、こんなメッセージに。

Shrtkiller05

この通り、(切)とついたショートカットのみ消えてます

”Cancel”をクリックすると終了。

たったこれだけのアプリです。

が、意外なところでトラップがありまして。

ちょっとプログラムな話になりますが、リンク切れの判定を”Scripting.FileSystemObject”のオブジェクトでやってます。

そこで、リンク先のフォルダがあるかどうかを見る”FolderExists”、ファイルがあるかどうかを見る”FileExists”というコマンドを使います。

ところがフォルダへのショートカットと、ファイルのショートカットが混在してることもあるため、両方チェックしなきゃいけません。

で、下のようなコードになりました

(一部、説明用に変えております)

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

        Dim oShell As Object = CreateObject("WScript.Shell")
        Dim oShortcut As Object
        Dim LnkFileNM As String
        Dim objFileSys As Object = CreateObject("Scripting.FileSystemObject")

        myFilename = Dir("C:\tmp\*.lnk")

        Do Until myFilename = ""
            oShortcut = oShell.CreateShortcut( "C:\tmp\" & myFilename)

            LnkFileNM = oShortcut.TargetPath

            If objFileSys.FolderExists(LnkFileNM) = False And objFileSys.FileExists(LnkFileNM) = False Then

                System.IO.File.Delete("C:\tmp\" & myFilename)

            End If

            myFilename = Dir()
        Loop

上のコードでは、Button2をクリックしたら”C:\tmp\”の中のリンクを調べるようになってます。

If文の後ろの”~ = False”がうるさいですが。

いろいろ調べてわかったのは

・ ファイルリンク用ショートカットでは”FolderExists”で”False”が出る。

・ フォルダリンク用ショートカットでは”FileExists”で”False”が出る。

・ FolderExistsとFileExistsの両方で”False”と帰ってくるリンクが、本当にリンク切れしている。

だったので、上のようなIf文になります。

これでファイルとフォルダへのショートカットリンクが混在していても、リンク切れがチェックできるようになりました。

ちなみにインターネットリンクはリンク切れ有無にかかわらず消えません。あくまでもファイル/フォルダリンクのみです。

本当はもうちょっと頑張って、選択したフォルダの下の階層まで検索するようにしようかと思ったのですが、やめちゃいました。

とりあえず、これで少しは便利になりそうです。

ショートカット【初回生産限定盤B】

« TeamViewerでメインPCを遠隔操作再び | トップページ | WD製2TBのHDD買ってきた »

パソコン系」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

« TeamViewerでメインPCを遠隔操作再び | トップページ | WD製2TBのHDD買ってきた »

無料ブログはココログ

スポンサード リンク

ブログ村