ユーザーのいくつかのファイル名を保持したい (最近のファイルなど)。
6 つのサンプル ファイルを使用してみましょう。
c:\Documents & Settings\Ian\My Documents\Budget.xls
c:\Documents & Settings\Ian\My Documents\My Pictures\Daughter's Winning Goal.jpg
c:\Documents & Settings\Ian\Application Data\uTorrent
c:\Documents & Settings\All Users\Application Data\Consonto\SpellcheckDictionary.dat
c:\Develop\readme.txt
c:\Program Files\Adobe\Reader\WhatsNew.txt
私は今、特別なフォルダへのパスをハードコーディングしています。ユーザーがフォルダーをリダイレクトしたり、別のコンピューターにローミングしたり、オペレーティング システムをアップグレードしたりすると、パスが壊れます。
私は良い開発者になりたいと思っており、これらのハードコードされた絶対パスを適切な特別なフォルダーからの相対パスに変換します:
%CSIDL_Personal%\Budget.xls
%CSIDL_MyPictures%\Daughter's Winning Goal.jpg
%CSIDL_AppData%\uTorrent
%CSIDL_Common_AppData%\Consonto\SpellcheckDictionary.dat
c:\Develop\readme.txt
%CSIDL_Program_Files%\Adobe\Reader\WhatsNew.txt
問題は、同じファイルに対して複数の表現が存在する可能性があるという事実に伴います。たとえば、次のようになります。
c:\Documents & Settings\Ian\My Documents\My Pictures\Daughter's Winning Goal.jpg
%CSIDL_Profile%\My Documents\My Pictures\Daughter's Winning Goal.jpg
%CSIDL_Personal%\My Pictures\Daughter's Winning Goal.jpg
%CSIDL_MyPictures%\Daughter's Winning Goal.jpg
Windows XP では、マイ ピクチャは次の場所に保存されること にも注意してくださいMy Documents
。
%CSIDL_Profile%\My Documents
%CSIDL_Profile%\My Documents\My Pictures
しかし、Vista/7 ではこれらは別のものです。
%CSIDL_Profile%\Documents
%CSIDL_Profile%\Pictures
注:構文
%CSIDL_xxx%\filename.ext
が無効であることは認識しています。Windows はこれらのキーワードを環境文字列のように展開しません。私はこの質問をする方法としてのみ使用しています。CSIDL
内部的には、おそらく親 とパスの末尾として、明らかにアイテムを別の方法で保存します。CSIDL_Personal \Budget.xls CSIDL_MyPictures \Daughter's Winning Goal.jpg CSIDL_AppData \uTorrent CSIDL_Common_AppData \Consonto\SpellcheckDictionary.dat -1 c:\Develop\readme.txt (-1, since 0 is a valid csidl) CSIDL_Program_Files \Adobe\Reader\WhatsNew.txt
問題は、正規の特別なフォルダーへの相対パスを可能な限りどのように使用するかということです。
考えている:
void CanonicalizeSpecialPath(String path, ref CSLID cslid, ref String relativePath)
{
return "todo";
}
こちらもご覧ください
- MSDN: CSIDL 列挙
- New Old Thing:ローミング ユーザー プロファイルに注意してください
- New Old Thing:リダイレクトされたフォルダーにも注意
- MSDN: PathCanonicalize 関数