让 Windows 以不同方式处理具有相同扩展名的文件

让 Windows 以不同方式处理具有相同扩展名的文件

多个程序使用相同的文件扩展名,但格式完全不同且不兼容。例如,我.sch的计算机上的文件至少有 5 种不同的格式(TINA、PSpice、PADS、Protel 和 Eagle)。有没有办法让 Windows 以不同的方式处理它们,以便双击此类文件时可以在要打开它的程序中打开它?

Linux 用途神奇数字以文件本身来区分,只使用文件扩展名作为后备计划。(所有PNG 文件 从字节开始 89 50 4E 47 0D 0A 1A 0A,无论您如何命名它们。)如果 Windows 可以支持这一点,那就太好了,但实现起来可能非常困难。也许可以更简单,比如二级扩展名,比如filename.program1.schfilename.program2.sch?也许是某种可以动态重命名文件的过滤器?

更好的想法:将模糊的扩展名与预处理器(.bat 文件或专用应用程序)关联起来,该预处理器检查二级扩展名或进入文件本身并扫描魔术数字,然后启动适当的程序?

答案1

Windows 确实不是根据文件中的任何信息启动文件 - 为此构建数据库将需要大量的工作和编程。识别文件的唯一真正方法是通过文件中的二进制签名(如果文件有的话),这取决于软件作者的实现。

在 Windows 中,文件会传递给您为特定文件扩展名指定的程序。Windows 将文件扩展名确定为句点最后一次出现后的子字符串,因此您发布的文件名不可能如此。

您必须重命名文件(并为其赋予唯一的文件扩展名),或者编写批处理文件来启动相应的应用程序。有关更多详细信息,请参阅这篇 Technet 文章

答案2

我自己解决了:

我编写了一个 Python 脚本,读取文件的前几个字节并将它们与字典进行比较,然后根据魔法数字启动适当的程序。

import sys
import subprocess

magic_numbers = {
'OB': r'C:\Program Files (x86)\DesignSoft\Tina 9 - TI\TINA.EXE', # TINA
'*v': r'C:\Program Files (x86)\Orcad\Capture\Capture.exe', #PSpice
'DP': r'C:\Program Files (x86)\Design Explorer 99 SE\Client99SE.exe', #Protel
'\x00\xFE': r'C:\MentorGraphics\9.0PADS\SDD_HOME\Programs\powerlogic.exe', #PADS Logic
'\x10\x80': r'C:\Program Files (x86)\EAGLE-5.11.0\bin\eagle.exe', # Eagle
}

filename = sys.argv[1]
f = open(filename, 'rb')
# Read just enough bytes to match the keys
magic_n = f.read(max(map(len, magic_numbers)))

subprocess.call([magic_numbers[magic_n], filename])

最新版本将在这里:在适当的程序中启动模糊文件

我尝试将文件扩展名与此脚本关联,但 Windows 7 不允许我这样做。它只是将其与 Python 关联,因此我进入注册表并手动添加了脚本名称。

如何将文件扩展名与 Python 脚本关联

还有改进空间,但已经可以正常工作。我可以双击具有相同 .sch 扩展名的不同文件,它们会在不同的应用程序中打开。

更新:我使用 cx_freeze 将其转换为 .exe,并带有外部 YAML 配置文件,这样就很容易关联了。另请参阅这个 libmagic 提案。不确定我是否应该将其打造成一个功能齐全的“适用于 Windows 的 libmagic 启动器”,或者是否最好只使用一个 .exe 和一个简单的 YAML 文件来处理一个文件扩展名。

答案3

首先,您可以重命名其中一种文件类型以获得新的扩展名,然后使用“打开方式”对话框设置默认程序来打开这些类型的文件。

但这并不能解决重命名问题。但是,您可以通过创建一个特定的文件夹来将某个程序中的所有文件放在其中,从而简化事情。然后,您可以编写一个脚本来自动将该文件夹中的文件重命名为新的文件扩展名。

您可能无法使用程序中的“打开文件”对话框,具体取决于它的设置方式。但如果您有一个包含所有文件的文件夹,那么您应该能够使用它。

一个更复杂但可能更好的方法是创建一个代理程序。保留所有文件扩展名,但让代理程序打开它们。让您的程序检查二进制文件并选择文件类型以及要启动的程序。这将需要您花一些时间编写程序,这对您来说可能是值得的,也可能不值得。

答案4

一种快速解决方案是向资源管理器上下文菜单添加其他上下文条目。或者使用“打开方式”上下文条目。第一种方法更方便,因为可以添加调用参数并指定“告知”名称。它还允许使用同一程序的不同版本打开文件(如果并行安装)。

当然,这种方法不是自动的。必须知道正确的应用。但对于基于数据库的检测会失败的文件类型(例如文本文件或其他没有“魔法数字”的文件),您始终可以选择。

顺便说一句:鲜为人知的操作系统“GEOS”(当时是 Win3 的竞争对手,并且遥遥领先)为所有文件设置了一个固定的 256 字节标头,用于存储创建应用程序、图标和版权声明(以及用于自己注释的自由字段)。由于这是文件的一部分,而不是文件系统或操作系统词典,因此当文件在文件系统之间移动甚至移动到不同的操作系统时,它是透明的(W95 有一个资源管理器扩展)。

相关内容