24

USBリムーバブルストレージ(FATファイルシステム)に隠しファイルがあります。

Windows 7を使用しています。このファイルの[プロパティ]ウィンドウに移動し、[詳細]タブに移動すると、ファイルの属性が。であることがわかりますHX。を実行cmdして使用するattribと、ファイルに属性Hがあると言われました。Xについては何もありません。試しましhelp attribたが、属性Xについてはまだ何もありません。

そんなこと知ってる:

  • H=非表示
  • S=システム
  • A=アーカイブ
  • R=読み取り専用

ただし、Xが何を表すのかわかりません。また、 N属性とE属性の目的もわかりました。

ウィキペディアには、X属性が何であるかについての言及はありません。

Googleは、属性Xに言及している2つのトピックを見つけました。

これらのどれも役に立ちませんでした。

このフラグをC#で読み取り/書き込みできるようにしたいのですが、これまでのところ、FileAttributes列挙のドキュメントを読み、ファイルにリストされている属性のいくつかを(File.GetAttributesFile.SetAttributesメソッドを使用して)設定してみました。

これらの実験では、属性Xが[プロパティ]->[詳細]に表示されることはありませんでした。ですから、特に属性Xが何を意味するのかまだわからないので、どのようにアプローチすればよいのかわかりません。

では、属性Xとは何ですか?C#で選択したファイルに属性Xを設定/クリアするにはどうすればよいですか?

4

5 に答える 5

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 に答える
1

ファイル属性は、 .NET を使用してこの値を直接設定できない (0x40)の整数値を持つものにX対応します。問題は、それを呼び出すと、 の内部 dll インポート関数、つまり static メソッドが呼び出されることです。これは の直接の dll インポートであり、次のように定義されます。System.IO.FileAttributes.Device64File.SetAttributes(path, fileAttributes)Mscorlib.dllMicrosoft.Win32.Win32Native.SetFileAttributeskernel32.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ファイルを設定する必要がある場合、最善かつおそらく唯一の (合理的な) 答えは、テンプレート ファイルを許可付きで保持することです。XX

パーミッションを削除するには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 に答える
0

X はおそらく実行権限です。icalcsそれについて言及しており、C#からこのコマンドを使用してファイル属性を設定できる可能性がありますが、FATファイルシステムに対して機能するかどうかはわかりません.

于 2011-12-23T18:48:01.033 に答える