首页 > 解决方案 > 如何以编程方式缩短 Windows 文件名 - “Bitly for filenames”?

问题描述

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

标签: windowswindows-10filenameswindows-server-2012-r2

解决方案


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

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

虽然 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'

如果 usingwin32api违反了您不使用第三方库的要求(尽管在 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

推荐阅读