В соответствии с вашим вопросом вы хотите начать с имени файла так долго, что Windows не сможет его сохранить. Ограничение составляет 255 символов на компонент (бит между обратной косой чертой: папка илиимя файла) и почти 32 767 символов, или около 9 страниц формата А4, для всего пути, что должно быть достаточно для большинства обычных целей.
Если вы имеете дело с файловой системой, отличной от NTFS (например, FAT, NFS, ISO-9660), то ограничения значительно ужесточаются.Речь идет о NTFS в Windows 10 Anniversary Update (2016) или более поздней версии.
В то время как Windows будет сохранять и извлекать файл с таким длинным путем, вполне возможно, что некоторые APIне будет .В этом ответе предполагается, что файл фактически сохранен под нужным именем, но вы должны передать более короткое имя такому API.
Если путь или имя файла действительно такие длинные, что Windows не может их сохранить, тофайл фактически не может существовать под этим именем, и вам придется поместить его где-то за пределами файловой системы, и одно из ваших ограничений - без отправки результата в базу данных , так что такая возможность исключена.
Существует два подхода к сжатию.Один использует избыточность в данных, которые вы хотите сжать, например, кодирование длины прогона или Хаффмана.Но это не сработает здесь.Маловероятно, чтобы в именах было достаточно избыточности, чтобы иметь существенное значение.Другой заключается в создании коротких имен и ведении справочной таблицы.Это то, что горько делает.Поскольку вы запретили создание собственной таблицы поиска ( без отправки результата в базу данных ), единственным вариантом является использование встроенных средств Windows.
Когда вы сохраняете файл вВ современной версии Windows файловая система автоматически создаст короткое имя файла 8.3, которое позволит старым приложениям просматривать и открывать файл.Вы можете получить короткое имя файла очень просто, например, так:
>>> import win32api
>>> win32api.GetShortPathName(r"E:\Dropbox\Rocket Cottage\Sicilian fennel and orange salad with red onion and mint.fdx")
'E:\\Dropbox\\ROCKET~1\\SICILI~1.FDX'
Чтобы преобразовать обратно:
>>> win32api.GetLongPathName(r"E:\Dropbox\ROCKET~1\SICILI~1.FDX")
'E:\\Dropbox\\Rocket Cottage\\Sicilian fennel and orange salad with red onion and mint.fdx'
Если вы используете win32api
, вы нарушаете ваше требование не использовать третьюпартийная библиотека (хотя в установке Windows, которая, честно говоря, граничит с религиозной манией), тогда вы можете использовать subprocess
для вызова dir /X
.
C:\Users\xxxxx>dir /x E:\Dropbox\ROCKET~1\SICILI~1.FDX
Volume in drive E is Enigma
Volume Serial Number is D45D-0655
Directory of E:\Dropbox\ROCKET~1
2013-04-17 18:07 17,125 SICILI~1.FDX Sicilian fennel and orange salad with red onion and mint.fdx
C:\Users\xxxxx>dir /x "E:\Dropbox\Rocket Cottage\Sicilian fennel and orange salad with red onion and mint.fdx"
Volume in drive E is Enigma
Volume Serial Number is D45D-0655
Directory of E:\Dropbox\Rocket Cottage
2013-04-17 18:07 17,125 SICILI~1.FDX Sicilian fennel and orange salad with red onion and mint.fdx