web-dev-qa-db-ja.com

Windowsに同じ拡張子のファイルを異なる方法で処理させる

複数のプログラムが同じファイル拡張子を使用しますが、形式は完全に異なり、互換性がありません。たとえば、コンピューターには、少なくとも5つの異なる形式(TINA、PSpice、PADS、Protel、およびEagle)の.schファイルがあります。 Windowsにそれらを異なる方法で処理させて、そのようなファイルをダブルクリックすると、開かれるはずのプログラムでそのファイルが開かれるようにする方法はありますか?

Linuxは、ファイル自体で マジックナンバー を使用して区別し、フォールバックプランとしてファイル拡張子のみを使用します。 (すべて PNGファイルバイトで開始89 50 4E 47 0D 0A 1A 0A、たとえば、名前に関係なく。)Windowsがこれをサポートできればいいのですが、おそらく実装は非常に困難です。 filename.program1.schfilename.program2.schのような、第2レベルの拡張機能のようなもっと単純なものでしょうか。たぶん、その場でファイルの名前を変更するある種のフィルター?

より良いアイデア:あいまいな拡張子を、第2レベルの拡張子をチェックするプリプロセッサ(.batファイルまたは専用アプリ)に関連付けるか、ファイル自体にアクセスしてマジックナンバーをスキャンし、適切なプログラムを起動しますか?

10
endolith

私はそれを自分で解決しました:

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

最新バージョンはここにあります: 適切なプログラムであいまいなファイルを起動します

ファイル拡張子をこのスクリプトに関連付けようとしましたが、Windows7では許可されませんでした。代わりにPythonに関連付けただけなので、レジストリに移動してスクリプト名を手動で追加しました。

How to associate a file extension with a Python script

改善の余地はありますが、機能します。同じ.sch拡張子を持つ別のファイルをダブルクリックすると、別のアプリで開くことができます。

更新:外部YAML構成ファイルを使用してcx_freezeを使用して.exeに変換しましたが、簡単に関連付けることができます。 このlibmagicの提案 も参照してください。これを本格的な「libmagiclauncherfor Windows」にする必要があるのか​​、それとも1つの.exeファイルと単純なYAMLファイルで1つのファイル拡張子のみを処理する方がよいのかわかりません。

8
endolith

Windowsは、ファイル内の情報に基づいてファイルを起動しません-そのためのデータベースを構築するには、信じられないほどの作業とプログラミングが必要になります。ファイルを識別する唯一の真の方法は、ファイルにバイナリ署名がある場合は、ファイル内のバイナリ署名を使用することです。これは、実装するソフトウェアの作成者次第です。

Windowsでは、ファイルは特定のファイル拡張子に指定したプログラムに渡されます。 Windowsは、ファイルの拡張子をピリオドの最後の出現に続く部分文字列として決定するため、投稿したファイル名では不可能です。

ファイルの名前を変更する(そしてファイルに一意のファイル拡張子を付ける)か、バッチファイルを作成して適切なアプリケーションを起動する必要があります。詳細については、 このTechnetの記事 を参照してください。

9
Breakthrough

まず、ファイルの種類の1つを名前を変更して新しい拡張子を付け、[プログラムから開く]ダイアログを使用して、これらの種類のファイルを開くデフォルトのプログラムを設定します。

ただし、これは名前の変更の問題には対応していません。ただし、いずれかのプログラムのすべてのファイルを配置する特定のフォルダーを作成することで、作業を簡素化できます。次に、そのフォルダー内のファイルの名前を新しいファイル拡張子に自動的に変更するスクリプトを作成できます。

設定方法によっては、プログラムの「ファイルを開く」ダイアログで問題が発生する場合があります。ただし、すべてのファイルが含まれる単一のフォルダーがある場合は、それを使用できるはずです。

より複雑ですが、潜在的により良い方法は、プロキシプログラムを作成することです。すべてのファイル拡張子を保持しますが、プロキシプログラムで開くようにします。プログラムにバイナリを調べてもらい、それがどのタイプのファイルで、どのプログラムを開始するかを選択します。これはあなたがあなたのプログラムを書くのにいくらかの時間を費やす必要があるでしょう、それはあなたにとってそれの価値があるかもしれないし、そうでないかもしれません。

3
Joel

Microsoft Visual Studioは、最後のアイデアを実装します。 .slnファイルを起動すると、小さなスタブがソリューションのバージョン番号を確認し、正しいバージョンのVisual Studioを起動します(複数のバージョンがインストールされている場合)。

もちろん、ここでの調整は少し簡単です。(A)ファイル形式はこのために設計されており、(B)これらはすべて同じメーカーの同じソフトウェアのバージョンだからです。

2
MSalters

簡単な解決策は、エクスプローラーのコンテキストメニューにコンテキストエントリを追加することです。または、「openwith」コンテキストエントリを使用します。 1つ目は、呼び出しパラメーターを追加して「telling」名を指定できるため、より快適です。また、同じプログラムの異なるバージョンでファイルを開くこともできます(並列にインストールされている場合)。

もちろん、このアプローチは自動ではありません。適切なアプリケーションを知っている必要があります。ただし、データベースベースの検出が失敗するファイルタイプ(テキストファイルや「マジックナンバー」のないその他のファイルなど)の場合は、いつでも選択できます。

ところで:あまり知られていないOS「GEOS」(これはWin3の競合相手であり、はるか先にありました)には、作成中のアプリケーション、アイコン、著作権表示が保存されているすべてのファイルの256バイトのヘッダーが固定されていました(自分のメモ)。これはファイルの一部であり、ファイルシステムやOSディクショナリではないため、ファイルがファイルシステム間または別のOSに移動されたときに透過的でした(W95のExplorer拡張機能がありました)。

1
Peter Painter