首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >哪些文件夹构成了用户的配置文件

哪些文件夹构成了用户的配置文件
EN

Stack Overflow用户
提问于 2019-04-24 03:27:46
回答 2查看 530关注 0票数 1

简短版本

是否存在与用户的整个配置文件相对应的IShellItem

或者给定所有已知的KNOWNFOLDER常量:

  • 有没有办法知道KNOWNFOLDER常量是否是用户配置文件的一部分?
  • 有没有办法枚举尚未发明的KNOWNFOLDER常量,所以我不会错过任何?

长版本

如果我想备份一个用户的整个配置文件,我当然会从

代码语言:javascript
复制
SHGetFolderPath(CSIDL_PROFILE): "C:\Users\Ian"

这是显而易见的。然后,该文件夹通常会包含:

代码语言:javascript
复制
C:\Users\Ian
╰── AppData
    ├── Local
    ├── LocalLow
    ╰── Roaming

其中一些其他文件夹已经作为它们自己的CSIDL常量存在

代码语言:javascript
复制
C:\Users\Ian          CSIDL_Profile
╰── AppData               
    ├── Local         CSIDL_Local_AppData 
    ├── LocalLow      
    ╰── Roaming       CSIDL_AppData 

有时还会在 profile 文件夹中显示其他配置文件文件夹:

代码语言:javascript
复制
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“文件夹之外:

代码语言:javascript
复制
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值移动到其他位置:

代码语言:javascript
复制
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) (称为),它是一个虚拟外壳文件夹,其中包含:

代码语言:javascript
复制
This PC
├── 3D Objects
├── Desktop
├── Documents
├── Downloads
├── Music
├── Pictures
╰── Videos

这很棒;它是一个虚拟文件夹,其中包含组成用户配置文件的文件夹(无论这些文件夹实际在哪里)。

不幸的是,这有两个缺点:

对于某些配置文件文件夹,它会丢失(例如,CSIDL_Favorites)

  • it会继续包含所有我的电脑 (nee PC))

此PC├──3D Objects├──桌面├──Documents├──下载├──音乐├──图片├──视频├──OS (C:)├──Develop (D:)├──DVD RW驱动器(E:)├──BD ROM驱动器(F:)╰──本地磁盘(X:)

“因此,只需备份代表每个用户文件夹的所有 CSIDLs”

我想我可以简单地查看每个CSIDL,剔除作为另一个IShellItem的子级的任何IShellItem (todo:弄清楚如何做到这一点),然后只备份这些:

代码语言:javascript
复制
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

  • there的CSIDL不适用于3D Objects

好的,我会换成现代的KNOWNFOLDERS.

这样我会得到:

  • FOLDERID_AccountPictures
  • FOLDERID_AppDataDesktop
  • FOLDERID_AppDataFavorites
  • FOLDERID_AppDataProgramData
  • FOLDERID_Objects3D
  • FOLDERID_OriginalImages
  • snip 34
  • FOLDERID_Ringtones

除非KnownFolders帮不上忙

我的枚举所有已知KNOWNFOLDER常量的方案失败了,原因有两个。

在我的应用程序编写之后创建的任何常量都将丢失-缺少备份用户配置文件数据。对于备份应用程序来说,这不是一个很好的工作。

但更重要的是,我不知道KNOWNFOLDERS是按用户的。例如:

    • GUID:GUID {1e87508d-89c2-42f0-8a7e-645a0f50ca58}
    • Display名称:虚拟类型:虚拟路径:不适用-虚拟GUID

应用程序是按用户的吗?文件夹没有文件系统路径并不意味着它不存在,或者我不能读取它,或者我不能枚举它的文件,或者我不能备份它的内容

当使用最新的(即Windows95) Shell API枚举文件和文件夹时,您可以很好地读取这些文件。

将您的手机通过USB连接到您的PC。您可以浏览这些文件,并使用IShellItem应用编程接口枚举它们-即使它们没有文件系统路径。

摘要

是否存在与用户配置文件相关的everything对应的外壳虚拟文件夹?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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 BrowserKnown Folder Info之类的工具可能有助于可视化这些差异。

这不包括像FOLDERID_AppsFolder这样的大多数虚拟文件夹,但我不确定是否应该备份虚拟文件夹。

显示计算机本地内容的虚拟文件夹很可能存储在用户配置文件中的某个位置(%AppData%?)或者在注册表中,并且您已经在备份这些文件夹。

显示来自远程机器(FTP,WebDAV,Gmail等)内容的虚拟文件夹可能不是你应该备份的东西,除非用户进行特殊确认/选择?

显示插入计算机的硬件内容的虚拟文件夹实际上不是用户配置文件IMHO的一部分。

即使你决定要备份虚拟文件夹,你要怎么做呢?您只是要存储PIDL吗?或者,您打算为每个项目请求一个IStream并将其存储起来?PIDL格式可能只由特定IShellFolder类知道,当您在备份程序中查看备份数据时没有该IStream的实例时,理解IShellFolder可能会有问题。您只能将数据恢复到具有该IShellFolder类的计算机上,即使这样,它也可能不支持编写IStream

票数 3
EN

Stack Overflow用户

发布于 2019-04-24 03:56:35

是否有一个外壳虚拟文件夹,可以对应于与用户配置文件相关的所有内容?

AFAIK,不,没有。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55818146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档