如何为Windows资源管理器添加自定义的tag 属性?

如何为Windows资源管理器添加自定义的tag/属性/列?

系统是win11 专业版 22h2

Windows资源管理器里,可以查看项目的名称、大小、日期、作者、标记以及其他各种属性,还可以按照这些列进行排序、分组,但这些属性都是win预先给定的,只能选择哪些显示哪些不显示,而且对于特定类型的项目来说可用的属性是有限的(比如对于文件夹来说,除了名称、几个日期值,和备注,就几乎没有可用的了)。我想知道,有没有方法能够实现,自己添加一个属性,并且在Windows资源管理器中查看、排序、分组?如果不行的话,是否有类似的第三方软件?

我做了一张示意图

img

研究一下windows shell

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/727023
  • 除此之外, 这篇博客: windows任务管理器中的工作设置内存,内存专用工作集,提交大小详解中的 windows任务管理器中的工作设置内存,内存专用工作集,提交大小详解 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 虽然是中文字,但是理解起来还是很困难,什么叫工作设置内存,什么叫内存专用工作集,什么叫提交大小,区别是什么,让人看了一头雾水.

     

    通俗的讲工作设置内存是程序占用的物理内存(包含与其他程序共享的一部分), 内存专用工作集是程序独占的物理内存, 提交大小是程序独占的内存(包含物理内存和在页面文件中的内存).

    注:页面文件就是存放不在物理内存中的内存,文件路径一般在C:\pagefile.sys,目的是为了能够让更多的进程运行,即使合起来所占用的内存已经超过物理内存. 只要将其中一部分内存转入页面文件, 物理内存就可以空出来继续运行新的进程.

    它们之间的关系:

    工作设置内存 = 内存专用工作集 + 与其他进程共享的物理内存.

    提交大小 = 内存专用工作集 + 保存在页面文件中的独占内存.

    (其中有些例外,有时候内存专用工作集可能会比提交大小大一点点,不过可以不用考虑)

     

    工作设置内存和内存专用工作集在程序不变化情况下会变化, 系统会考虑程序活动情况,物理内存剩余量等减少或增加物理内存.

    提交大小在程序不变化情况下不会变化,因为程序就是占用了那么多专用内存.

    如果要测试程序占用的内存大小,建议在程序加载完毕后记录提交大小.其他的会变化建议不要记录.

     

    还想要了解更清楚?好孩子.

    下面通过代码来详细了解.

    首先windows任务管理器已经不够用了,需要用Process explorer和VMMap工具.

    接下来解释一些名词:

    windows任务管理器中的称谓Process explorer中的称谓VMMap中的称谓
    工作设置内存Working setTotal WS
    内存专用工作集WS PrivatePrivate WS
    提交大小Private BytesPrivate
    无对应选项可显示Virtual SizeSize
    无对应选项可显示无对应选项可显示Committed

     

    名词说明:

    Virtual Size: 程序总的所使用的内存(包含共享,非共享,物理,页面,为程序保留的但未分配的内存)

    Committed: Virtual Size减去为程序保留的但未分配的内存

    为程序保留的但未分配的内存: 就是告诉系统我要一块内存,但暂时不用,不过分配的地址得给我,系统就给他一个不用的地址,但不分配内存,等程序申请要使用时,就从页面或物理内存中分配出来放在那个地址上.

     

    关于页面文件和物理内存如何转换稍微讲解一下,当程序要访问某个地址, 系统发现这个地址不在物理内存里,就会产生中断,然后去读取页面文件,把页面文件中与内存相关的数据拷贝到物理内存,然后标记一下这个地址已经在物理内存中了,然后继续让程序运行.

     

    现在来看个例子:

    程序main.exe定义了一个5M的全局变量,5M的常量,并申请了一个5M的内存,程序代码大小为2M.

     

    char g_str[5*1024*1024];

    const char STR[5*1024*1024];

    void main()

    {

    char *p = (char*) HeapAlloc(GetProcessHeap(), 0, 1024*1024*5);

    call_lib();

    }

     

    程序lib.dll定义了一个4M的全局变量,4M的常量,并申请了一个4M的内存,程序代码大小为1M.

     

    char g_str[4*1024*1024];

    const char STR[4*1024*1024];

    void call_lib()

    {

    char *p = (char*) HeapAlloc(GetProcessHeap(), 0, 1024*1024*4);

    }

    Main.exe程序调用了lib.dll

     

    先看main.exe总的占用的内存.

    Virtual Size = 5M的全局变量 + 5M的常量 + 5M的内存 + 2M的程序代码

    + 4M的全局变量 + 4M的常量 + 4M的内存 + 1M的程序代码

    = 30M.

     

    然后看main.exe独占的内存:

    Private Bytes = 5M的全局变量 + 5M的内存

    + 4M的常量 + 4M的内存

    =18M.

    由上可以看出独占指的是只能进程自己使用, 比如代码,常量等就是共享的.

    分配的内存,可变的全局或静态变量就是独占的.

     

    至于Working set和WS Private,因为其为变化量,所以无法计算其值.

     

    Working set物理内存变化规律:

    一般情况下在分配出来内存后,物理内存只分配4K左右,等访问到超过4K的时候,会慢慢加大物理内存,等到系统总的物理内存小于一定值后,又会将不在前台的进程的物理内存减少.

    如果进程想休息了, 可以调用SetProcessWorkingSetSize(GetCurrentProcess(), -1, -1);

    来将自己的一些内存从物理内存转移到页面文件.

     

    测试环境: Win7 32位