Пробел после расширения файла-> странное поведение FileInfo

Так или иначе файл появился в одном из моих каталогов, и он имеет пространство в конце своего расширения - его именем является "test.txt". Странная вещь - это Directory.GetFiles() возвращает меня путь этого файла, но я не могу получить информацию о файле с FileInfo класс.

Ошибка проявляет здесь:

DirectoryInfo di = new DirectoryInfo("c:\\somedir");
FileInfo fi = di.GetFileSystemInfos("test*")[0] as FileInfo; 
//correctly fi.FullName is "c:\somedir\test.txt "
//but fi.Exists==false (!)

Класс FileInfo повреждается? Я могу так или иначе получить информацию об этом файле? Я действительно не знаю, как тот файл появлялся в моей файловой системе, и я не могу воссоздать еще некоторых из них.

Все мои попытки создать новый файл с этим типом расширения перестали работать, но теперь моя программа отказывает когда encoutering это. Я могу легко обработать исключение при нахождении файла, но мальчик - я любопытный на предмет этого!

7
задан Axarydax 30 April 2010 в 07:00
поделиться

2 ответа

Имена конечных файлов с пробелом считается плохой идеей.

Из MSDN «Именование файлов, путей и пространств имен (Windows)» :

  • Не заканчивайте имя файла или каталога пробелом или точкой. Хотя базовая файловая система может поддерживать такие имена, оболочка Windows и пользовательский интерфейс - нет.

Кроме того, статья базы знаний «ИНФОРМАЦИЯ: имена файлов, заканчивающиеся пробелом или периодом, не поддерживаются» :

Проблемы могут возникнуть, когда клиент Macintosh создает файл на сервере Windows NT. Код для удаления конечных пробелов и точек не выполняется, и пользователь Macintosh получает правильно расставленное имя файла. API Win32 FindFirstFile () и FindNextFile () возвращают имя файла, которое заканчивается пробелом или точкой; однако нет возможности создать или открыть файл с помощью Win32 API.

DirectoryInfo , вероятно, использует FindFirstFile () и его друзей для создания списков каталогов. File.Exists , скорее всего, реализуется через GetFileAttributes () , который, вероятно, страдает той же проблемой, что и CreateFile () , и сообщит о несуществующем файле.

Следовательно, проблема не в .NET конкретно, а в самой Windows.

6
ответ дан 7 December 2019 в 01:18
поделиться

Да, я знаю об этих файлах. Мне тоже однажды досталась такая зверюга. Чтобы избавиться от этого, я не знаю способа программирования на C #, но старая добрая командная строка - ваш друг:

Откройте окно консоли в указанной папке (или выполните cmd и перейдите к папку с командой cd ). Теперь введите dir / x , чтобы получить короткие имена файлов в этом каталоге. Используйте это имя, чтобы удалить или переименовать файл с помощью команды del или ren .

4
ответ дан 7 December 2019 в 01:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: