是否有一种简单的方法来获取一个非常长的文件名(包含用于生成文件的参数和设置)并以编程方式缩短它以便在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无法保存它。对于整个路径,限制是每个组件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
最佳答案似乎是升级到Windows Server 2016或更高版本并打开长文件名。当一个永久的官方解决方案很容易获得时,过时的服务器操作系统就没有必要与艰苦的战斗工作作斗争。感谢所有人的评论。