Nhận Windows để xử lý các tệp có cùng phần mở rộng khác nhau


10

Nhiều chương trình sử dụng cùng một phần mở rộng tệp, nhưng các định dạng hoàn toàn khác nhau và không tương thích. Chẳng hạn, tôi có .schcác tệp trên máy tính của mình có ít nhất 5 định dạng khác nhau (TINA, PSpice, PADS, Protel và Eagle). Có cách nào để Windows xử lý chúng theo cách khác, để nhấp đúp vào tệp như vậy sẽ mở tệp đó trong chương trình mà nó có nghĩa là được mở trong?

Linux sử dụng các số ma thuật trong chính các tệp để phân biệt và chỉ sử dụng các phần mở rộng tệp làm kế hoạch dự phòng. ( Ví dụ, tất cả các tệp PNG bắt đầu bằng các byte 89 50 4E 47 0D 0A 1A 0A , bất kể bạn đặt tên chúng là gì.) Thật tuyệt nếu Windows có thể hỗ trợ điều này, nhưng có lẽ rất khó thực hiện. Có lẽ một cái gì đó đơn giản hơn như một phần mở rộng cấp hai, như filename.program1.schfilename.program2.sch? Có lẽ một số loại bộ lọc đổi tên các tập tin một cách nhanh chóng?

Ý tưởng tốt hơn: Liên kết tiện ích mở rộng mơ hồ với bộ xử lý trước (tệp .bat hoặc ứng dụng chuyên dụng) để kiểm tra tiện ích mở rộng cấp hai hoặc tự đi vào tệp và quét số ma thuật và sau đó khởi chạy chương trình thích hợp?


1
TrID có thể khiến bạn quan tâm - nó có cơ sở dữ liệu gồm 4400 chữ ký nhị phân.
josh3736

Tôi nhớ điều này từng xảy ra trên HĐH RISC nhưng đôi khi được sử dụng để gây ra sự thất vọng khi bạn có nhiều ứng dụng có thể xử lý cùng loại tệp và nó sẽ mở chương trình với chương trình sai!
Matt Wilko

Câu trả lời:


9

Windows không khởi chạy các tệp dựa trên bất kỳ thông tin nào trong tệp - xây dựng cơ sở dữ liệu cho việc đó sẽ tốn một lượng công việc và lập trình đáng kinh ngạc. Cách duy nhất đúng để xác định một tệp là bằng chữ ký nhị phân trong tệp, nếu tệp thậm chí có tệp đó và điều này tùy thuộc vào tác giả phần mềm thực hiện.

Trong Windows, các tệp được chuyển đến chương trình bạn chỉ định cho một phần mở rộng tệp cụ thể. Windows xác định phần mở rộng của tệp là chuỗi con theo sau lần xuất hiện cuối cùng của một khoảng thời gian, do đó không thể thực hiện được với tên tệp bạn đã đăng.

Bạn phải đặt tên lại cho các tệp (và cung cấp cho chúng các phần mở rộng tệp duy nhất) hoặc viết một tệp bó để khởi chạy ứng dụng phù hợp cho bạn. Để biết thêm chi tiết, xem bài viết Technet này .


1
Tôi đã cố gắng để làm cho công việc này bằng cách tạo một phần mở rộng tệp duy nhất, nhưng ngay cả khi anh ta làm vậy, vấn đề thực sự là hầu hết các chương trình sẽ chỉ nhận ra các tiện ích mở rộng của riêng họ bất chấp nội dung và dù sao cũng không mở chúng.
KCotreau

2
Tôi rất thích nhìn thấy ai đó làm điều này, mặc dù. Tôi nghĩ rằng cách bạn sẽ giải quyết là có một chương trình mở các tệp của tất cả các tiện ích mở rộng và để chương trình đó giữ cơ sở dữ liệu của riêng nó (sử dụng các luồng thay thế của NTFS để theo dõi các tệp) và khởi chạy từng chương trình tương ứng mà người dùng xác định từng tập tin. Sẽ không nhiều công việc, nhưng tôi có thể nhìn thấy rất nhiều vấn đề với cách tiếp cận này, do đó có thể là lý do tại sao không có ai đã thực hiện nó.
Sasha Chedygov

2
nó sẽ không quá khó - có các công cụ thực hiện điều đó (trid hoặc tệp) và hầu hết các công cụ dựa trên posix nhìn vào các tiêu đề tệp chứ không phải các phần mở rộng. Đó không phải là vấn đề lựa chọn thiết kế, hơn là nỗ lực. Đương nhiên điều này sẽ khó hơn rất nhiều đối với bên thứ ba, nhưng nếu MS cảm thấy cần thiết, thì đây có thể là chuyện nhỏ nhặt
Journeyman Geek

3
"Sử dụng các luồng thay thế của NTFS để theo dõi các tệp." Tôi thấy rõ ràng tại sao Windows không triển khai mô hình Linux / POSIX. Đơn giản là nó yêu cầu một tập tin đọc. Nếu đó là trường hợp, mỗi khi bạn nhấp chuột phải vào một tệp, nó phải loại bỏ một tệp đắt tiền được đọc. Thậm chí tệ hơn, hãy tưởng tượng nếu đó là một tập tin mạng và kết nối có độ trễ đáng chú ý. Mọi người sẽ đổ lỗi cho WinDoze. Raymond Chen sẽ đánh vào kỹ thuật này cũng khiến nó sẽ khiến một tập tin bị thu hồi nếu nó nằm trong khu vực lưu trữ cấp ba.
Surfasb

1
Nhưng Windows không cho phép bạn phá vỡ mô hình đó. . .
Surfasb

8

Tôi tự giải quyết nó:

Tôi đã tạo một tập lệnh Python đọc vài byte đầu tiên của tệp và so sánh chúng với một từ điển, sau đó khởi chạy chương trình thích hợp dựa trên các số ma thuật.

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

Phiên bản mới nhất sẽ có ở đây: Khởi chạy các tệp mơ hồ trong chương trình thích hợp

Tôi đã cố gắng liên kết phần mở rộng tệp với tập lệnh này, nhưng Windows 7 không cho phép tôi. Thay vào đó, nó chỉ liên kết nó với Python, vì vậy tôi đã đi vào sổ đăng ký và thêm tên tập lệnh theo cách thủ công.

Cách liên kết phần mở rộng tệp với tập lệnh Python

Phòng để cải thiện, nhưng nó hoạt động. Tôi có thể nhấp đúp vào các tệp khác nhau có cùng phần mở rộng .sch và chúng mở trong các ứng dụng khác nhau.

Cập nhật: Tôi đã chuyển đổi nó thành .exe bằng cx_freeze, với tệp cấu hình YAML bên ngoài và thật dễ dàng để liên kết. Xem thêm đề nghị libmagic này . Không chắc chắn liệu tôi có nên biến nó thành một "trình khởi chạy libmagic đầy đủ cho Windows" hay không nếu chỉ xử lý một phần mở rộng tệp với một .exe và một tệp YAML đơn giản.


2
Điều này thực sự sẽ là tầm thường để viết như một exe. . .
Surfasb

Không, nếu bạn không biết cách viết exes :)
endolith

1
Đó không phải là một tiếng gõ vào ya. Đó là một cái gì đó cho bản thân tôi :)
Surfasb

@surasb: Vậy bạn đã viết cho tôi một .exe chưa? Thật tầm thường phải không? :)
endolith

Tôi hoàn toàn quên! Tôi đã gặp rắc rối với các lưới 3D trên Silverlight trong tuần qua. Tối nay, sau khi tôi trông trẻ mảng RAID này. . .
Surfasb

3

Để bắt đầu, bạn có thể đổi tên một trong các loại tệp để có tiện ích mở rộng mới và sử dụng hộp thoại "mở bằng" để đặt chương trình mặc định để mở các loại tệp đó.

Điều này không giải quyết vấn đề đổi tên mặc dù. Nhưng bạn đơn giản hóa mọi thứ bằng cách tạo một thư mục cụ thể nơi bạn đặt tất cả các tệp từ một trong các chương trình. Sau đó, bạn có thể viết một tập lệnh để tự động đổi tên các tệp trong thư mục đó thành phần mở rộng tệp mới của bạn.

Bạn có thể gặp rắc rối với đoạn hội thoại "Mở tệp" trong chương trình của mình, tùy thuộc vào cách thiết lập. Nhưng nếu bạn có một thư mục duy nhất trong đó tất cả các tệp của bạn là bạn sẽ có thể sử dụng nó.

Một cách phức tạp hơn, nhưng có khả năng tốt hơn là tạo một chương trình proxy. Giữ tất cả các phần mở rộng tập tin, nhưng chúng sẽ được mở bởi chương trình proxy. Yêu cầu chương trình của bạn kiểm tra nhị phân và chọn loại tệp nào và chương trình nào sẽ bắt đầu. Điều này sẽ yêu cầu bạn dành một chút thời gian để viết chương trình của bạn, có thể có hoặc không có giá trị với bạn.


Có, nhưng sử dụng tiện ích mở rộng hoàn toàn khác nhau có nghĩa là bạn thường không thể mở các tệp từ trong chương trình.
endolith

vâng tôi đã chỉ ra điều đó Phương pháp thứ hai tôi đề nghị sẽ không có vấn đề đó mặc dù.
Joel

2

Microsoft Visual Studio thực hiện ý tưởng cuối cùng của bạn. Khi bạn khởi chạy tệp .sln, một sơ khai nhỏ sẽ kiểm tra số phiên bản giải pháp và khởi chạy phiên bản chính xác của Visual Studio (nếu bạn đã cài đặt nhiều phiên bản).

Tất nhiên, việc phối hợp ở đây dễ dàng hơn một chút vì (A) định dạng tệp được thiết kế cho điều này và (B) chúng là tất cả các phiên bản của cùng một phần mềm, từ cùng một nhà sản xuất.


1

Một giải pháp nhanh chóng là thêm các mục ngữ cảnh bổ sung vào menu ngữ cảnh explorer. Hoặc để sử dụng mục nhập ngữ cảnh 'mở với'. Đầu tiên là thoải mái hơn khi người ta có thể thêm các tham số cuộc gọi và chỉ định tên 'nói'. Nó cũng cho phép mở một tệp với các phiên bản khác nhau của cùng một chương trình (nếu được cài đặt song song).

Tất nhiên, aproach này không tự động. Người ta phải biết ứng dụng thích hợp. Nhưng đối với các loại tệp mà phát hiện dựa trên cơ sở dữ liệu sẽ thất bại (ví dụ: tệp văn bản hoặc các tệp khác không có "số ma thuật"), bạn luôn có lựa chọn.

BTW: Hệ điều hành ít được biết đến 'GEOS' (vốn là đối thủ cạnh tranh của Win3 ở thời điểm hiện tại) đã có tiêu đề 256 byte cố định cho tất cả các tệp nơi ứng dụng tạo, biểu tượng thông báo bản quyền được lưu trữ (cùng với trường miễn phí cho ghi chú riêng). Vì đây là một phần của tệp chứ không phải hệ thống tệp hoặc từ điển HĐH, nên nó trong suốt khi các tệp được di chuyển qua các hệ thống tệp hoặc thậm chí đến một HĐH khác (có phần mở rộng explorer cho W95).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.