Проблема в том, что вам не разрешено вводить двоеточия в имена файлов в Windows. Вы на самом деле не используете Windows ... но вы :, используя общий ресурс SMB, что означает, что вы связаны правилами Windows.
Исправление состоит в том, чтобы не помещать двоеточия в ваши имена файлов.
Если вы хотите понять, почему происходит этот странный материал, читайте дальше.
Сведения о именах файлов Windows, описаны в Naming Files, Paths, and Namespaces на MSDN, но я буду суммировать соответствующие части здесь.
Ядро NT под Windows не имеет проблем с двоеточиями, но поверх слоя Win32 он не может их обрабатывать (а уровень квази-POSIX в MSVCRT находится поверх Win32).
Итак, на уровне C, если вы вызываете функции NT, такие как NtSetInformationFile
, это сэкономит их просто отлично. Если вы вызываете функции Win32, такие как MoveFileEx
, они обычно выдают вам ошибку, но если вы используете специальный синтаксис \\?\
, чтобы сказать «передать это имя прямо в NT», он будет работать. И если вы вызываете функции MSVCRT, такие как rename
, вы получите сообщение об ошибке. Старые версии Python называются rename
, что просто даст вам ошибку. В более новых версиях вызывается MoveFileEx
и будет пытаться обернуть это имя в \\?\
синтаксисе (потому что это также позволяет обойти некоторые другие глупые ограничения, такие как чрезмерно короткое значение MAX_PATH
).
Итак, что произойдет, если вы дадите файлу имя, которое Win32 не может понять? Помните, что в Windows каждый файл имеет два разных имени: «long name» и «short name». Сокращенное имя - это имя файла в формате DOS 8.3. Поэтому, когда он не может отображать длинное имя, вместо него отображается короткое имя.
Откуда короткое имя? Если вы не создадите его явно, Windows создаст его для вас из длинного имени, используя первые 6 символов, тильду и несколько букв. Так, например, краткое имя для "Program Files"
- "PROGRA~1"
. Но если Windows не может обрабатывать длинное имя, оно просто составит короткое имя из 6 случайных символов, тильды и случайного символа. Таким образом, вы получаете что-то вроде 2A443K~H
.
Файловая система NTFS, предназначенная для Windows, ожидается, что она будет использоваться в Windows-y способами.Таким образом, если вы используете том NTFS, даже в системе, отличной от Windows, драйвер будет эмулировать некоторые из этих функций, что даст вам аналогичное, но не тождественное поведение.
И, конечно, если вы разговариваете с долей из системы Windows или совместно с диском NTFS в системе, отличной от Windows, снова будут применяться некоторые из тех же вещей.
Даже если ваш компьютер и файловый сервер не являются Windows, а файловая система не является NTFS, если вы используете SMB/CIFS для совместного использования файлов, SMB также был разработан для Windows, и вы снова получите аналогичное поведение ,
По крайней мере, вам больше не придется беспокоиться о VMS, классическом Mac и других системах именования, просто POSIX и Windows.
Я предполагаю, что вы на Windows, правильно? – abarnert
двоеточие не разрешено в именах файлов во многих системах, поэтому, возможно, вместо этого попробуйте подчеркнуть? – beroe
@beroe: На самом деле, большинство систем позволяют им; это в основном просто Windows (и классический Mac, но никто больше этого не использует); OS X, Linux и т. Д. – abarnert