24

我的 USB 可移动存储(FAT 文件系统)上有一个隐藏文件。

我使用的是 Windows 7。如果我转到此文件的“属性”窗口,然后转到“详细信息”选项卡,我会看到该文件的属性为HX. 当我运行cmd和使用attrib时,我被告知该文件具有属性 H。没有关于 X。我已经尝试过help attrib,但仍然没有关于属性 X。

我知道:

  • H = 隐藏
  • S = 系统
  • A = 档案
  • R = 只读

但是,我不知道 X 代表什么。我还发现了N 和 E 属性的用途。

维基百科没有提到 X 属性是什么。

谷歌发现了两个提到属性 X 的主题:

这些都没有帮助。

我希望能够在 C# 中读/写这个标志,但到目前为止,我阅读了FileAttributes枚举文档并尝试在文件上设置一些列出的属性(使用File.GetAttributes&File.SetAttributes方法)。

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

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

4

5 回答 5

1

使用 .NET 的文件属性X对应System.IO.FileAttributes.Device的整数值为64(0x40),您无法直接设置此值。问题是当你调用File.SetAttributes(path, fileAttributes)它时调用了一个内部的dll导入函数Mscorlib.dll,即静态方法Microsoft.Win32.Win32Native.SetFileAttributes,这是一个直接的dll导入,kernel32.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您也无法设置此值。请参阅:SetFileAttributesSystem.IO.FileAttributes

但是,您可以编写代码来有效地执行与设置或删除此属性相同的操作。

您最好且可能唯一(合理)的答案是保留具有X权限的模板文件,当您需要设置文件以X重命名现有文件,复制模板X文件然后写入其他属性时。

要删除X权限,您应该读取文件并写入新文件,然后使用简单的调用复制权限File.SetAttributes(path, File.GetAttributes(oldPath));(不会设置X权限。

这种方法非常简单,并且在本机 .NET 中完全可以实现(与在磁盘级别进行黑客攻击或调用 cgywin 相比,实际上看起来也不会太讨厌 - 如果这甚至可以工作的话)。

于 2013-11-14T10:55:56.003 回答
1

也许我错了,但是......我认为 X 属性意味着文件具有扩展属性。不幸的是,不能使用 C# 修改扩展属性。

于 2011-12-23T18:32:44.813 回答
1

不幸的是,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 命令。

于 2012-10-21T02:51:29.567 回答
0

X 很可能是执行权限。icalcs提到它,您可以使用 C# 中的此命令设置文件属性,尽管我不确定它是否适用于 FAT 文件系统。

于 2011-12-23T18:48:01.033 回答
0

我无法重现您的问题,但作为删除该属性的解决方法,我认为您可以尝试使用robocopy

robocopy xattributefile copyoffile /copy:DT

/copy:DT: 指定要复制的文件属性。

这不应该复制属性,但我不知道它是否适用于 X 属性)

于 2013-11-12T12:36:07.643 回答