2012-03-16 6 views
9

Trong Delphi, tôi đang xây dựng một Ứng dụng HTTP, hoặc một Web Server. Về cơ bản, nó là toàn bộ trang web được tích hợp vào một tệp EXE duy nhất. Các tệp tôi đang nhúng bao gồm HTML, JS, CSS, SWF, PNG, XML, v.v ... Tên tài nguyên giống với tên tệp gốc, với . được thay thế bằng một số _. Cuối cùng, sẽ có khoảng 40-60 tệp được nhúng bên trong EXE.Làm cách nào để kiểm tra xem tài nguyên được nhúng có tồn tại hay không?

Vấn đề là tôi không muốn viết mã gói từng và từng tệp riêng lẻ. Ngay bây giờ, tôi đang khai báo một hằng số cho mỗi tài nguyên và sử dụng hằng số đó khi lấy tài nguyên bằng cách sử dụng TResourceStream. Yêu cầu HTTP là yêu cầu cho bất kỳ tập tin cụ thể, và kể từ khi tôi sẽ có một loạt các tập tin, tôi không muốn một cách riêng biệt để xử lý mỗi tập tin. Ngoài ra, trong tương lai, khi tôi thêm một tệp mới được nhúng, tất cả những gì tôi cần làm là thêm tệp đó vào Tập lệnh tài nguyên (.rc) của mình. Vì vậy, tôi quyết định thay đổi cơ chế của mình để tự động giải quyết tên tệp được yêu cầu với tên của tài nguyên. Ví dụ: /Home.HTML được giải quyết thành HOME_HTML được cho là tên của tài nguyên được nhúng. Tôi cần phải kiểm tra xem một tài nguyên như vậy tồn tại trước khi tải nó.

Tôi có thể thử để tải và bắt bất kỳ ngoại lệ nhưng điều này sẽ tạo ra lỗi khi gỡ lỗi nếu tài nguyên không tồn tại. Làm cách nào để tôi thực hiện kiểm tra như vậy mà không cần sử dụng try..except?

+5

Tại sao bạn muốn làm điều đó? Một trong những ưu điểm chính của việc có một máy chủ web đọc * từ hệ thống tệp * là bạn có thể thay đổi nội dung trên trang web của mình mà không phải thay đổi chính máy chủ. Ngay bây giờ, nếu bạn cần thay đổi một tệp hoặc thêm một tệp mới, bạn sẽ phải tạo một máy chủ mới, lấy một máy chủ hiện có, sao chép tệp mới vào và khởi động lại nó. Điều đó có vẻ xấu, ngay cả khi thời gian chết tương đối ngắn ... –

+0

@MasonWheeler Tôi thực sự có hàng trăm, trên thực tế gần một nghìn tệp khác mà ứng dụng sẽ tạo động. Những thứ được nhúng chỉ là những thứ quan trọng mà sẽ không bao giờ thay đổi. Mô tả ở trên chỉ là một mẫu. Lý do tôi làm điều này là để phân phối. Mục đích là để có thể gửi chỉ EXE này cho một ai đó và cho họ ngay lập tức có thể chạy nó. –

+1

Tôi có thể nhận được một lời giải thích cho downvote xin vui lòng? Hay đó chỉ là một trong những kẻ thù ghét Delphi bình thường? –

Trả lời

18

Bạn có thể sử dụng FindResource API, một cái gì đó giống như

if(FindResource(hInstance, PChar(ResourceName), RT_RCDATA) <> 0)then begin 
    // load the resource 
end 
+0

+1 và được chấp nhận, hoạt động hoàn hảo. –

2

Sử dụng chức năng Win32 API FindResource().