如何以编程方式缩短Windows文件名 - “Bitly for filenames”?

问题描述 投票:-1回答:2

是否有一种简单的方法来获取一个非常长的文件名(包含用于生成文件的参数和设置)并以编程方式缩短它以便在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桌面。

windows windows-10 filenames windows-server-2012-r2
2个回答
1
投票

根据您的问题,您希望以文件名开头,以至于Windows无法保存它。对于整个路径,限制是每个组件255个字符(反斜杠之间的位:文件夹或文件名)和非常近32,767个字符,或大约9个A4页面,这对于大多数正常目的应该是足够的。

如果您正在处理NTFS以外的文件系统(例如FAT,NFS,ISO-9660),则限制要严格得多。这是关于Windows 10周年更新(2016)或更高版本的NTFS。

虽然Windows将保存和检索具有这么长的路径的文件,但有可能是some APIs will not。此答案假定文件实际上以您想要的名称保存,但您必须将较短的名称传递给此类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

0
投票

最佳答案似乎是升级到Windows Server 2016或更高版本并打开长文件名。当一个永久的官方解决方案很容易获得时,过时的服务器操作系统就没有必要与艰苦的战斗工作作斗争。感谢所有人的评论。

© www.soinside.com 2019 - 2024. All rights reserved.