是否有一种简单的方法来获取很长的文件名(其中包含用于生成文件的参数和设置)并以编程方式将其缩短,以便将其保存在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
文件名排序有点像
这与加密文件的内容无关。只是要确保可以无障碍地保存任何长度的文件名。文件名需要在不打开文件的情况下可以转换回原始文件,以便可以在查看器中解析并查看未缩短的文件名(用户使用该文件名来浏览作业目录中的结果文件)。
我以前尝试使用“ \?\”前缀作为完整路径,但是由于任何原因,使用StreamWriter时都会失败。它无法解决此变通办法。
让我知道我是否在这里树错树!
使用C#7.0,Windows Server 2012 R2和Windows 10桌面。
答案 0 :(得分: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
来调用{ {1}}。
dir /X
答案 1 :(得分:0)
最好的答案似乎是升级到Windows Server 2016或更高版本并打开长文件名。 当永久性和官方的解决方案很容易获得时,就没有必要在过时的服务器操作系统上进行艰苦的工作。 感谢大家的所有评论。