Я предполагаю, что вы находитесь на машине с японским языком, где системная кодировка по умолчанию (кодовая страница ANSI) - cp932 Японский (≈Shift-JIS).
Второй путь содержит:
ソ
, который кодирует в последовательность байтов:
0x83 0x5C
Shift-JIS - это многобайтовая кодировка, которая имеет прискорбное свойство иногда повторно использовать единицы кода ASCII в байте следа.В этом случае он использовал байт 0x5C, который соответствует обратной косой черте \
.(Хотя по историческим причинам это обычно отображается как знак иены в японских шрифтах.)
Так что, если это имя пути передается в байтовый API, оно будет закодировано в кодовой странице ANSI, и вы выиграетене может отличить обратную косую черту в качестве разделителя каталогов от побочного эффекта многобайтового кодирования.Следовательно, любой путь с одним из следующих символов не будет выполнен при доступе с помощью метода ввода-вывода на основе байтов:
―ソЫⅨ噂浬欺圭構蚕十申曾箪貼能表暴予禄兔喀媾彌拿杤歃畚秉綵臀藹觸軆鐔饅鷭偆砡纊犾
(Также любой путь, содержащий символ Unicode, отсутствующий в cp932, естественно завершится сбоем.)
Может показаться, что за кулисами SQLite использует байтовый метод ввода-вывода, чтобы открыть заданное имя файла.Это прискорбно, но чрезвычайно распространено в кроссплатформенном коде, потому что стандартная библиотека POSIX C определена для использования байтовых имен файлов для таких операций, как file open()
.
Следовательно, используя функции C stdlib, это невозможнонадежный доступ к файлам с не-ASCII именами.Эта печальная ситуация наследуется от всевозможных кроссплатформенных библиотек и языков, написанных с использованием stdlib;только инструменты, написанные с определенной поддержкой имен файлов Win32 Unicode (например, Python), могут надежно обращаться ко всем файлам в Windows.
В этом случае вы можете выбрать следующие параметры:
избегать использования не-ASCII символы в имени пути для вашей базы данных в соответствии с предложением перемещения / переименования;
продолжают полагаться на системный языковой стандарт, являющийся японским (кодовая страница ANSI = 932), и простопереименуйте файлы, чтобы исключить любой из перечисленных выше символов;
получите короткое (8.3) имя файла для рассматриваемого файла и используйте его вместо реального - что-то вроде c:\test6\85D0~1\22PC~1\test.db
.Вы можете использовать dir /x
, чтобы увидеть короткие имена файлов.Они всегда являются чистым ASCII, избегая проблемы кодирования;
добавьте некоторый код, чтобы получить короткое имя файла из реального, используя GetShortPathName.Это Win32 API, поэтому вам нужна небольшая справка , чтобы вызвать его из .NET.Обратите внимание, что короткие имена файлов по-прежнему не будут работать, если они запускаются на компьютере с отключенной функцией создания коротких имен файлов;
убедить SQLite добавить поддержку имен файлов Windows Unicode;
убедить Microsoft решить эту проблему раз и навсегда, установив кодировку по умолчанию для байтовых интерфейсов UTF-8, как это делается во всех других современных операционных системах.