C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: [C#]Windows7のライブラリフォルダを開きたい


(過去ログ 94 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■56224 / inTopicNo.1)  [C#]Windows7のライブラリフォルダを開きたい
  
□投稿者/ くままま (1回)-(2011/01/05(Wed) 16:08:59)

分類:[C#] 

初めまして、よろしくお願い致します。
C#で、「ファイルを開く」ダイアログボックスでWindows7の「ライブラリ」フォルダをデフォルトフォルダとして開く方法を探しています。
ライブラリの本体のパス(C:\Users\[ユーザー名]\AppData\Roaming\Microsoft\Windows\Libraries)を指定すればライブラリと同等のフォルダを開くことができますが、開くダイアログの上部に出てくるパスの内容が変ってしまいます。
<上記の例の方法でライブラリ本体のパスを指定した場合のパス表示>
 C:\Users\[ユーザー名]\AppData\Roaming\Microsoft\Windows\Libraries
<エクスプローラなどで「ライブラリ」から開いた場合のパス表示>
 ライブラリ

後者のパス表示状態で「ファイルを開く」ダイアログが利用できないかと考えています。
また、ファイルの直接保存や読み込みについても(ライブラリ配下に対象ファイルがあるという前提で)ライブラリから見たパス指定の方法も探しています。
これらについてご存知の方がおられましたらご教示頂けませんでしょうか。よろしくお願い致します。
引用返信 編集キー/
■56225 / inTopicNo.2)  Re[1]: [C#]Windows7のライブラリフォルダを開きたい
□投稿者/ マサヤ (199回)-(2011/01/05(Wed) 17:47:38)
2011/01/05(Wed) 17:48:40 編集(投稿者)

OpenFileDialog ofd = new OpenFileDialog();
ofd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
マイドキュメントの開き方として。

>ライブラリから見たパス指定の方法も探しています。
とは相対パスのことではないでしょうか?

引用返信 編集キー/
■56226 / inTopicNo.3)  Re[2]: [C#]Windows7のライブラリフォルダを開きたい
□投稿者/ くままま (2回)-(2011/01/05(Wed) 18:58:00)
マサヤ さん、返信ありがとうございます。

> OpenFileDialog ofd = new OpenFileDialog();
> ofd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
> マイドキュメントの開き方として。

ご教示頂きましたこの方法だと開くパスが「ライブラリ\ドキュメント」となり理想に近いです。その一つ上の階層の「ライブラリ」を開く際の指定方法を探しています。SpecialFolderのメンバには「ライブラリ」はないようです。



> >ライブラリから見たパス指定の方法も探しています。
> とは相対パスのことではないでしょうか?

開いたファイルのパスを表示する欄を作り、ライブラリ配下のファイルを開いた場合はパス表示を「ライブラリ\〜〜〜」と表示したいと考えています。
例:ライブラリ\ドキュメント\hoge.txt を開いた際は、「ライブラリ\ドキュメント\hoge.txt」と表示する。(OpenFileDialogから開くと、hoge.txtのパス情報はC:\Users\[ユーザー名]\Documents\hoge.txt となっているので、それをライブラリ\ドキュメント\hoge.txt に変換したい)
ライブラリの配下がデフォルトのままなら直パスをむりやり変換すれば対応できそうですが、各ライブラリの参照フォルダが追加された際の対応ができません。そういった意味で、「ライブラリから見たパス」の取得方法を探しています。

言葉足らずで申し訳ありません。
引用返信 編集キー/
■56229 / inTopicNo.4)  Re[3]: [C#]Windows7のライブラリフォルダを開きたい
□投稿者/ Azulean (670回)-(2011/01/05(Wed) 23:13:12)
No56226 (くままま さん) に返信
> SpecialFolderのメンバには「ライブラリ」はないようです。

.NET Framework の BCL が作られたときには Windows 7 がないので、存在しません。
これと同等の機能を提供する後継の API は SHGetKnownFolderPath ですが、これを利用しても "C:\Users\(ユーザ名)\AppData\Roaming\Microsoft\Windows\Libraries" というパスしか得られないので、お望みのことは実現できません。
物理パスを渡す方法では無理じゃないかと考えています。


> そういった意味で、「ライブラリから見たパス」の取得方法を探しています。

仮想フォルダの見た目のままということなら、物理パスベースの OpenFileDialog/SaveFileDialog だと無理じゃないでしょうか。
IFileDialog など、IShellItem を扱えるインターフェースを使わないといけないかもしれません。
ただし、標準でそれらをラップした .NET Framework のクラスはないので、自分でラップするクラスを書くか、Windows API Code Pack を使うことになるとみられます。(対応するクラスが存在するか、実現可能かは未調査)
引用返信 編集キー/
■56230 / inTopicNo.5)  Re[3]: [C#]Windows7のライブラリフォルダを開きたい
□投稿者/ よねKEN (655回)-(2011/01/05(Wed) 23:20:29)
Windows7 Ultimate x64、VC#2010で確認しました。

openFileDialog1.InitialDirectory = "shell:Libraries";

でライブラリフォルダを開けました。

以下のサイトを参考にしました。
Shell コマンドで開く特殊フォルダー一覧(Windows 7)
http://pasofaq.jp/windows/mycomputer/shellfolder7.htm

--
.NET Framework4時点でEnvironment.SpecialFolderには"ライブラリ"の取得のための定義がないので、
Environment.GetFolderPathでは取得できないのではないでしょうか。
Windows APIで言うと以下の辺りが該当する機能になりますが、こちら方面での実現方法は未検証です。

SHGetFolderPath Function
http://msdn.microsoft.com/en-us/library/bb762181.aspx

SHGetKnownFolderPath Function
http://msdn.microsoft.com/en-us/library/ms647783.aspx
引用返信 編集キー/
■56231 / inTopicNo.6)  Re[4]: [C#]Windows7のライブラリフォルダを開きたい
□投稿者/ Azulean (671回)-(2011/01/06(Thu) 00:07:22)
No56230 (よねKEN さん) に返信
> Windows7 Ultimate x64、VC#2010で確認しました。
>
> openFileDialog1.InitialDirectory = "shell:Libraries";
>
> でライブラリフォルダを開けました。

そんなに簡単に。orz

-----
Windows API Code Pack で少し遊んでみました。
なじんでないので仮想パスを取るアプローチがナンセンスかもしれませんが…。
ご興味があればどうぞ。

http://azulea.wordpress.com/2011/01/06/windows-api-code-pack-for-net-framework%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%82%b3%e3%83%a2%e3%83%b3%e3%83%80%e3%82%a4%e3%82%a2%e3%83%ad%e3%82%b0%e3%82%92%e5%87%ba%e3%81%97%e3%81%a6%e3%81%bf/
引用返信 編集キー/
■56233 / inTopicNo.7)  Re[4]: [C#]Windows7のライブラリフォルダを開きたい
□投稿者/ マサヤ (200回)-(2011/01/06(Thu) 09:25:46)
No56230 (よねKEN さん) に返信
> Windows7 Ultimate x64、VC#2010で確認しました。
>
> openFileDialog1.InitialDirectory = "shell:Libraries";
>
> でライブラリフォルダを開けました。
よねKENさん、すごい orz

>開いたファイルのパスを表示する欄を作り、ライブラリ配下のファイルを開いた場合はパス表示を「ライブラリ\〜〜〜」と表示したいと考えています。
OpenFileDialog.FileNameで取得したパスをReplaceしたらいいのではないでしょうか?
string fullPath = ofd.FileName;
string originalPath = fullPath.Replace("ライブラリの本体のパス(C:\Users\[ユーザー名]\AppData\Roaming\Microsoft\Windows\Libraries)","ライブラリ");
引用返信 編集キー/
■56235 / inTopicNo.8)  Re[5]: [C#]Windows7のライブラリフォルダを開きたい
□投稿者/ よねKEN (656回)-(2011/01/06(Thu) 10:04:16)
No56233 (マサヤ さん) に返信
> ■No56230 (よねKEN さん) に返信
>>Windows7 Ultimate x64、VC#2010で確認しました。
> >
>>openFileDialog1.InitialDirectory = "shell:Libraries";
> >
>>でライブラリフォルダを開けました。
> よねKENさん、すごい orz

自分で提示した方法ですが、実はそもそもShellコマンドが何者かよくわかってません(汗
行けそうな気がしたのでやってみたら動いたとい状況です。

探しているのですが、MSDNでの根拠となる情報が見つけられないんですよね。
("Shellコマンド"が何者かという説明と、OpenFileDialogの内部実装と推測されるGetOpenFileName関数で
パスの指定にShellコマンドを使えるのが仕様なのかどうかetc)

MS情報以外だととりあえずWin2000時点で既にShellコマンドというものがあるっぽいこと、
shell:LibrariesはVistaで追加されたもの、ってところの情報はありました。

とりあえず、OS判定を入れてVista以降と以前とで区別して処理する必要がありますね。
(XP以前も対象とするなら)

引用返信 編集キー/
■56236 / inTopicNo.9)  Re[6]: [C#]Windows7のライブラリフォルダを開きたい
□投稿者/ 魔界の仮面弁士 (2011回)-(2011/01/06(Thu) 11:29:35)
2011/01/06(Thu) 12:37:25 編集(投稿者)

No56235 (よねKEN さん) に返信
> "Shellコマンド"が何者かという説明と、
コマンドという表現ではありませんが、Shell プロトコル(Shell: protocol) という
表現であれば時折見かけます。
http://technet.microsoft.com/ja-jp/library/cc737488.aspx
http://technet.microsoft.com/en-us/library/cc737488.aspx

今回の話題とは関係ありませんが、この他、local: プロトコルとか ms-help: プロトコルとか
view-source: プロトコルといった物が知られています(自作プロトコルの登録も可能です)。
http://msdn.microsoft.com/en-us/library/aa767739.aspx
http://msdn.microsoft.com/en-us/library/bb164608.aspx
http://msdn.microsoft.com/en-us/library/aa767914.aspx


> MS情報以外だととりあえずWin2000時点で既にShellコマンドというものがあるっぽいこと、
Vista / 7 機以前の OS として、手元の
 Win2000(SP無) + IE6(SP1)
 WinXP(SP3) + IE8
の環境で確認したところ、いずれもレジストリに Shell プロトコルが登録されており、
実際に「Shell:Desktop」や「Shell:SendTo」や「Shell:RecycleBinFolder」が使えました。

当然ながら、「Shell:Libraries」は 2000/XP 共に駄目でした。
「Shell:CommonVideo」だと、2000 では動作しませんでしたが、
上記 XP では稼働しました。(もしかしたら初期版の XP だと認識しないかも?)


> shell:LibrariesはVistaで追加されたもの、ってところの情報はありました。
"Shell:SendTo"、"Shell:Desktop"、"Shell:Favorites" 等は Vista 以前でも使えますね。
System.Windows.Forms.OpenFileDialog クラスの他、Microsoft.Win32.OpenFileDialog クラスでも使えたはず。

その他、9x 時代からの
 "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}"
 "::{645FF040-5081-101B-9F08-00AA002F954E}"
 "::{208D2C60-3AEA-1069-A2D7-08002B30309D}"
といった表現もあります。Vista 以降で使えるかどうかは未確認ですが。

ついでに XP + VB6 でも検証してみましたが、CommonDialog コントロールでは、
 CommonDialog1.InitDir = "::{645FF040-5081-101B-9F08-00AA002F954E}"
で仮想フォルダ「ごみ箱」を指定できましたが、
 CommonDialog1.InitDir = "Shell:RecycleBinFolder"
には反応しませんでした(C# の OpenFileDialog 経由と同じ結果です)。

しかし、VB6 の "Microsoft Dialog Automation Objets" 経由であれば
 cf.Directory = "::{645FF040-5081-101B-9F08-00AA002F954E}"
 cf.Directory = "Shell:RecycleBinFolder"
のいずれも使えるようです。

とは言え、"::{645FF040-5081-101B-9F08-00AA002F954E}" の場合は、
仮想フォルダとしての「ごみ箱」が指定されたのに対して、"Shell:RecycleBinFolder" については
物理フォルダとしての「C:\RECYCLER\S-1-5-21-……\」が選択されたという違いがあります。

# Vista や 7 の場合は、また違った結果になりそうな予感。
引用返信 編集キー/
■56276 / inTopicNo.10)  Re[7]: [C#]Windows7のライブラリフォルダを開きたい
□投稿者/ くままま (3回)-(2011/01/07(Fri) 13:14:03)
返信が遅れて申し訳ありません。
Azuleanさん、よねKENさん、マサヤさん、魔界の仮面弁士さん、ご返信ありがとうございます。


> openFileDialog1.InitialDirectory = "shell:Libraries";
> でライブラリフォルダを開けました。

さんざん悩んだお題でしたが、まさかこんな指定方法があったとは…。
方々探し回ったつもりであったものの、まだまだ甘いようです。

「ライブラリからのパス」につきましては、Azuleanさんのご提示頂いた方法を参考にしたいと思います。
本件は解決済みとさせて頂きたいと思います。皆様誠にありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -