我想为用户保存一些文件名(例如最近的文件)。
让我们使用六个示例文件:
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
- x1米15英寸
另请注意,在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
parent 和路径的尾部,例如:
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";
}
2条答案
按热度按时间bttbmeg01#
我想您可以找出CSIDL如何Map到路径(使用类似SHGetKnownFolderPath的方法),为它们建立一个反向字典,然后检查要存储的路径的开头是否与字典中的任何键匹配,然后删除开头并存储匹配的CSIDL。
不是公开的优雅,但它应该得到的工作完成。
guicsvcw2#
然后还有一个功能,可以“扩展”特殊环境关键字:
其展开:
进入
它通过在字符串的开头查找%xx%并展开它来实现。