Как программно укоротить имя файла Windows - «Bitly для имен файлов»? - PullRequest
0 голосов
/ 16 февраля 2019

Есть ли простой способ взять очень длинное имя файла (которое содержит параметры и настройки, которые использовались для создания файла) и сократить его программно, чтобы сохранить в Windows?

Имя файла не может быть отправлено в службу сокращения URL-адресов (Bitly, Google и т. Д.), Поскольку информация конфиденциальна и сеть отделена.

Имя файладолжен быть сокращен внутри приложения и без использования сторонней библиотеки и без отправки результата в базу данных.

например, начинать с имени файла так долго, что Windows не сможет сохранитьэто:

E:\Results\Job\<SomeJobComponentName>\[A very long file name with the parameters and settings that were used to generate it].csv

И сохраните его как

E:\Results\Job\<SomeJobComponentName>\0eVfd878swg9.csv

И затем, когда файл будет прочитан, код может преобразовать

0eVfd878swg9.csv

обратно в

[A very long file name with the parameters and settings that were used to generate it].csv

Вроде как Bitly для имен файлов.

Речь идет не о шифровании содержимого файла.Просто убедитесь, что имена файлов любой длины могут быть сохранены без помех.Имя файла должно быть преобразовано обратно в оригинал, не открывая файл, чтобы не сокращенное имя файла можно было проанализировать и просмотреть в средстве просмотра (которое пользователь использует для просмотра файлов результатов в каталоге заданий).

Ранее я пытался использовать префикс "\? \" Для полного пути, но по какой-либо причине это не удается при использовании StreamWriter.Он не может справиться с этим обходным путем.

Дайте мне знать, если я ошибаюсь здесь неправильным деревом!

Используя C # 7.0, Windows Server 2012 R2 и рабочий стол Windows 10.

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Лучшим ответом является обновление до Windows Server 2016 или более поздней версии и включение длинных имен файлов.Нет смысла бороться с трудной работой на устаревшей серверной операционной системе, когда постоянное и официальное решение легко доступно.Спасибо всем за все комментарии.

0 голосов
/ 16 февраля 2019

В соответствии с вашим вопросом вы хотите начать с имени файла так долго, что 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...