Я пытался перечислить файлы в каком-то каталоге, но получаю странные результаты.

Это команда, которую я набираю в командной строке: dir *t.*

Это результат:

c:\test\1.1.1990.txt
c:\test\1.31.1990.txt
c:\test\1.txttxt
c:\test\11.11.2007.txtGif
c:\test\12.1.1990.txt
c:\test\12.31.1990.txt
c:\test\2.tGift
c:\test\2.txtGif
c:\test\5bbb.exeTxt
c:\test\test.txt

9-й вывод особенно странный: 5bbb.exeTxt , почему я получил этот результат, учитывая мой запрос? (теперь, когда я смотрю на это, большинство результатов кажутся странными?) например, почему 2-й?

Может кто-нибудь объяснить, пожалуйста?

Мне нужно будет использовать метод GetFiles , который работает так же, как я думаю, поэтому я заинтересован.

Связанный: список файлов в папке, которые соответствуют шаблону (переполнение стека)

2 ответа2

1

Я подозреваю, что это из-за поведения, упомянутого в блоге Рэймонда Чена (предупреждение - не фактическая документация).

Например, если ваш шаблон заканчивается на. *,. * Игнорируется. Без этого правила шаблон *. * Соответствовал бы только файлам, которые содержали точку, которая сломала бы, вероятно, 90% всех пакетных файлов на планете, а также мышечную память каждого, так как все, кто работал под управлением Windows NT 3.1, росли в Мир, где *. * означает все файлы.

Ваш шаблон - *t.* , Который изменяется, я полагаю, *t , который затем соответствует 5bbb.exeTxt . Я не уверен, как работает DirectoryInfo.GetFiles , почему бы просто не протестировать его?

Похоже, что короткие имена также совпадают, или первые три символа расширения.

G:\junk\filetest>dir
 Volume in drive G is Extended2
 Volume Serial Number is 3E2F-7A67

 Directory of G:\junk\filetest

09/09/2014  10:01 AM    <DIR>          .
09/09/2014  10:01 AM    <DIR>          ..
09/09/2014  09:59 AM                 6 test.txtR
09/09/2014  10:01 AM                 2 test.txtrrr
               2 File(s)              8 bytes
               2 Dir(s)  162,957,000,704 bytes free

G:\junk\filetest>dir *.txt
 Volume in drive G is Extended2
 Volume Serial Number is 3E2F-7A67

 Directory of G:\junk\filetest

09/09/2014  09:59 AM                 6 test.txtR
09/09/2014  10:01 AM                 2 test.txtrrr
               2 File(s)              8 bytes
               0 Dir(s)  162,957,000,704 bytes free

G:\junk\filetest>dir /x *.txt
 Volume in drive G is Extended2
 Volume Serial Number is 3E2F-7A67

 Directory of G:\junk\filetest

09/09/2014  09:59 AM                 6 TEST~1.TXT   test.txtR
09/09/2014  10:01 AM                 2 TEST~2.TXT   test.txtrrr
               2 File(s)              8 bytes
               0 Dir(s)  162,957,000,704 bytes free
1

Я думаю, что @dsolimano (и его источник, Раймонд Чен) довольно близко подошли к вашей проблеме, но, возможно, не совсем правильно объяснили. После некоторых размышлений, поиска и тестирования, хотя мне еще предстоит подготовить документацию, подтверждающую это, я считаю, что пришел к достаточно точному выводу.

Моя гипотеза основана на несколько связанном поведении доменных имен и некоторых других именованных компьютерных ресурсов. С доменными именами на самом деле есть подразумеваемая конечная точка в конце. Поэтому www.superuser.com на самом деле www.superuser.com. , Мой вывод, после некоторого тестирования, заключается в том, что Windows API (если не сама файловая система) использует то же соглашение для имен файлов.

Подумайте обо всех именах файлов, которые вы дали, которые соответствуют вашему результату. Если учесть, что имена файлов 8.3 включены в поиск, как описано здесь, и предположить, что длинные имена файлов с конечной точкой и имена файлов 8.3 с конечной точкой также включены, вы увидите, что каждый из этих файлов соответствует по крайней мере одному версия его имени файла. (Помните, что подстановочный знак * - это заполнитель, который представляет «любое количество символов или нет символов».)

  • c:\test\1.1.1990.txt соответствует 1.1.1990.txt. или 111990~1.TXT.
  • c:\test\1.31.1990.txt соответствует 1.31.1990.txt. или 131199~1.TXT.
  • c:\test\1.txttxt соответствует 1.txttxt. или 1956B~1.TXT.
  • c:\test\11.11.2007.txtGif соответствует 111120~1.TXT.
  • c:\test\12.1.1990.txt соответствует 12.1.1990.txt. или 12199~1.TXT.
  • c:\test\12.31.1990.txt соответствует 12.31.1990.txt или 123119~1.TXT.
  • c:\test\2.tGift соответствует 2.tGift.
  • c:\test\2.txtGif соответствует 2BEFD~1.TXT.
  • c:\test\5bbb.exeTxt соответствует 5bbb.exeTxt.
  • c:\test\test.txt соответствует как test.txt или test.txt.

Вы можете проверить это, создав серию тестовых файлов в C:\test как описано ниже, и снова запустив dir *t.* .

  1. Файл с расширением, оканчивающимся на "t".
  2. Файл с именем, оканчивающимся на "t".
  3. Файл с расширением более трех букв, третья буква которого - "t".
  4. Некоторые файлы, которые соответствуют более чем одному из вышеуказанных критериев.
  5. Файл с именем, оканчивающимся на "t", и вообще без расширения.
  6. Некоторые файлы, которые не соответствуют ни одному из вышеуказанных критериев.

Вы должны видеть, как и я, что dir *t.* Будет возвращать только файлы, которые попадают в категории 1-5 выше. Файлы в категории 6 будут исключены. Вы также можете использовать метод GetFiles более непосредственно для тех же файлов с помощью PowerShell, используя приведенную ниже команду, и вы должны увидеть те же результаты.

[IO.Directory]::GetFiles('C:\test','*t.*')

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .