Почему я получаю bdNamErr при попытке использовать файл, которого я просто определил местоположение?
Q: Почему я добирающийся a bdNamErr при попытке использовать файл я просто расположился?
A: Почему я добирающийся a bdNamErr при попытке использовать файл я просто расположился?
Очень вероятная причина для этой ситуации состоит в том, что Вы определили местоположение файла с помощью BSD APIs такой как opendir и readdir, и Вы пытаетесь использовать имя, возвращенное этим APIs с Файловым менеджером Core Services API такой как FSMakeFSRefUnicode / FSOpenFork.
С другой стороны, если Вы определяете местоположение файла с помощью Файлового менеджера Core Services API такой как FSGetCatalogInfoBulk и попытайтесь использовать его с BSD API такой как fopen, это может перестать работать.
Запрещенные символы
При смешивании Файлового менеджера BSD and Core Services APIs работает большую часть времени, он перестанет работать, если имя файла будет содержать запрещенный символ, и каждый набор APIs имеет различные правила:
BSD APIs позволяет двоеточие (»: «) символ, но запрещает наклонную черту (» / «) символ в имени файла, так как этот символ используется в качестве разделителя каталога,
Файловый менеджер Core Services APIs позволяет символ наклонной черты, но запрещает символ двоеточия по устаревшим причинам, так как это использовалось в качестве разделителя каталога предыдущими версиями Файлового менеджера Mac OS.
Если имена файлов содержат символы, запрещенные в другом наборе APIS, таким образом пытаясь использовать имена файлов, полученные через BSD APIs в Файловом менеджере Core Services, APIS, или наоборот, может перестать работать в любое время.
Терминал, средство поиска и запрещенные символы
Чтобы проиллюстрировать, как оба набора APIs реагируют на запрещенные символы, можно использовать Терминал для запуска инструментов, использующих BSD APIs и Средство поиска, использующее Файловый менеджер Core Services APIs.
Используйте touch команда для создания файлов "Library/test1" и "Library:test2" в корневом каталоге как показано в Перечислении 1
Перечисление 1 touch в Терминале.
$ cd ~ $ touch Library/test1 $ touch Library:test2 |
Используя ls команда, Вы будете видеть файл по имени «Library:test2» в Вашем корневом каталоге и файл, названный «test1» в его подкаталоге Библиотеки. BSD APIs интерпретировал символ наклонной черты как разделитель пути, но обработал символ двоеточия как обычный символ.
Используя Средство поиска для навигации к корневому каталогу Вы будете видеть файл по имени «Library/test2» и файл, названный «test1» в его подкаталоге Библиотеки. Двоеточие заменяется наклонной чертой в первом имени файла, чтобы препятствовать тому, чтобы пользователи видели и создали имена файлов с двоеточиями.
Решение
Если код, смешивающий Файловый менеджер BSD APIs and Core Services APIs, не вызывают в большой итерации, но, например, вызывают в ответ на действие пользователя с одним файлом, то предпочтительное решение должно просто использовать FSPathMakeRef и FSRefMakePath преобразовать между набором APIs.
Поскольку производительность рассуждает, вызывают ли код очень часто, или если Вы обрабатываете пути файлов, «не существующих все же» (FSRefs не может использоваться в этом случае), альтернативное решение должно вручную подкачать двоеточия в наклонных чертах при движении от BSD до Файлового менеджера Core Services и наклонных чертах к двоеточиям при движении от Файлового менеджера Core Services до BSD. Имена, обработанные BSD APIs, являются струнами до UTF-8. Имена, обработанные Файловым менеджером Core Services APIs, являются массивами Unicode UniChar. Так как необходимо использовать струны до UTF-8 для или от BSD, простое решение должно подкачать символы в той строке.
Перечисление 2 , Подкачивающее двоеточия и наклонные черты в струне до UTF-8.
static void SwapColonsAndSlashes(char * str)
{
char * cursor = str;
while (*cursor != 0)
{
if (*cursor == ':')
{
*cursor = '/';
}
else if (*cursor == '/')
{
*cursor = ':';
}
cursor += 1;
}
} |
История версии документа
| Дата | Примечания |
|---|---|
| 14.11.2006 | Новый документ, описывающий проблему, вызванную различными запрещенными символами в POSIX и HFS и решении вокруг проблемы. |