Так или иначе файл появился в одном из моих каталогов, и он имеет пространство в конце своего расширения - его именем является "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 это. Я могу легко обработать исключение при нахождении файла, но мальчик - я любопытный на предмет этого!
Имена конечных файлов с пробелом считается плохой идеей.
Из MSDN «Именование файлов, путей и пространств имен (Windows)» :
- Не заканчивайте имя файла или каталога пробелом или точкой. Хотя базовая файловая система может поддерживать такие имена, оболочка Windows и пользовательский интерфейс - нет.
Кроме того, статья базы знаний «ИНФОРМАЦИЯ: имена файлов, заканчивающиеся пробелом или периодом, не поддерживаются» :
Проблемы могут возникнуть, когда клиент Macintosh создает файл на сервере Windows NT. Код для удаления конечных пробелов и точек не выполняется, и пользователь Macintosh получает правильно расставленное имя файла. API Win32
FindFirstFile ()
иFindNextFile ()
возвращают имя файла, которое заканчивается пробелом или точкой; однако нет возможности создать или открыть файл с помощью Win32 API.
DirectoryInfo
, вероятно, использует FindFirstFile ()
и его друзей для создания списков каталогов. File.Exists
, скорее всего, реализуется через GetFileAttributes ()
, который, вероятно, страдает той же проблемой, что и CreateFile ()
, и сообщит о несуществующем файле.
Следовательно, проблема не в .NET конкретно, а в самой Windows.
Да, я знаю об этих файлах. Мне тоже однажды досталась такая зверюга. Чтобы избавиться от этого, я не знаю способа программирования на C #, но старая добрая командная строка - ваш друг:
Откройте окно консоли в указанной папке (или выполните cmd и перейдите к папку с командой cd
). Теперь введите dir / x
, чтобы получить короткие имена файлов в этом каталоге. Используйте это имя, чтобы удалить или переименовать файл с помощью команды del
или ren
.