C#.NETメモ:IEお気に入りURLの取得


現在タブブラウザ機能つきのソフトウェアを作成しているのですが…
やはりIEブラウザのお気に入り機能は必須かと思ってます。

そこでお気に入り機能を頑張って作ってみました。
ともあれ忘れたときのためにメモしておきます。
まぁやってみるとそこまで難しいものではありませんでしたが…


.NETのEnvironmentクラスで、下記のコードでPCにある「お気に入り」フォルダのパスを簡単に調べることができます。



//IEお気に入りフォルダ取得
String bookmarkFolderPath
     = Environment.GetFolderPath(Environment.SpecialFolder.Favorites);


このフォルダパスを使って「お気に入り」のデータを取得します。
ちなみに「お気に入り」フォルダ以外にも「デスクトップ」や「マイピクチャ」などのフォルダも似たように取得できます。



//デスクトップフォルダ取得
String desktopFolderPath
     = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
//履歴フォルダ取得
String historyFolderPath
     = Environment.GetFolderPath(Environment.SpecialFolder.History);
//マイピクチャフォルダ取得
String myPictureFolderPath
     = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures);
//マイドキュメントフォルダ取得
String myDodumentFolderPath
     = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
//プログラムファイルフォルダ取得
String programFilesPath
     = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);



さて、「お気に入り」フォルダのパスを取得した後ですが――
お気に入りフォルダの中にあるファイルはショートカットファイル(.url)です。
その為、ブラウザに直接ファイルパスをUrlに指定しても表示してくれません。
ファイルをそのまま実行させると新規IEが起動される為、タブブラウザを作りたい私にはこの手は使えません。
なので、ショートカットファイルをテキストとして開いて、URL部分だけ読み込むことになります。

下記に私が書いたコードを示しますが、
ファイルを1行ずつ読み込み「URL=」が先頭で始まる行が「お気に入りURL」の文字列です。
これはStringクラスのIndexOf関数を使えばすぐに確認できるかと思います。

ただし、この文字列のままだと「URL=」が邪魔なので、削除します。
これもStringクラスのReplace関数ですぐに処理できます。



string path; //お気に入りフォルダパス
string line;
string url;
//ショートカットファイルの有無を確認
if (File.Exists(path))
{
StreamReader reader = new StreamReader(path,Encoding.Default);
while (!reader.EndOfStream)
{
line = reader.ReadLine();
if (line.IndexOf("URL=") == 0)
{
url = line.Replace("URL=","");
}
}
reader.Close();
}


上記のurl変数に、ショートカットファイルに登録されたURLが入っています。
後はこのURLを、TreeViewなりComboBoxなり好きなフォームに入れて処理させましょう。
私はTreeViewで処理させましたが…詳細は省きます。





サンプルコードとして、今回書いた独自のBookmarkTreeクラスは下記に記しておきます。
…あまり上手なコードではないので参考までに…
このままだとお気に入りを追加してもすぐに表示が反映されない問題がありますが悪しからず。
下記のコードの通りTreeViewを継承して作成しています。
なお、MyTabBrowserクラスは独自のタブブラウザクラスですが、ここの詳細は省略します。…希望があれば載せますが。




///////////////
//IE Bookmark//
///////////////
public class BookmarkTree : TreeView
{
MyTabBrowser tabBrowser;
string bookmarkFolderPath;
public BookmarkTree(MyTabBrowser tabs)
{
tabBrowser = tabs;

TreeNode node;
int fldrNo = 0;

//IEお気に入り取得
bookmarkFolderPath
= Environment.GetFolderPath(Environment.SpecialFolder.Favorites);

//IEお気に入り配置
foreach
(string rowStr in Directory.GetDirectories(bookmarkFolderPath))
{
node = this.Nodes.Add(fileName(rowStr));
fldrNo = SetChildFavorites(node, rowStr, fldrNo);
}
foreach
(string rowStr in Directory.GetFiles(bookmarkFolderPath, "*.url"))
{

this.Nodes.Add(newTreeNode(rowStr));
}
//イベント設定
this.AfterSelect += new TreeViewEventHandler(BookmarkTree_AfterSelect);
}

private int SetChildFavorites(TreeNode node, string path, int nodeNo)
{
TreeNode cNode;
//フォルダ内にリンク追加
foreach (string rowStr in Directory.GetDirectories(path))
{
cNode = node.Nodes.Add(fileName(rowStr));

nodeNo = SetChildFavorites(cNode, rowStr, nodeNo);
}
foreach (string rowStr in Directory.GetFiles(path, "*.url"))
{
node.Nodes.Add(newTreeNode(rowStr));
}
return nodeNo;
}

private TreeNode newTreeNode(string path)
{
string name = fileName(path);
TreeNode treeNode = new TreeNode(name);
return treeNode;
}
//パスからフォルダ名・ファイル名を取得
private string fileName(string filePath)
{
string name;
//パスを¥で区切り最終要素を返す
string[] fileNameArray = filePath.Split('¥¥');
name = fileNameArray[fileNameArray.Length - 1];
name = name.Replace(".url","");
return name;
}

//ノードが選択されたら
private void BookmarkTree_AfterSelect(object sender, TreeViewEventArgs e)
{
TreeView tree = (TreeView)sender;
TreeNode node = (TreeNode)e.Node;
string nodeStr = node.FullPath;

//WEBページを開く
openPage(bookmarkFolderPath + "¥¥" + nodeStr + ".url");
}
private void openPage(string path)
{
string line;
string url;
//ショートカットファイルの有無を確認
if (File.Exists(path))
{
StreamReader reader = new StreamReader(path,Encoding.Default);
while (!reader.EndOfStream)
{
line = reader.ReadLine();
if (line.IndexOf("URL=") == 0)
{
url = line.Replace("URL=","");
tabBrowser.AddNewTabPage(new Uri(url));
}
}
reader.Close();
}
}


これで一応私の環境では動きました。
お気に入り追加の問題は、力不足でまだ改善できませんが、時間があれば調べたいと思います。
お気に入りに追加された時のイベントが見つからないので、自分でイベント作るしかないのか…
私の実力ではちょっとキツイかもです…(汗



コメント
デスクトップのパスですが、下記の方法を行うと取得できなくなるようです。ヌル文字列戻ってきます。

エクスプローラ上で、
C:\Documents and Settings\[ユーザー名]\デスクトップ
のフォルダをDドライブに
右クリックでドラッグ&ドロップし[ここに移動する]を選択する。
  • 通りすがり
  • 2008/07/08 11:21 AM
デスクトップフォルダを別の場所に移動した後から取得できなくなったということでしょうか?

おそらくですが…NULLが返ってくるのはC#や.NET以前にWindowsが記憶している場所にフォルダが見つからないためだと思います。

確か、Documents and Settings内のフォルダは、基本的にドラッグ&ドロップで移動しただけでは参照ができなかったと思います。
うろ覚えですが「マイドキュメント」や「デスクトップ」のプロパティ…
もしくはレジストリの設定を変更する必要があるかと思います。
それで駄目なら、フォルダの場所を元に戻しても取得はできないでしょうか?

Documents and Settingsということなので恐らくXP以前のものをお使いかと思いますが、私はVistaを使っているのでちょっと動作の確認ができません…
ご自身で確認していただけますでしょうか?

申し訳ありませんがよろしくお願いします。
  • 謎猫
  • 2008/07/09 1:34 AM
谿コ縺励※縺紜縺ァ√◆縺。
すみません。
このソースでは「取得したパス」を「TreeView」で表示し「新規タブ」で開くのでしょうか?
レベルが低い質問で本当に申し訳ありません。
  • Axolotl
  • 2009/05/19 10:25 PM
>Axolotlさん
申し訳ありません。お返事が遅くなりました!

このソースの内容は仰るとおり
[「取得したパス」を「TreeView」で表示し「新規タブ」で開く]処理になります。

もうちょっと詳しく書くと
 .屮奪マークフォルダパスを取得
 ▲侫ルダ内のURLファイル名をTreeViewに設置
 TreeViewにAfterSelect(選択後)イベントを追加
 
 AfterSelectイベントが来たら選択ノードのURLファイルからサイトのURLを取得
 ゼ萋世靴URLをtabBrowserに送る
 新規タブ内のブラウザでURLからサイトを表示する

といった感じでしょうか?
久々に見たソースなのでちょっと違うかもしれませんが…

ちなみに最後の新規タブを開くという処理の
 tabBrowser.AddNewTabPage(new Uri(url));
のtabBrowserはMyTabBrowserという自作のタブブラウザクラスのオブジェクトです。
まぁ単純にTabPageの各ページ内にブラウザが入ってるだけのものですので
TabPageの新規タブ追加処理さえわかれば簡単に作れるかと思います。

必要であればMyTabBrowserクラスも公開します。
たいした物ではないんですけどね…
  • 謎猫
  • 2009/05/22 11:03 PM
ありがとうございます。
C#をはじめてから1か月もたっていないので、少々無理がありますがお願いします。
具体的にお願いしたいのですが、これらのソースを組み立てる上での手順を教えていただけますでしょうか?
でなくてもTreeViewにURLファイルを設置する手順を教えていただければと…。
こんな超初心者が質問できるような場所ではないのですけれども、本当に努力に努力を重ね、さらに時間をかけてもわからなかったので。
よろしくお願いします。
  • Axolotl
  • 2009/05/25 4:45 PM
>Axolotl
了解です。
仕事もあって、すぐには記事には書けませんが、
今週の土日にはここの記事としてアップできるようにしたいと思います。
申し訳ありませんが、お待ちください。

ところでC#は始められたばかりみたいですけど、どの程度までわかるのでしょうか?
書籍等は読まれたりしましたか?
今回のソース等は結局それらの組み合わせに過ぎないものですので、
基礎的な操作がわかれば何とかなるところも結構ありますよ。

記事に書くまでの間、
TreeViewクラスの操作方法やファイルの読み書き方法くらいは予習しておいてくださいね。
  • 謎猫
  • 2009/05/26 2:36 AM
管理者の承認待ちコメントです。
  • -
  • 2014/04/28 6:09 PM
コメントする








    
この記事のトラックバックURL
トラックバック