Windows'un aynı uzantıya sahip dosyaları farklı şekilde ele almasını sağlayın


10

Birden çok program aynı dosya uzantısını kullanır, ancak biçimler tamamen farklı ve uyumsuzdur. Örneğin, .schbilgisayarımda en az 5 farklı formatta (TINA, PSpice, PADS, Protel ve Eagle) dosyalar var. Windows'un onlara farklı davranmasını sağlamanın bir yolu var, böylece böyle bir dosyaya çift tıklandığında açılması planlanan programda açılır mı?

Linux farklılaştırmak için dosyaların içindeki sihirli sayıları kullanır ve bir yedek plan olarak yalnızca dosya uzantılarını kullanır. (Tüm PNG dosyaları , adlarına bakılmaksızın, örneğin baytlarla başlar 89 50 4E 47 0D 0A 1A 0A .) Windows'un bunu desteklemesi güzel olurdu, ancak uygulanması çok zordur. Belki gibi ikinci düzey uzantısı gibi basit bir şey filename.program1.schve filename.program2.sch? Belki dosyaları anında yeniden adlandıran bir tür filtre?

Daha iyi fikir: Belirsiz uzantıyı, ikinci düzey bir uzantı olup olmadığını denetleyen veya dosyanın içine giren ve sihirli numarayı tarayan ve daha sonra uygun programı başlatan bir ön işlemciyle (.bat dosyası veya özel bir uygulama) ilişkilendirmek?


1
TrID ilginizi çekebilir - 4400 ikili imza veritabanına sahiptir.
josh3736

Bunun RISC işletim sisteminde gerçekleştiğini hatırlıyorum, ancak bazen aynı dosya türünü işleyebilecek birden fazla uygulamanız olduğunda hayal kırıklığına neden olmak için kullanılır ve programı yanlış programla açacaktır!
Matt Wilko

Yanıtlar:


9

, Windows gelmez değil o iş ve programlama inanılmaz miktarda alacağını için bir veritabanı oluşturma - dosyada herhangi bilgilere dayanarak dosyaları başlatın. Bir dosyayı tanımlamanın tek gerçek yolu, dosyada varsa, dosyadaki ikili imzalardır ve bu, uygulanacak yazılım yazarına bağlıdır.

Windows'ta, dosyalar belirli bir dosya uzantısı için belirttiğiniz programa aktarılır. Windows, bir dosyanın uzantısını bir dönemin son örneğini izleyen alt dize olarak belirler, bu nedenle gönderdiğiniz dosya adlarıyla mümkün değildir.

Dosyaları yeniden adlandırmanız (ve onlara benzersiz dosya uzantıları vermeniz) veya sizin için uygun uygulamayı başlatmak için bir toplu iş dosyası yazmanız gerekir. Daha fazla ayrıntı için bu Technet makalesine bakın .


1
Benzersiz bir dosya uzantısı oluşturarak bu işi yapmaya çalışıyordum, ancak yapsa bile asıl sorun, çoğu programın içeriğe rağmen sadece kendi uzantılarını tanıyacağı ve yine de açmayacağıdır.
KCotreau

2
Yine de birinin bunu yaptığını görmek isterim. Ben bunu almak istiyorum yolu tüm uzantıları dosyaları açık tek bir program olması ve bu program kendi veritabanı tutmak (dosyaları izlemek için NTFS alternatif akışlarını kullanarak) ve kullanıcının tanımladığı her ilgili programı başlatmak olduğunu düşünüyorum her dosya. O olmaz bu kadar iş, ama bu kimsenin yapacağını yaptı muhtemelen yüzden bu yüzden, bu yaklaşımla sorunların çoğunu görebilirsiniz.
Sasha Chedygov

2
ÇOK zor olmaz - bunu yapan araçlar vardır (trid veya dosya) ve çoğu posix tabanlı oz, dosya başlıklarına bakar, uzantılara bakmaz. Bu, daha az çaba gerektiren bir tasarım seçeneğidir. Doğal olarak bu üçüncü bir parti için çok daha zor olurdu, ancak MS gerekli olduğunu hissettiğinde, bu yarı önemsiz olabilir
Journeyman Geek

3
"NTFS'nin alternatif akışlarını kullanarak dosyaları takip etmek." Windows'un neden Linux / POSIX modelini uygulamadığı açık. Sadece bir dosya okunmasını gerektirir. Bu durumda, bir dosyayı her sağ tıklattığınızda, pahalı bir dosya okumasını başlatması gerekir. Daha da kötüsü, bunun bir ağ dosyası olup olmadığını ve bağlantının fark edilebilir bir gecikme olduğunu hayal edin. İnsanlar sadece WinDoze'yi suçlarlardı. Raymond Chen, bu tekniğe dayandıracaktı, ayrıca üçüncül bir depolama alanındaysa bir dosyanın hatırlanmasına neden olacaktı.
surfasb

1
Ancak Windows bu modeli kırmanıza izin veriyor. . .
surfasb

8

Kendim çözdüm:

Bir dosyanın ilk birkaç baytını okuyan ve bunları bir sözlüğe benzeyen bir Python betiği hazırladım, sonra sihirli sayılara göre uygun programı başlatırım.

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

En son sürüm burada olacak: Belirsiz dosyaları uygun programda başlatın

Dosya uzantısını bu komut dosyasıyla ilişkilendirmeyi denedim, ancak Windows 7 bana izin vermedi. Sadece Python ile ilişkilendirdi, bu yüzden kayıt defterine gittim ve komut dosyası adını manuel olarak ekledim.

Bir dosya uzantısını Python betiği ile ilişkilendirme

İyileştirme odası, ama işe yarıyor. Aynı .sch uzantılı farklı dosyalara çift tıklayabilirim ve farklı uygulamalarda açılırlar.

Güncelleme: Harici bir YAML yapılandırma dosyası ile cx_freeze kullanarak bir .exe'e dönüştürdüm ve ilişkilendirmek kolaydır. Ayrıca bkz . Bu libmagic önerisi . Bunu tam teşekküllü bir "Windows için libmagic başlatıcısı" haline getirmem gerekip gerekmediğinden veya tek bir .exe uzantısına ve basit bir YAML dosyasına sahip olmanın daha iyi olup olmadığından emin değilim.


2
Bu bir exe olarak yazmak önemsiz olurdu. . .
surfasb

Exes

1
Bu sana bir darbe değildi. Kendim için bir şey oldu :)
surfasb

@surasb: Bana henüz bir .exe yazdınız mı? Önemsiz, değil mi? :)
endolith

Tamamen unuttum! Geçen hafta Silverlight'ta 3D ağlarla uğraşıyorum. Bu gece daha sonra, bu RAID dizisine bakıcılık yaptıktan sonra. . .
surfasb

3

Başlamak için, dosya türlerinden birini yeni bir uzantıya sahip olacak şekilde yeniden adlandırabilir ve bu tür dosyaları açmak için varsayılan bir program ayarlamak üzere "birlikte aç" iletişim kutusunu kullanabilirsiniz.

Bu yine de yeniden adlandırma sorunu ile ilgilenmez. Ancak, programların birinden tüm dosyaları koyduğunuz belirli bir klasör oluşturarak işleri basitleştiriyorsunuz. Ardından, bu klasördeki dosyaları yeni dosya uzantısına otomatik olarak yeniden adlandırmak için bir komut dosyası yazabilirsiniz.

Nasıl ayarlandığına bağlı olarak, programınızdaki bir "Dosya Aç" iletişim kutusunda sorun yaşayabilirsiniz. Ancak tüm dosyalarınızın bulunduğu tek bir klasörünüz varsa, bunu kullanabilmeniz gerekir.

Daha karmaşık, ancak potansiyel olarak daha iyi bir yol, bir proxy programı oluşturmak olacaktır. Tüm dosya uzantılarını koruyun, ancak proxy programı tarafından açılmalarını sağlayın. Programınızın ikili dosyayı incelemesini ve hangi dosya türünü ve hangi programı başlatacağını seçmesini sağlayın. Bu, programınızı yazmak için biraz zaman harcamanızı gerektirir; bu da sizin için değerli olabilir veya olmayabilir.


Evet, ancak tamamen farklı bir uzantı kullanmak, dosyaları programların içinden açamayacağınız anlamına gelir .
endolit

evet bunu işaret ettim. Önerdiğim ikinci yöntemde bu problem olmayacak.
Joel

2

Microsoft Visual Studio son fikrinizi uygular. Bir .sln dosyasını başlattığınızda, küçük bir saplama çözüm sürüm numarasını denetler ve doğru Visual Studio sürümünü başlatır (birden çok sürüm yüklüyse).

Tabii ki, buradaki koordinasyon biraz daha kolaydır, çünkü (A) dosya formatı bunun için tasarlanmıştır ve (B) hepsi aynı yazılımın aynı üreticinin versiyonlarıdır.


1

Hızlı bir çözüm, explorer bağlam menüsüne ek bağlam girişleri eklemektir. Veya 'birlikte aç' bağlam girişini kullanmak için. İlki, çağrı parametreleri ekleyebildiğinden ve 'söyleme' adları belirleyebildiğinden daha rahattır. Aynı programın farklı sürümlerine sahip bir dosyanın açılmasına da izin verir (paralel kuruluysa).

Tabii ki, bu yaklaşım otomatik değildir. Kişi doğru uygulamayı bilmek zorundadır. Ancak, veritabanı tabanlı algılamanın başarısız olacağı dosya türleri için (örneğin, metin dosyaları veya "sihirli numara" bulunmayan diğer dosyalar), her zaman seçim yapabilirsiniz.

BTW: Az bilinen OS 'GEOS' (tiem ve Win3 rakibi olan ve çok önde gelen), oluşturma uygulamasının, simgesinin bir telif hakkı bildirimlerinin depolandığı tüm dosyalar için sabit bir 256 bayt başlığı vardı ( kendi notları). Bu, dosya sisteminin veya bir OS sözlüğünün değil dosyanın bir parçası olduğundan, dosyalar dosya sistemlerinde veya hatta farklı bir işletim sistemine taşındığında şeffaftı (W95 için bir explorer uzantısı vardı).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.