创建一个可以修改但不可以删除的文件夹或文件

一、首先了解一下删除相关的权限。

标准权限里“修改”权限与“写入”权限的区别:
如果对一个文件仅拥有修改权限,那么,不仅可以对该文件数据进行写入和附加,而且还可以创建新文件或删除现有文件。而如果对一个文件仅拥有写入权限,那么既可以对文件数据进行写入和附加,也可以创建新文件,但是不能删除文件。
也就是说,写入权限不具有删除权限,但拥有修改权限,就等同于拥有删除和写入权限。
特殊权限里的删除权限:
删除子文件夹及文件(Delete Subfolders and Files):允许用户删除此文件夹内的子文件夹与文件,即使用户对此子文件夹或文件没有删除的权限也可以将其删除。
删除(Delete):允许用户删除此文件夹或文件。注意:用户对此文件夹或文件就算是没有删除的权限,但是只要他对父文件夹具备删除子文件夹及文件的权限,则他还是可以将此文件夹或文件删除。
需要注意:文件或文件夹默认的“修改”权限都包含了特殊权限“删除”,表示可以删除自身;文件夹默认的“修改”权限不包含特殊权限“删除子文件夹及文件”,子文件夹及文件能否删除需要看子文件夹及文件本身是否允许删除。
显式指定给对象的权限优先于对象继承的权限,即指定的修改(M)大于继承的拒绝删除、指定的拒绝删除大于继承的修改(M)。
系统的标准修改(M)权限包含了删除子权限,包含修改(M)即可删除,但可以自定义实现我们通常理解的可修改不可删除。

二、怎样创建一个可以修改不可以删除的文件夹或文件呢?按如下方法设置:

123是父文件夹,这一步的目的是移除管理员的所有权限、去除父文件夹的“删除”权限。

 

现在目录456和文件789.txt即便是管理员也无法直接删除,由于它们都在123目录内,所以123目录本身也无法再被删除。

如果想要删除时怎么办,修改目录或文件的权限,删除“拒绝删除”权限即可。

windows目录和文件权限实测总结  针对当前登录用户(可能具有管理员身份):

注:

子对象(即子目录或文件)和父目录权限如不一致,表示是手动修改或添加的,如一致,可以是直接继承的。
父目录如无写入权限则无法在目录内创建任何对象,从回收站还原相当于创建文件。
如果具有容器(即父目录)的删除子文件夹及文件权限,即使没有容器内子对象的权限,甚至子对象自身有拒绝删除的权限,也仍然能够删除子对象。
在容器(即父目录)设置拒绝删除子文件夹及文件权限,没有任何作用,能否删除和重命名取决于子对象自身的权限设置。
系统管理员账户Administrators默认具有完全控制权限(包含了删除子文件夹及文件权限),右键删除会自动提权并删除,按Del键会询问你是否用管理员权限继续删除。
如果子对象不可删除,则会连带其父目录也无法删除,但父目录重命名不受影响。
用户有管理员身份时,子对象单独拒绝删除不起作用,但子目录的子对象即孙对象如去除删除权限或添加拒绝删除,则能达到拒绝删除的目的。
对象如无删除权限则右键菜单“删除”前出现UAC盾牌图标,具体能否删除还需要看父目录是否有删除子对象权限和该对象的子对象是否有删除权限。
对象如无写入权限则右键菜单“重命名”前出现UAC盾牌图标,具体能否重命名还需要看父目录是否有删除子对象权限或父目录是否有写入权限且该对象是否有删除权限。
注意:此处所指的权限是指计算该对象所有继承的与显式设置的允许权限和拒绝权限后得到的权限。
写入权限包括创建文件/写入数据、创建文件夹/附加数据、写入属性、写入扩展属性四项明细权限。
似乎重命名只需要对象自身具有写入权限,但实测发现对象自身只有写入权限无法成功重命名,必须有删除权限才行(修改包含了删除),并且父目录也要具有写入权限。

另外,C#里面文件的Name属性是只读的,没有对应cmd的rename命令的方法,只有一个MoveTo方法可以实现重命名(MoveTo含义就是用新名字复制一份到新位置然后删除旧文件),而其他权限设置选项全部都有对应的方法和参数。

 

posted @ 2020-11-21 16:11  黑衫老腰  阅读(2101)  评论(2编辑  收藏  举报