2011-12-23 23 views
24

USBリムーバブルストレージ(FATファイルシステム)に隠しファイルがあります。C#でファイルにクリア属性 "X"を設定するには?

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

については何もない私が知っている:

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

しかし、私はXが何を意味するのか分かりません。私はまた、N and E attributesが何であるかを見出しました。

Wikipediaには、X属性の内容は記載されていません。

これらのどれも助けません。

私はこのフラグをC#で読み書きできるようにしたいと思いますが、今までではFileAttributes enumerationのドキュメントを読んで、ファイルの一部の属性(File.GetAttributes & File.SetAttributesメソッドを使用)を設定してみました。

これらの実験のいずれも、[プロパティ] - [詳細]に属性Xが表示されませんでした。だから、私はそれにどのように接近するのか分かりません。なぜなら、Xの意味がまだ分からないからです。

属性Xとは何ですか?また、C#で選択したファイルで属性Xを設定/消去する方法はありますか?

+0

すべてのコメントが失われたようです - 属性xが 'chkdsk'を実行した後に消えるかどうか尋ねられました。いいえ、私は' chkdsk'を実行しました。問題は見つからず、属性Xもまだですe。 – beam022

+2

私は意図的に無効なファイル属性を推測します。 FAT32、0x40、0x80には2つの未割り当てビットがあります。これは単なる推測です。 –

+2

私はハンスが正しいと思う。ファイルの属性を取得し、 'int'にキャストし、16進数で出力します。次に、設定されたビットをFile Attribute Constants:http://msdn.microsoft.com/en-us/library/windows/desktop/gg258117(v=vs.85).aspxと比較します。それは、どのビットが不適切に設定されているかを示すはずです。属性をクリアしたい場合は、そのintでクリアし、intを 'FileAttributes'にキャストし、' File.SetAttributes'を呼び出します。 –

答えて

1

私は間違っているかもしれませんが... X属性はファイルにextended attributesがあると考えています。残念ながら、C#を使用して拡張属性を変更することはできません。

+0

あなたは拡張属性について正しいかもしれないと思います。私は今、 '' SetFileAttribute'(http://msdn.microsoft.com/en-us/library/windows/desktop/aa365535%28v=vs.85%29)を使って 'FILE_ATTRIBUTE_DEVICE 0x40'を設定できないことを知りました。 aspx)、C#を使用してこの属性を設定またはクリアする別の方法があります。私は 'EA DATA 'について読みました。 SF'だが、読めるようになっているようだ。 'EA DATAにアクセスして編集する方法。 SF'ファイルをC#から? [FATでのEAの実装](http://ps-2.kev009.com:8081/tavi/os2pages/eadata.html)、[EA - what and how](http://www.howzatt.demon.co .uk/articles/06may93.html) – beam022

+0

私はいくつかのファイルを削除するツールを試してみましたが、どれもファイルを取り除くことができませんでした。 'EA DATA 'について。 SF "、私はこのEAファイルが私のフラッシュUSBドライブにあるかどうかはわかりません。 **存在の有無を確認する方法** EA DATAが言っているのは、[ここ](http://www.cygwin.com/1.5/cygwin-ug-net/using-filemodes.html)です。 SF'_fileは、「使用中」の状態のためWindowsの外でしか削除することができません。それは事実ですか?そして、EA DATAのためにattr Xでファイルを削除できない場合。私は自分の「EA DATA」を作ることができますか? SF' **フォーマット後のフラッシュドライブ? – beam022

+0

私はEAデータをチェックする方法を尋ねたのです。 SFファイルの存在は、エクスプローラに表示されないためです(隠しファイルとシステムファイルの表示を設定しました)。私は '存在すれば 'EA DATAを試しました.SF" echo it's here! "の' cmd'で、私は確認を得ませんでした。 EAデータではないようです。他のファイルを手で触れることができないようにする。私は間違っているかもしれない、助けていただければ幸いです。 – beam022

0

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

+0

「実行」属性がFATのようなWindowsファイルシステムに適用されるとは思いません。 – CedX

+0

私は 'icacls'について読んだことがあります。問題のファイルでそれを使用しようとしましたが、「アクセスが拒否されました。それから私はUSBスティックの他のファイルに 'icacls'を少し実験しましたが、それほど遠くには達しませんでした。私が' icacls dummy'と入力したときに得られるのは 'ダミーD:NO_ACCESS_CONTROL'です。 '/ grant'、'/deny'、 '/ remove'を試してもダミーのACLを変更することはできませんでした。それから私はいくつかの検索を行い、 "aclsはntfsファイルシステムによって最初にサポートされている"ことを発見した[andreas2610投稿](http://social.technet.microsoft.com/Forums/en-US/w7itprosecurity/thread/9e84667f-6eef -4f00-9a75-7c6d1d89a89b /) – beam022

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コマンドを呼び出します。

+0

ありがとう、私はWindowsでこれを行う必要があります。 – beam022

+0

Ah。もちろん、あなたがまだ立ち往生している場合、Cygwinの下でこのコードを実際に動かすことができるかもしれません。 –

0

私はあなたの問題を再現することはできませんが、その属性を削除するための回避策として、私はあなたがrobocopyと試みることができると思う:

robocopy xattributefile copyoffile /copy:DT 

/copy:DT:コピーするファイルのプロパティを指定します。

この属性をコピーするべきではありませんが、それはXの属性を使用して動作するかどうか私は知らない)

1

ファイル属性、あなたがこれを直接設定することはできません.NETを使用して64の整数値を持つSystem.IO.FileAttributes.DeviceからX correspondes(0x40の)値。そうであっても使用して、簡単に言えば

// Microsoft.Win32.Win32Native 
[DllImport("kernel32.dll", BestFitMapping = false, CharSet = CharSet.Auto, SetLastError = true)] 
internal static extern bool SetFileAttributes(string name, int attr); 

:問題はあなたがFile.SetAttributes(path, fileAttributes)電話の際には、これはkernel32.dllの直接DLLインポートであり、以下のように定義され、Mscorlib.dllにおける内部DLLインポート機能、すなわち静的メソッドMicrosoft.Win32.Win32Native.SetFileAttributesを呼び出すことですkernel32.dllこの値を設定することはできません。参照:SetFileAttributesおよびSystem.IO.FileAttributesを参照してください。

しかし、この属性の設定や削除と同じ効果を発揮するコードを書くことができます。

あなたの最高の可能性が高いだけ(合理的な)答えは、あなたが、既存のファイルの名前を変更するテンプレート Xファイルをコピーして書き込み X持っているファイルを設定する必要がある場合、 X権限を持つテンプレートファイルを維持するだろう

その他の属性。あなたがファイルを読み取り、新規ファイルに書き込み、その後、X許可を設定しませんFile.SetAttributes(path, File.GetAttributes(oldPath));への単純な呼び出しを(使用してそこに権限をコピーする必要がありX許可を除去するため

このアプローチはかなりまっすぐです先進的であり、ネイティブ.NETで完全に可能になります(ディスクレベルでのハッキングやcgywinの起動と比較して、実際にはあまりにも厄介なものにはならないでしょう)。

関連する問題