如何在 C# 中对文件设置清除属性“X”
本文关键字:属性 清除 设置 文件 | 更新日期: 2023-09-27 18:18:51
我的 USB 可移动存储(FAT 文件系统(上有一个隐藏文件。
我正在使用Windows 7。如果我转到此文件的"属性"窗口,然后转到"详细信息"选项卡,我将看到该文件的属性HX
。当我运行cmd
并使用attrib
时,我被告知该文件具有属性H。没有关于 X 的事情。我已经尝试了help attrib
,但仍然没有关于属性 X 的信息。
我知道那件事:
- H = 隐藏
- S = 系统
- A = 存档
- R = 只读
但是,我不知道X代表什么。我还找到了 N 和 E 属性的用途。
维基百科没有提到X属性是什么。
谷歌发现了两个提到属性X的主题:
- 德尔福中不可删除的文件
- x 的文件属性。
- "更好的归因">
这些都无济于事。
我希望能够在 C# 中读取/写入此标志,但到目前为止,我阅读了FileAttributes
枚举的文档,并尝试在文件上设置一些列出的属性(使用 File.GetAttributes
和 File.SetAttributes
方法(。
这些实验都没有导致属性 X 显示在"属性"-"详细信息">中。所以,我不知道如何处理它,特别是因为我仍然不知道属性 X 是什么意思。
那么,什么是属性X以及如何在C#中的选定文件上设置/清除它?
也许我错了,但是...我认为 X 属性意味着文件具有扩展属性。遗憾的是,无法使用 C# 修改扩展属性。
文件属性X
对应于整数值为 64
(0x40( 的 System.IO.FileAttributes.Device
使用 .NET 不能直接设置此值。问题是当你调用File.SetAttributes(path, fileAttributes)
时,它会调用Mscorlib.dll
中的内部dll导入函数,即静态方法Microsoft.Win32.Win32Native.SetFileAttributes
,这是kernel32.dll
的直接dll导入,定义为:
// Microsoft.Win32.Win32Native
[DllImport("kernel32.dll", BestFitMapping = false, CharSet = CharSet.Auto, SetLastError = true)]
internal static extern bool SetFileAttributes(string name, int attr);
简而言之,即使使用kernel32.dll
也无法设置此值。请参阅:SetFileAttributes和System.IO.FileAttributes。
但是,您可以编写代码,有效地执行与设置或删除此属性相同的操作。
当您需要将文件设置为具有X
重命名现有文件时,最好且可能是唯一(合理(的答案是保留具有X
权限的模板文件,复制模板X
文件,然后写入其他属性。
要删除X
权限,您应该读取文件并写入新文件,然后使用对File.SetAttributes(path, File.GetAttributes(oldPath));
的简单调用(不会设置X
权限(复制该权限。
这种方法非常简单,在本机 .NET 中是完全可能的(与在磁盘级别进行黑客攻击或调用 cgywin 相比,实际上看起来也不会太讨厌 - 如果这甚至有效的话(。
不幸的是,Windows API 将阻止您设置/取消设置FILE_ATTRIBUTE_DEVICE,因为它不是在文件上设置的。如果您确实需要执行此操作的能力,则必须直接访问磁盘。我真的不建议尝试在 C# 中执行此操作。
最快的实现可能是忘记在Windows中执行此操作,下载mtools的源代码并对mattrib源代码进行一些编辑以使其正常工作。
例如添加到msdos.h:
#define ATTR_DEVICE 0x40
#define IS_DEVICE(entry) (HAS_BIT((entry),ATTR_DEVICE))
然后将代码添加到 mattr.c,以便您可以设置属性并验证更改:
static int view_attrib(direntry_t *entry, MainParam_t *mp)
{
...
/* Add this if block */
if(IS_DEVICE(entry))
putchar('X');
...
}
static int concise_view_attrib(direntry_t *entry, MainParam_t *mp)
{
...
/* Add the following if block */
if(IS_DEVICE(entry))
putchar('X');
...
}
static int letterToCode(int letter)
{
switch (toupper(letter)) {
...
/* Add the following case */
case 'X':
return ATTR_DEVICE;
...
}
}
然后,您只需要在mtools上设置驱动器,并在要更改的文件上调用新创建的mattrib -x命令即可。
X 很可能是执行权限。 icalcs
提到了它,您可以使用 C# 中的此命令来设置文件属性,尽管我不确定它是否适用于 FAT 文件系统。
我无法重现您的问题,但作为删除该属性的解决方法,我认为您可以尝试使用 robocopy:
robocopy xattributefile copyoffile /copy:DT
/copy:DT
:指定要复制的文件属性。
这不应该复制属性,但我不知道它是否适用于 X 属性(