7

最近、Microsoft の奇妙な機能に出くわしました。

フォルダーc:\tmp123に 3 つのファイルが含まれているとします。
1.txt
2.txtx
3.txtxt

Directory.GetFiles(@"C:\tmp123", "*.txt")a)返品された 3 つのアイテムでの利回りの呼び出し。
b)Directory.GetFiles(@"C:\tmp123", "*.txtx")返品された 1 つのアイテムでの利回りの呼び出し。

Microsoft によれば、これは予想される動作です ( MSDNの注を参照)。

私の質問は次のとおりです。

  1. Microsoft はなぜ、このような奇妙な機能を搭載することにしたのでしょうか?

  2. どうすればこの問題を克服できますか? つまり、内線番号のみを返し、 などを返さない検索
    パターンを作成するにはどうすればよいですか?*.txt*.txtx*.txtstarngefunctionality

4

4 に答える 4

2

回避策が必要な場合は、すべてのファイル パスを取得するだけです。

var files = Directory.GetFiles(@"C:\tmp123");

必要に応じて拡張子でフィルタリングします

var txtFiles = files.Where(f => f.EndsWith(".txt"));
var txtxFiles = files.Where(f => f.EndsWith(".txtx"));
于 2012-01-10T13:39:47.773 に答える
2

その理由は下位互換性です。

Windows は当初、名前が 8 文字、拡張子が最大 3 文字のファイルしかない MSDOS の上にグラフィカル インターフェイスとして構築されました。MSDOS ファイル システムの拡張機能により、Windows はより長いファイル名と拡張子を持つことができましたが、MSDOS ではこれらは依然として 8.3 ファイル名として表示されていました。

Windows のコマンド プロンプトは、MSDOS の古いコマンド インタープリターの進化形であるため、これは、いくつかの「時代錯誤的な」動作 (3 文字の検索パターンなど) が維持されていることを意味し、「昔」または「古いタイマー」によって作成されたアプリケーションとスクリプト壊れません。

(別の例として、ほとんどの Windows ファイル システムは大文字と小文字を区別しないという事実があります。そうです、MSDOS のファイル システムには大文字と小文字が区別されていないためです)

于 2012-01-10T10:43:33.790 に答える
0

下位互換性に関係するものであることに賭けても構わないと思います。この正確な問題が言及されているとは思いませんが、このレイモンド・チェンのブログ投稿では、この分野のいくつかの奇妙な点について言及しています。

[...] FCB マッチング アルゴリズムの癖のいくつかは、慣用句になっているため、Win32 にも残っています。

たとえば、パターンが で終わる場合.*.*は無視されます。この規則がなければ、パターンはドットを含むファイルのみに一致し、Windows NT 3.1 を実行しているすべての人が意味*.*のある世界で育ったため、おそらく地球上のすべてのバッチ ファイルの 90% とすべての人の筋肉の記憶が壊れてしまいます。*.*すべてのファイル。

別の例として、ドットで終わるパターンは、ドットで終わるファイルと実際には一致しません。拡張子のないファイルに一致します。また、疑問符がドットの直前にある場合、疑問符は 0 文字と一致します。

于 2012-01-10T09:07:25.633 に答える
0

「.txtxt」などの拡張子を持つファイルをフィルターで除外するのに役立つ別の回避策を次に示します。

var Files = System.IO.Directory.GetFiles("*.txt").Where(item => item.Extension.ToString().ToLower() == ".txt");
于 2014-09-24T22:43:20.307 に答える