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


10

多个程序使用相同的文件扩展名,但是格式完全不同且不兼容。例如,.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
TrID可能是您感兴趣的-它具有4400个二进制签名的数据库。
josh3736 2011年

我记得这曾经在RISC OS上发生过,但是当您有多个可以处理相同文件类型的应用程序时,有时会引起挫败感,并使用错误的程序打开该程序!
马特·威尔科

Answers:


9

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

在Windows中,文件将传递到您为特定文件扩展名指定的程序。Windows将文件的扩展名确定为最后一个句点之后的子字符串,因此无法使用发布的文件名。

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


1
我试图通过创建一个唯一的文件扩展名来完成这项工作,但是即使他做到了,真正的问题是,尽管有内容,但大多数程序只能识别它们自己的扩展名,并且无论如何都不会打开它们。
KCotreau

2
不过,我很想看到有人这样做。我认为解决该问题的方法是,用一个程序打开所有扩展名的文件,并使该程序保留自己的数据库(使用NTFS的备用流来跟踪文件),并启动用户为之定义的每个程序每个文件。不需要那么多的工作,但是我可以看到这种方法存在很多问题,所以这可能就是为什么没有人这样做的原因。
2011年

2
这并不难-有工具可以做到这一点(试用版或文件),大多数基于posix的oses都关注文件头而不是扩展名。它所涉及的工作量与其说是设计选择,不如说是工作量。对于第三方而言,这自然会困难得多,但是如果MS认为有必要,这可能会变得微不足道
Journeyman Geek

3
“使用NTFS的备用流来跟踪文件。” 对我来说很明显,为什么Windows不实现Linux / POSIX模型。简单地说,它需要读取文件。如果是这种情况,每次您右键单击一个文件时,它都必须触发读取昂贵的文件。更糟糕的是,想象一下它是否是一个网络文件,并且连接有明显的滞后。人们只会责怪WinDoze。雷蒙德·陈(Raymond Chen)会对该技术进行猛烈抨击,还可能导致文件在第三存储区域中时被召回。
surfasb

1
但是Windows确实允许您破坏该模型。。。
surfasb

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])

最新版本将在此处:在适当的程序中启动歧义文件

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

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

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

更新:我已经使用cx_freeze将其转换为.exe,带有一个外部YAML配置文件,并且很容易关联。另请参阅此libmagic建议。不知道我是否应该把它做成一个成熟的“ Windows版libmagic启动器”,还是最好只用一个.exe和一个简单的YAML文件来处理一个文件扩展名。


2
作为exe编写实际上是微不足道的。。。
surfasb

不,如果您不知道如何编写exes :)
endolith 2011年

1
这不是敲门。这对我来说是一件
好事

@surasb:那你给我写了一个.exe吗?这很简单,对吧?:)
endolith

我完全忘记了!在过去的一周中,我一直在使用Silverlight上的3D网格。今晚晚些时候,在我照看了这个RAID阵列之后。。。
surfasb

3

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

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

根据程序的设置,您可能无法在程序中使用“打开文件”对话框。但是,如果您在一个文件夹中存放了所有文件,则应该可以使用它。

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


是的,但使用完全不同的扩展意味着你往往不能从打开的文件的程序。
endlith 2011年

是的,我指出了。我建议的第二种方法不会有这个问题。
乔尔,

2

Microsoft Visual Studio实现了您的最后一个想法。启动.sln文件时,一个小的存根会检查解决方案的版本号,并启动正确版本的Visual Studio(如果已安装多个版本)。

当然,这里的协调要容易一些,因为(A)为此目的设计了文件格式,并且(B)它们是同一制造商的同一软件的所有版本。


1

一种快速的解决方案是将其他上下文条目添加到资源管理器上下文菜单。或使用“打开方式”上下文条目。第一个比较舒适,因为可以添加呼叫参数并指定“告诉”名称。它还允许打​​开使用同一程序的不同版本的文件(如果并行安装)。

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

顺便说一句:鲜为人知的操作系统“ GEOS”(它是Win3的竞争对手,遥遥领先)对于创建应用程序的所有文件都有一个固定的256字节的标头,存储有版权声明的图标(以及用于自己的笔记)。由于这是文件的一部分,而不是文件系统或OS词典,因此当文件跨文件系统甚至移动到另一个OS(W95的浏览器扩展)时,它是透明的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.