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


10

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

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

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


1
TrIDはあなたにとって興味があるかもしれません-それは4400バイナリ署名のデータベースを持っています。
josh3736 2011

これは以前はRISC OSで発生したことを覚えていますが、同じファイルタイプを処理できる複数のアプリがあり、間違ったプログラムでプログラムを開く場合に、時々フラストレーションを引き起こしました!
Matt Wilko、2011

@マット:ありがとうございます!file-extension.net/seeker/file_extension_sch
endolith

回答:


9

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

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

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


1
私は一意のファイル拡張子を作成することでこれを機能させようとしましたが、実際の問題は、ほとんどのプログラムがコンテンツに関係なく自分の拡張子のみを認識し、それを開かないということです。
KCotreau 2011

2
でも、誰かがこれをするのを見たいです。あなたはそれを回避する方法は、すべての拡張子のファイルを単一のプログラムで開き、そのプログラムに独自のデータベースを保持させ(NTFSの代替ストリームを使用してファイルを追跡する)、ユーザーが定義するそれぞれのプログラムを起動することだと思います各ファイル。それはないだろうという多くの仕事が、それは誰もがそれを行っていない、おそらく理由ですので、私は、このアプローチには多くの問題を見ることができます。
サーシャチェディゴフ2011

2
難しいことではありません。それを行うツール(trid、またはfile)があり、ほとんどのposixベースのosesは、拡張子ではなくファイルヘッダーを調べます。必要な労力よりも、設計の選択の問題が少ない。当然、これはサードパーティにとってははるかに困難ですが、MSが必要だと感じた場合、これは簡単なことです
ジャーニーマンオタク

3
「NTFSの代替ストリームを使用してファイルを追跡する。」WindowsがLinux / POSIXモデルを実装していない理由は明らかです。単純に、ファイルの読み取りが必要です。その場合は、ファイルを右クリックするたびに、高価なファイルの読み取りを開始する必要があります。さらに悪いことに、それがネットワークファイルであり、接続に顕著な遅延があったかどうかを想像してみてください。人々はWinDozeを非難するだけです。Raymond Chenは、この手法に打ちのめされ、3次ストレージ領域にあるファイルがリコールされる原因にもなります。
surfasb 2011

1
しかし、Windowsではそのモデルを破ることができます。。。
surfasb 2011

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を使用して、外部のYAML構成ファイルを使用して.exeに変換しました。関連付けるのは簡単です。このlibmagicの提案も参照してください。これを本格的な「Windows用libmagicランチャー」にする必要があるのか​​、1つの.exeと単純なYAMLファイルで1つのファイル拡張子のみを処理するのが良いのかわからない。


2
これは実際にはexeとして書くのは簡単です。。。
surfasb

あなたは、EXEファイル:)書く方法がわからないではない場合
endolith

1
それはうんざりではなかった。それは私自身にとっては何かでした:)
surfasb

@surasb:では、私に.exeをもう書いたのですか?ささいなことですよね?:)
エンドリス'17

私はすっかり忘れました!過去1週間、Silverlightで3Dメッシュをいじっていました。今夜遅く、私がこのRAIDアレイをベビーシッターした後。。。
surfasb 2011

3

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

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

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

より複雑ですが、潜在的にはより良い方法は、プロキシプログラムを作成することです。すべてのファイル拡張子を保持しますが、プロキシプログラムで開くようにします。プログラムでバイナリを調べて、ファイルの種類と起動するプログラムを選択します。これには、プログラムの作成にある程度の時間を費やす必要があります。


はい。ただし、まったく異なる拡張子を使用すると、プログラムからファイルを開くことができないことがよくあります。
内部石2011

はい私はそれを指摘しました。しかし、私が提案した2番目の方法にはその問題はありません。
ジョエル

2

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

もちろん、ここでの調整は、(A)ファイル形式がこれに合わせて設計されていること、および(B)それらが同じメーカーの同じソフトウェアのすべてのバージョンであるため、少し簡単です。


1

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

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

ところで、あまり知られていないOS 'GEOS'(同点ではるかに先のWin3の競合他社でした)には、作成中のアプリケーション、アイコン、著作権情報が格納されているすべてのファイルに256バイトの固定ヘッダーがありました(自分のメモ)。これはファイルシステムの一部であり、OSディクショナリではないため、ファイルシステム間で、または別のOSにファイルを移動した場合でも透過的でした(W95のエクスプローラー拡張機能がありました)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.