Пробел после расширения файла -> странное поведение FileInfo - PullRequest
7 голосов
/ 30 апреля 2010

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

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

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? Могу ли я как-нибудь получить информацию об этом файле? Я действительно не знаю, как этот файл появился в моей файловой системе, и я не могу воссоздать еще некоторые из них.

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

Ответы [ 2 ]

6 голосов
/ 30 апреля 2010

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

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

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

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

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

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

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

4 голосов
/ 30 апреля 2010

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

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

...