如何以编程方式缩短 Windows 文件名 - "Bitly for filenames"?
How to shorten a Windows filename programmatically - "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>[=13=]eVfd878swg9.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 个字符]component(反斜杠之间的位:文件夹或文件名)和几乎 32,767 个字符,或大约 9 个 A4 页,用于整个路径,对于大多数正常用途来说应该足够了。
如果您处理的是 NTFS 以外的文件系统(例如 FAT、NFS、ISO-9660),则限制要严格得多。这是关于 Windows 10 周年更新 (2016) 或更高版本的 NTFS。
虽然Windows将保存和检索具有这么长路径的文件,但有可能some APIs will not。这个答案假设文件实际上是以你想要的名字保存的,但你必须将一个更短的名字传递给这样的 API.
如果路径或文件名真的太长以至于 Windows 无法保存它,那么该文件实际上不能以该名称存在,您将不得不将该名称放在文件系统之外的某个地方,并且之一你的约束是没有将结果发送到数据库,所以排除了这种可能性。
有两种压缩方法。一种是利用要压缩的数据中的冗余,例如 运行 长度编码或霍夫曼编码。但这在这里行不通。名称中不太可能有足够的冗余来产生显着差异。另一个是生成短名称并维护查找 table。这就是 bitly 所做的。由于您不允许创建自己的查找 table( 不将结果发送到数据库),您唯一的选择是使用内置 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 或更高版本并打开长文件名。
当永久和官方解决方案很容易获得时,在过时的服务器操作系统上进行艰苦的战斗是没有意义的。
谢谢大家的评论。
有没有一种简单的方法来获取一个很长的文件名(其中包含用于生成文件的参数和设置)并以编程方式缩短它以便节省 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>[=13=]eVfd878swg9.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 个字符]component(反斜杠之间的位:文件夹或文件名)和几乎 32,767 个字符,或大约 9 个 A4 页,用于整个路径,对于大多数正常用途来说应该足够了。
如果您处理的是 NTFS 以外的文件系统(例如 FAT、NFS、ISO-9660),则限制要严格得多。这是关于 Windows 10 周年更新 (2016) 或更高版本的 NTFS。
虽然Windows将保存和检索具有这么长路径的文件,但有可能some APIs will not。这个答案假设文件实际上是以你想要的名字保存的,但你必须将一个更短的名字传递给这样的 API.
如果路径或文件名真的太长以至于 Windows 无法保存它,那么该文件实际上不能以该名称存在,您将不得不将该名称放在文件系统之外的某个地方,并且之一你的约束是没有将结果发送到数据库,所以排除了这种可能性。
有两种压缩方法。一种是利用要压缩的数据中的冗余,例如 运行 长度编码或霍夫曼编码。但这在这里行不通。名称中不太可能有足够的冗余来产生显着差异。另一个是生成短名称并维护查找 table。这就是 bitly 所做的。由于您不允许创建自己的查找 table( 不将结果发送到数据库),您唯一的选择是使用内置 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 或更高版本并打开长文件名。 当永久和官方解决方案很容易获得时,在过时的服务器操作系统上进行艰苦的战斗是没有意义的。 谢谢大家的评论。