如何设置“清除属性”;X";在C#中包含的文件上?
我的USB可移动存储器(FAT文件系统)上有一个隐藏文件 我正在使用Windows7。如果我转到该文件的“属性”窗口,然后转到“详细信息”选项卡,我将看到该文件的属性是如何设置“清除属性”;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#中读
HX
。当我运行cmd
并使用attrib
时,我被告知该文件具有属性H。与X无关。我尝试了帮助attrib
,但仍然与属性X无关
我知道:
- H=隐藏
- S=系统
- A=存档
- R=只读
- 李>
那么,什么是属性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);