简短版本
是否存在与用户的整个配置文件相对应的IShellItem?
或者给定所有已知的KNOWNFOLDER常量:
长版本
如果我想备份一个用户的整个配置文件,我当然会从
SHGetFolderPath(CSIDL_PROFILE): "C:\Users\Ian"
这是显而易见的。然后,该文件夹通常会包含:
C:\Users\Ian
╰── AppData
├── Local
├── LocalLow
╰── Roaming
其中一些其他文件夹已经作为它们自己的CSIDL常量存在
C:\Users\Ian CSIDL_Profile
╰── AppData
├── Local CSIDL_Local_AppData
├── LocalLow
╰── Roaming CSIDL_AppData
有时还会在 profile 文件夹中显示其他配置文件文件夹:
C:\Users\Ian CSIDL_Profile
├── Desktop CSIDL_DesktopDirectoy
├── Documents CSIDL_Personal
├── Pictures CSIDL_MyPictures
├── Music CSIDL_MyMusic
├── Video CSIDL_MyVideo
├── Favorites CSIDL_Favorites
╰── AppData
├── Local CSIDL_Local_AppData
├── LocalLow
╰── Roaming CSIDL_AppData
但这些文件夹不必在%USERPROFILE%下
Windows允许用户配置要移动到自定义位置的某些特殊文件夹:
这意味着某些文件夹实际上可以存在于"Profile“文件夹之外:
C:\Users\Ian CSIDL_Profile
╰── AppData
├── Local CSIDL_Local_AppData
╰── LocalLow
D:\Users\Ian
├── Desktop CSIDL_DesktopDirectoy
├── Documents CSIDL_Personal
├── Pictures CSIDL_MyPictures
├── Music CSIDL_MyMusic
├── Video CSIDL_MyVideo
├── Favorites CSIDL_Favorites
╰── AppData
╰── Roaming CSIDL_AppData
我不知道是否可以或不能通过UI、组策略或其他方式将CSIDL值移动到其他位置:
C:\Users\Ian CSIDL_Profile
╰── AppData
├── Local CSIDL_Local_AppData
│ ├── Microsoft\Windows\History CSIDL_HISTORY
│ ├── Microsoft\Windows\Temporary Internet Files CSIDL_INTERNET_CACHE
│ ╰── Microsoft\Windows\Burn\Burn1 CSIDL_CDBURN_AREA
╰── LocalLow
D:\Users\Ian
├── Desktop CSIDL_DesktopDirectoy
├── Documents CSIDL_Personal
├── Pictures CSIDL_MyPictures
├── Music CSIDL_MyMusic
├── Video CSIDL_MyVideo
├── Favorites CSIDL_Favorites
╰── AppData
╰── Roaming CSIDL_AppData
╰── Microsoft
╰── Windows
├── Recent CSIDL_RECENT
├── Send To CSIDL_SENDTO
├── Start Menu CSIDL_STARTMENU
│ ╰── Programs CSIDL_PROGRAMS
│ ├── Startup CSIDL_STARTUP
│ ├── Startup CSIDL_ALTSTARTUP
│ ╰── Administrative Tools CSIDL_ADMINTOOLS
├── Templates CSIDL_TEMPLATES
╰── Cookies CSIDL_TEMPLATES
我不想错过文件夹
有了所有这些CSIDL值,我可能会错过组成用户配置文件的一些文件夹。在我理想的幻想世界中,会有一个IShellItem,它将对应于用户配置文件中的所有内容。
同样,如果您查看This PC文件夹(CSIDL_DRIVES
) (称为),它是一个虚拟外壳文件夹,其中包含:
This PC
├── 3D Objects
├── Desktop
├── Documents
├── Downloads
├── Music
├── Pictures
╰── Videos
这很棒;它是一个虚拟文件夹,其中包含组成用户配置文件的文件夹(无论这些文件夹实际在哪里)。
不幸的是,这有两个缺点:
对于某些配置文件文件夹,它会丢失(例如,CSIDL_Favorites)
此PC├──3D Objects├──桌面├──Documents├──下载├──音乐├──图片├──视频├──OS (C:)├──Develop (D:)├──DVD RW驱动器(E:)├──BD ROM驱动器(F:)╰──本地磁盘(X:)
“因此,只需备份代表每个用户文件夹的所有 CSIDLs”
我想我可以简单地查看每个CSIDL,剔除作为另一个IShellItem的子级的任何IShellItem (todo:弄清楚如何做到这一点),然后只备份这些:
CSIDL_PROFILE C:\Users\ian
CSIDL_LOCAL_APPDATA C:\Users\ian\AppData\Local
CSIDL_APPDATA C:\Users\ian\AppData\Roaming
CSIDL_NETHOOD C:\Users\ian\AppData\Roaming\Microsoft\Windows\Network Shortcuts
CSIDL_PRINTHOOD C:\Users\ian\AppData\Roaming\Microsoft\Windows\Printer Shortcuts
CSIDL_DESKTOP D:\Users\ian\Desktop
CSIDL_DESKTOPDIRECTORY D:\Users\ian\Desktop
CSIDL_PERSONAL D:\Users\ian\Documents
CSIDL_MYPICTURES D:\Users\ian\Pictures
CSIDL_MYMUSIC D:\Users\ian\Music
CSIDL_MYVIDEO D:\Users\ian\Videos
CSIDL_FAVORITES D:\Users\ian\Favorites
CSIDL_COMMON_FAVORITES D:\Users\ian\Favorites
CSIDL_RECENT d:\Users\ian\AppData\Roaming\Microsoft\Windows\Recent
CSIDL_SENDTO d:\Users\ian\AppData\Roaming\Microsoft\Windows\SendTo
CSIDL_STARTMENU d:\Users\ian\AppData\Roaming\Microsoft\Windows\Start Menu
CSIDL_PROGRAMS d:\Users\ian\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
CSIDL_STARTUP d:\Users\ian\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
CSIDL_ALTSTARTUP d:\Users\ian\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
CSIDL_ADMINTOOLS d:\Users\ian\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Administrative Tools
CSIDL_TEMPLATES d:\Users\ian\AppData\Roaming\Microsoft\Windows\Templates
CSIDL_COOKIES d:\Users\ian\AppData\Roaming\Microsoft\Windows\Cookies
CSIDL_HISTORY d:\Users\ian\AppData\Local\Microsoft\Windows\History
CSIDL_INTERNET_CACHE d:\Users\ian\AppData\Local\Microsoft\Windows\Temporary Internet Files
CSIDL_CDBURN_AREA C:\Users\ian\AppData\Local\Microsoft\Windows\Burn\Burn1
问题在于CSIDL是不完整的(并且已被弃用)。例如:
没有适用于Downloads
的
好的,我会换成现代的KNOWNFOLDERS.
这样我会得到:
除非KnownFolders帮不上忙
我的枚举所有已知KNOWNFOLDER常量的方案失败了,原因有两个。
在我的应用程序编写之后创建的任何常量都将丢失-缺少备份用户配置文件数据。对于备份应用程序来说,这不是一个很好的工作。
但更重要的是,我不知道KNOWNFOLDERS是按用户的。例如:
应用程序是按用户的吗?文件夹没有文件系统路径并不意味着它不存在,或者我不能读取它,或者我不能枚举它的文件,或者我不能备份它的内容
当使用最新的(即Windows95) Shell API枚举文件和文件夹时,您可以很好地读取这些文件。
将您的手机通过USB连接到您的PC。您可以浏览这些文件,并使用IShellItem应用编程接口枚举它们-即使它们没有文件系统路径。
摘要
是否存在与用户配置文件相关的everything对应的外壳虚拟文件夹?
发布于 2019-04-24 06:40:31
我不认为包含所有用户特殊文件夹的文件夹是存在的,最接近的是FOLDERID_UsersFiles
文件夹,但我认为这与查看profile文件夹非常相似。
已知的文件夹可由第三方应用程序创建,请参阅IKnownFolderManager::RegisterFolder
尤其由向已知文件夹系统添加自己的文件夹的独立软件供应商(ISV)使用。
这意味着你永远不可能把所有的东西都列出来,不管是已经发明的还是其他的。
我可以想到3种可能的方法来处理这个问题,它们都涉及到使用IKnownFolderManager
枚举已安装的已知文件夹。
IKnownFolder::GetCategory
并查找KF_CATEGORY_PERUSER
文件夹。每个用户的文件夹是存储在每个用户的配置文件下且只有该用户可以访问的文件夹。
(我认为它们实际上是指默认情况下存储在用户配置文件中的文件夹。)
使用
IKnownFolder::GetFolderDefinition
查找父文件夹,遍历父级树,查看它是否以FOLDERID_Profile
.IKnownFolder::GetPath(KF_FLAG_DEFAULT_PATH,...)
结尾,并检查此路径是否在用户配置文件中。我认为没有理由选择这种方法。在大多数情况下,前两种方法应该给出相同的结果,但这取决于它们是如何注册的。理论上,每个用户的类别文件夹可以存在于profile文件夹之外,默认情况下,AFAIK和虚拟文件夹可能具有作为其父文件夹的profile文件夹。使用诸如Known Folders Browser或Known Folder Info之类的工具可能有助于可视化这些差异。
这不包括像FOLDERID_AppsFolder
这样的大多数虚拟文件夹,但我不确定是否应该备份虚拟文件夹。
显示计算机本地内容的虚拟文件夹很可能存储在用户配置文件中的某个位置(%AppData%?)或者在注册表中,并且您已经在备份这些文件夹。
显示来自远程机器(FTP,WebDAV,Gmail等)内容的虚拟文件夹可能不是你应该备份的东西,除非用户进行特殊确认/选择?
显示插入计算机的硬件内容的虚拟文件夹实际上不是用户配置文件IMHO的一部分。
即使你决定要备份虚拟文件夹,你要怎么做呢?您只是要存储PIDL吗?或者,您打算为每个项目请求一个IStream
并将其存储起来?PIDL格式可能只由特定IShellFolder
类知道,当您在备份程序中查看备份数据时没有该IStream
的实例时,理解IShellFolder
可能会有问题。您只能将数据恢复到具有该IShellFolder
类的计算机上,即使这样,它也可能不支持编写IStream
。
发布于 2019-04-24 03:56:35
是否有一个外壳虚拟文件夹,可以对应于与用户配置文件相关的所有内容?
AFAIK,不,没有。
https://stackoverflow.com/questions/55818146
复制相似问题