GetFiles: неправильный результат - PullRequest
4 голосов
/ 24 июня 2011

Я использую следующий код в рекурсивном вызове:

var files = di.GetFiles("*.jpg");

di - это DirectoryInfo, который передается в функцию.Предположим, файл tiger.jpg находится в корне диска k.Иногда результатом является не k: \ tiger.jpg, а k: \ iger.jpg.Я понятия не имею, почему или как.Кто-нибудь когда-либо имел такое же поведение?

Редактировать 1 : Кажется, это происходит даже с именами каталогов, потому что рекурсивная функция не выводит изображения в подкаталоге.Я думаю, что это в основном FAT (потому что он обычно читает с носителя, такого как SD-карта или USB-накопитель, иногда с DVD или CD).

Полное имя каждого возвращенного объекта FileInfo сигнализируется с помощью события.Получатель создает новый объект, который принимает путь в качестве аргумента для конструктора.Затем конструктор вызывает метод, который использует путь для получения информации о файлах jpeg:

FileStream fs = File.Open ( this.Path, FileMode.Open );
Image img = Image.FromStream ( fs, false, false );

Здесь происходит исключение.Когда я получаю файлы от вызова компонента инфраструктуры, я не проверяю их снова явно, я могу встроить это в систему, но это не решает мою проблему.

Одна вещь, которую я забыл:Это не происходит в наших тестовых системах, но в системах по всему миру: (

Ответы [ 3 ]

3 голосов
/ 24 июня 2011

Может быть неправильная соломинка, но вы пытались экранировать \.

В вашем примере k:\tiger.jpg C # будет читать \t как табуляцию.Такого не должно быть, но я видел, как это произошло.Попробуйте написать так, чтобы все обратные косые черты были заменены на \\

1 голос
/ 28 декабря 2011

В данном конкретном случае кажется, что это была определенная комбинация оборудования, которая вызвала какое-то странное поведение. Win32 API выдает правильные результаты, в то время как .NET API возвращает неправильные результаты.

Это не воспроизводилось во всех установках.Единственным очевидным отличием были настройки локализации, но даже их изменение на функционале не помогло нам создать репродукцию на одной из наших локальных машин.Поскольку новая версия оборудования будет выпущена, дальнейших расследований не будет.

Если вы уверены, что рассмотрели все предложения из других ответов и у вас возникла та же проблема, вы можете обратиться к поставщику ОС..

1 голос
/ 24 июня 2011

Антивирус может иногда вступать в игру здесь. Если у вас есть один процесс, генерирующий файл, и один процесс, который его использует, возможно, у вас есть условие состязания.

Вместо того, чтобы проверять существование файлов, вызовите File.Open, а затем попробуйте / перехватите для IOException. Затем вам нужно будет проверить, что происходит, когда вы нажмете исключение.

Вы никогда не сможете предположить, что файл существует.

Почему вы теряете букву имени файла, как вы генерируете this.Path?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...