3

いくつかの動的基準を満たすファイルのリストを返せるようにする必要があります。私はLINQを使ってこれをやろうとしました。

Scott Gu's Blogで言及されている System.Linq.Dynamic 名前空間を使用して動的 LINQ を使用できることがわかりました。

しかし、必要な用途に使用できるかどうかはわかりません。

これまでのところ、すべてのファイルを取得していますが、そこからどこに行くべきかわかりません。

// Take a snapshot of the file system.
System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(SourceLocation);

// This method assumes that the application has discovery permissions
// for all folders under the specified path.
IEnumerable<System.IO.FileInfo> fileList = dir.GetFiles("*.*", System.IO.SearchOption.AllDirectories);

ユーザーが作成した動的フィルターを使用して、これらのファイルをフィルター処理できるようにする必要があります。例 拡張子 = .txt

誰かが私を正しい方向に向けることができますか?

ありがとう。マーティン。

編集:

Dynamic Linq ライブラリの例は次のようになります。

var query =
            db.Customers.Where("City == @0 and Orders.Count >= @1", "London", 10).
            OrderBy("CompanyName").
            Select("New(CompanyName as Name, Phone)");

これをファイルシステムに適応させたいと思っていました。そのため、フィルター文字列を作成して使用することができます。

4

3 に答える 3

3

これは私が使用した方法です。

var diSource = new DirectoryInfo(SourceLocation);            
var files = GetFilesRecursive(diSource);
var matches = files.AsQueryable().Where(sFilter, oParams);

SourceLocation は、検索したいディレクトリへの単なるファイルパスです。GetFileRecursive は、子フォルダー内のすべてのファイルを返すカスタム メソッドです。

ユーザーが定義したフィルターに基づいて sFilter パラメーターを作成します。oParams は、これらのフィルターの値の配列です。これにより、ユーザーは必要な数のフィルターを動的に定義できます。

于 2010-07-12T08:43:14.507 に答える
2
var files = fileList.Where(
    f => f.Modified > DateAdd(DateInterval.Days, -1, DateTime.Now);

また

var files = fileList.Where(f => f.Name.EndsWith(".txt"));

また

var files = fileList.Where(f => f.IsReadOnly);

これがLINQです。このf => f.部分には、ブール値に評価される任意の式を入れることができます。空は限界です。FileInfoオブジェクトを受け取り、ファイルのテキストを読み取り、特定のフレーズが含まれている場合は true を返す関数を作成できます。次に、これを行うだけです...

var files = fileList.Where(f => MyFunction(f));

ユーザーが作成したフィルターについては、考えられる状況に適合する UI とバックエンドを実際に設計する必要があります。

于 2010-07-08T13:57:38.427 に答える
0

フィルタリングの一部として fileinfo プロパティを使用していない限り、次のように単純に使用できます。

IEnumerable<System.IO.FileInfo> fileList = dir.GetFiles(**"*.txt"**,
 System.IO.SearchOption.AllDirectories);
于 2016-03-29T06:45:28.603 に答える