如何在 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.GetAttributesFile.SetAttributes 方法(。

这些实验都没有导致属性 X 显示在"属性"-"详细信息">中。所以,我不知道如何处理它,特别是因为我仍然不知道属性 X 是什么意思。

那么,什么是属性X以及如何在C#中的选定文件上设置/清除它?

如何在 C# 中对文件设置清除属性“X”

也许我错了,但是...我认为 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 属性(