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

end*_*ith 10 windows windows-7 file-association file-extension

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

Linux 使用文件本身中的幻数来区分,并且仅使用文件扩展名作为后备计划。(例如,所有PNG 文件都 以 bytes 开头 89 50 4E 47 0D 0A 1A 0A,无论您如何命名它们。)如果 Windows 可以支持这一点就好了,但可能很难实现。也许更简单的东西,比如二级扩展,比如filename.program1.schfilename.program2.sch?也许某种过滤器可以即时重命名文件?

更好的主意:将不明确的扩展名与检查二级扩展名或进入文件本身并扫描幻数然后启动适当程序的预处理器(.bat 文件或专用应用程序)相关联?

Bre*_*ugh 9

Windows并没有推出基于文件中的任何信息文件-建立一个数据库,将采取的工作和节目数量惊人的。唯一真正识别文件的方法是通过文件中的二进制签名,如果文件甚至有二进制签名,这取决于软件作者来实现。

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

您必须重新命名文件(并为它们提供唯一的文件扩展名),或者编写一个批处理文件来为您启动适当的应用程序。有关更多详细信息,请参阅此 Technet 文章

  • “使用 NTFS 的备用流来跟踪文件。” 我很清楚为什么 Windows 没有实现 Linux/POSIX 模型。简单地说,它需要读取文件。如果是这种情况,每次您右键单击一个文件时,它都必须触发一次昂贵的文件读取。更糟糕的是,想象一下如果它是一个网络文件并且连接有明显的延迟。人们只会责怪WinDoze。Raymond Chen 会抨击这种技术,也会导致如果文件位于三级存储区域,它会导致文件被召回。 (3认同)
  • 不过,我很想看到有人这样做。我认为您可以绕过它的方法是让一个程序打开所有扩展名的文件,并让该程序保留自己的数据库(使用 NTFS 的备用流来跟踪文件)并启动用户定义的每个程序每个文件。它不会*那么多工作,但我可以看到这种方法有很多问题,所以这可能是没有人这样做的原因。 (2认同)
  • 这不会太难——有一些工具可以做到这一点(trid 或文件),大多数基于 posix 的 oses 查看文件头,而不是扩展名。它不是设计选择的问题,而是需要付出的努力。当然,这对第三方来说会困难得多,但如果 MS 觉得有必要,这可能是微不足道的 (2认同)

end*_*ith 8

我自己解决了:

我制作了一个 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])
Run Code Online (Sandbox Code Playgroud)

最新版本将在此处:在适当的程序中启动不明确的文件

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

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

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

更新:我已使用 cx_freeze 将其转换为 .exe,并带有外部 YAML 配置文件,并且很容易关联。另请参阅此 libmagic 提案。不确定我是否应该将它变成一个成熟的“Windows 的 libmagic 启动器”,或者最好只处理一个带有一个 .exe 和一个简单 YAML 文件的文件扩展名。

  • 这实际上是作为 exe 编写的微不足道的。. . (2认同)