Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何设置“清除属性”;X";在C#中包含的文件上?_C#_File_Attributes_Explorer_File Attributes - Fatal编程技术网

如何设置“清除属性”;X";在C#中包含的文件上?

如何设置“清除属性”;X";在C#中包含的文件上?,c#,file,attributes,explorer,file-attributes,C#,File,Attributes,Explorer,File Attributes,我的USB可移动存储器(FAT文件系统)上有一个隐藏文件 我正在使用Windows7。如果我转到该文件的“属性”窗口,然后转到“详细信息”选项卡,我将看到该文件的属性是HX。当我运行cmd并使用attrib时,我被告知该文件具有属性H。与X无关。我尝试了帮助attrib,但仍然与属性X无关 我知道: H=隐藏 S=系统 A=存档 R=只读 然而,我不知道X代表什么。我也找到了这些东西的用途 没有提到X属性是什么 谷歌发现了两个提到属性X的主题: 这些都没有帮助 我希望能够在C#中读

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

我正在使用Windows7。如果我转到该文件的“属性”窗口,然后转到“详细信息”选项卡,我将看到该文件的属性是
HX
。当我运行
cmd
并使用
attrib
时,我被告知该文件具有属性H。与X无关。我尝试了
帮助attrib
,但仍然与属性X无关

我知道:

  • H=隐藏
  • S=系统
  • A=存档
  • R=只读
然而,我不知道X代表什么。我也找到了这些东西的用途

没有提到X属性是什么

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

这些都没有帮助

我希望能够在C#中读取/写入此标志,但到目前为止,我阅读了的文档,并尝试在文件上设置一些列出的属性(使用方法)

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


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

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

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

不幸的是,Windows API将阻止您设置/取消设置文件属性设备,因为它不适用于文件。如果你真的需要这样做,你必须直接访问磁盘。我真的不建议在C#中尝试这样做

最快的实现可能是忘记在Windows中执行,下载源代码,并对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命令。

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

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


这不应该复制属性,但我不知道它是否与X属性一起工作)

文件属性
X
对应于
System.IO.FileAttributes.Device
,它的整数值为
64
(0x40),使用.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
也无法设置此值。见:、和

但是,您可以编写与设置或删除此属性相同的代码

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

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


这种方法非常直截了当,在本机.NET中是完全可能的(与在磁盘级别进行黑客攻击或调用cgywin相比,实际上看起来也不会太糟糕——如果这样做可行的话).

似乎所有的注释都丢失了-有人问我在执行
chkdsk
后属性X是否会消失。不,我已经做了
chkdsk
-没有发现问题,属性X仍然存在。我会猜测一个故意无效的文件属性。FAT32中有两个未分配的位,0x40和0x80。这只是一个示例猜一猜。我怀疑Hans是对的。获取文件属性,将其转换为
int
,并以十六进制输出。然后将设置的位与文件属性常量进行比较:。这应该会告诉您哪个位设置不正确。如果要清除属性,请在该int中清除它,将int转换回
FileAttributes
,然后调用
文件。SetAttributes
。我听从Jim的建议(感谢分步指导),首先尝试获取和设置虚拟文件的属性。获取
0x20
(存档文件),然后将其设置为
0x22
,虚拟文件被隐藏。尝试获取有问题的文件的属性-获取
0x42
(设备+隐藏)。尝试将其设置为
0x2
(刚刚隐藏),但我被“拒绝访问”阻止。然后我尝试将dummy的属性设置为
0x42
。没有问题,但是当我检查dummy的详细信息选项卡时,它唯一的属性是
H
。如果我现在获得dummy的属性,它就是
0x2
。“
0x40
保留;不使用”。还有其他方法吗?请参阅,章节备注。我知道不使用的意思,但此文件已由其他程序设置了
0x40
属性,我希望能够执行相同的操作。或者将其设置为禁用。我不认为“执行”“属性适用于像FAT这样的Windows文件系统。我读过有关
icacls
,尝试在有问题的文件上使用它,但得到了“拒绝访问”的结果。然后我尝试了一点
icacls// Microsoft.Win32.Win32Native
[DllImport("kernel32.dll", BestFitMapping = false, CharSet = CharSet.Auto, SetLastError = true)]
internal static extern bool SetFileAttributes(string name, int attr);