Как я определяю, чувствительна ли файловая система к регистру в .NET?

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

>>> from datetime import date
>>> with patch('mymodule.date') as mock_date:
...     mock_date.today.return_value = date(2010, 10, 8)
...     mock_date.side_effect = lambda *args, **kw: date(*args, **kw)
...
...     assert mymodule.date.today() == date(2010, 10, 8)
...     assert mymodule.date(2009, 6, 8) == date(2009, 6, 8)
...

11
задан Kip 21 October 2009 в 19:34
поделиться

5 ответов

Можно создать файл во временной папке (использующий строчное имя файла), затем проверить, существует ли файл (использование прописного имени файла), например:

string file = Path.GetTempPath() + Guid.NewGuid().ToString().ToLower();
File.CreateText(file).Close();
bool isCaseInsensitive = File.Exists(file.ToUpper());
File.Delete(file);
13
ответ дан 3 December 2019 в 02:30
поделиться

Следует иметь в виду, что у Вас могло бы быть несколько файловых систем с различными правилами преобразования регистра. Например, корневая файловая система могла быть чувствительной к регистру, но у Вас может быть нечувствительная к регистру файловая система (например, карта с интерфейсом USB с файловой системой FAT на ней) смонтированный где-нибудь. Таким образом, если Вы делаете такие проверки, удостоверьтесь, что Вы делаете их в каталоге, к которому Вы собираетесь получить доступ.

Кроме того, что, если пользователь копирует данные из, говорит что чувствительное к регистру нечувствительной к регистру файловой системе? Если у Вас будут файлы, которые отличаются только случаем, то один из них перезапишет другой, вызывая потерю данных. При копировании в другом направлении Вы могли бы также столкнуться с проблемами, например, если файл A содержит ссылку на файл "b", но файл на самом деле называют "B". Это работает над исходной нечувствительной к регистру файловой системой, но не в чувствительной к регистру системе.

Таким образом я предложил бы, чтобы Вы избежали в зависимости от того, чувствительна ли файловая система к регистру или не, если Вы можете. Не генерируйте имена файлов, которые отличаются только случаем, используют стандартные диалоговые окна средства выбора файла, готовятся, что случай мог бы измениться и т.д.

7
ответ дан 3 December 2019 в 02:30
поделиться

Попытайтесь создать временный файл во всем нижнем регистре и затем проверьте, существует ли он с помощью верхнего регистра.

1
ответ дан 3 December 2019 в 02:30
поделиться

В Библиотеке классов.NET нет такой функции.

Можно, однако, развернуть собственное: Попытайтесь создать файл со строчным именем и затем попытайтесь открыть его с прописной версией его имени. Вероятно, возможно улучшить этот метод, но Вы получаете идею.

Править: Вы могли на самом деле просто взять первый файл в корневом каталоге и затем проверить если оба имени файла. ToLower () и имя файла. ToUpper () существуют. К сожалению, довольно возможно, что и прописные и строчные варианты того же файла существуют, таким образом, необходимо сравнить FileInfo. Свойства имени и строчных и прописных вариантов, чтобы видеть, являются ли они действительно тем же или нет. Это не потребует записи в диск.

Очевидно, это перестанет работать, если не будет никаких файлов вообще на объеме. В этом случае просто отступите к первой опции (см. ответ Martin для реализации).

7
ответ дан 3 December 2019 в 02:30
поделиться

Это не функция .NET, но функции GetVolumeInformation и GetVolumeInformationByHandleW из Windows API будут делать то, что вы хотите (см. Параметр yje lpFileSystemFlags.

{ {1}}
2
ответ дан 3 December 2019 в 02:30
поделиться
Другие вопросы по тегам:

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