2015-11-14 19 views
9

ローカルHddからすべてのファイルを読み込むプロジェクトに取り組んでいます。 検索に含める拡張子を指定します。はファイル読み込み可能です(テキストではなくアクセス可能です)

すべてのファイル拡張子は、ファイルがテキストコンテンツであることに基づいています。私は一般的なユーザーを聞かせ機能を追加したい場合はどのような.csファイルの.html .htmファイルの.css .jsファイルなどとしての私の使用のために、私はACOUNTに取るためにどの拡張子を指定することができるので、

、 」

拡張子 を選択し、使用可能なすべてのWindowsファイル拡張子から選択させますが、そのリストにはテキスト形式のシステム内のファイルのみを含めます。 たとえば、私たちはexe、mp3を知っています。 mpg、aviは ではありませんが、私たちが考慮していない他の種類のファイル(拡張子)を持つことができます。

システムファイルのプロパティに基づいて決定する方法は でない場合テキストコンテンツファイルのみをフィルタする方法はありますか?

+2

これを行うには良い方法はありません。だから、ハックした "読んでみてください。内容を理解できればテキストです"は "最高"です。トピックに関する以前のディスカッションの「拡張子なしのファイルタイプの検出」(または同様のもの)を検索することを検討することもできます。 –

+0

拡張子は、ファイルの内容の弱い表示のみを提供します。テキストを含むこれらのファイルなしで '.cs'拡張子も使用するアプリケーションがあります。 –

+0

私は1つ、少なくとも一般的なものではないと思います。たとえば、単語ファイルからの拡張子docxはそのままのテキストではなく、docx-filesは圧縮されたXMLファイルです。しかし、ユーザーとしては、おそらくワードファイルがテキストと見なされることになります。 –

答えて

3

Windowsマシンの1つのメカニズムは、ファイル拡張子に関連付けられたWindowsレジストリ内のコンテンツタイプを調べることです。 (私は、レジストリを直接参照せずにこれを行う方法を知りません。)

をレジストリ内では、テキストベースでのファイルの拡張子は一般的に、これらの特徴の1つ以上を有する必要があります。

  • A例えば、テキストのMIMEプライマリタイプを示すコンテンツタイプ、text/plainまたはtext/application
  • プレーンテキスト永続ハンドラに割り当てられたGUID {5e941d80-bf96-11cd-b579-08002b30bfeb}text
  • デフォルトのハンドラの知覚種類、。

次のような方法では、これらの特性に関連付けられているすべてのシステム拡張を返します。

// include using reference to Microsoft.Win32; 
static IEnumerable<string> GetTextExtensions() 
{ 
    var defaultcomp = StringComparison.InvariantCultureIgnoreCase; 
    var root = Registry.ClassesRoot; 
    foreach (var s in root.GetSubKeyNames() 
     .Where(a => a.StartsWith("."))) 
    { 
     using (RegistryKey subkey = root.OpenSubKey(s)) 
     { 
      if (subkey.GetValue("Content Type")?.ToString().StartsWith("text/", defaultcomp) == true) 
       yield return s; 
      else if (subkey.GetValue("PerceivedType")?.ToString().Equals("text", defaultcomp) == true) 
       yield return s; 
      else 
      { 
       using (var ph = subkey.OpenSubKey("PersistentHandler")) 
       { 
        if (ph?.GetValue("")?.ToString().Equals("{5e941d80-bf96-11cd-b579-08002b30bfeb}", defaultcomp) == true) 
         yield return s; 
       } 

      } 
     } 
    } 
} 

出力は、ワークステーションの構成に依存しますが、私の現在のマシンのリターンに:

を。 a、.AddIn、.ans、.asc、.asm、.asmx、.aspx、.asx、.bas、.bat、.bcp、.c、.cc、.cd、.cls、.cmd、...

これは正しくファイル拡張子のマッピングアプリケーションのインストーラに依存するが、大きなテキストファイルの種類のほとんどを識別するために表示されます。

+0

p + 1の方が良い(非常に良い)スタートです。 –

+0

btwはMicrosoft.Win32への参照を使用しています。どこで 'Win32'のメソッドを呼び出しましたか? –

+0

@JbobJohanレジストリクラスは、Microsoft.Win32名前空間にあります。 – drf

0

一般的に、これを行うための信頼できる方法はありません。

ファイル拡張子を比較することで決定することはできません。これはファイル名の一部にすぎず、だれもがそれを変更することができます。file.exeはプレーンテキストファイルです。

C# - Check if File is Text Based
あなただけの最初の1000(任意の数)の文字を通じて確認し、印刷できない文字があるかどうか、彼らが特定の範囲内のすべてのASCIIある場合があります。

+2

私は、プログラミングのオプション、特にそのような些細な作業の中で、 "方法はありません"というオプションを認識していません。 –

+0

だから、あなたが知っていることをすべて指定し、追加するオプションをユーザーが追加することだと思います。 –

+0

unicodeには注意してください。unprintableを含めることができます –

関連する問題