2012-03-16 63 views
9

在Delphi中,我構建的是HTTP應用程序或Web服務器。它基本上是整個網站內置到一個單一的EXE文件。我要嵌入的文件包括HTML,JS,CSS,SWF,PNG,XML等。資源名稱與原始文件名相同,.替換爲_。最終,EXE中會嵌入大約40-60個文件。如何檢查嵌入資源是否存在?

問題是我不想編寫包裝每個單獨文件的代碼。現在,我正在爲每個資源聲明一個常量,並在使用TResourceStream獲取資源時使用該常量。 HTTP請求是要求任何特定的文件,因爲我將有一堆文件,我不想單獨處理每個文件。另外,在將來,當我添加一個新文件進行嵌入時,我所需要做的就是將其添加到我的資源腳本(.rc)中。所以我決定改變我的機制,自動解析請求的資源名稱。例如,/Home.HTML被解析爲HOME_HTML,這應該是嵌入資源的名稱。我需要在加載之前檢查這樣的資源是否存在。

我可以嘗試加載它,捕捉任何異常如果資源不存在,這將產生調試錯誤。我如何去執行這樣的檢查,而不使用try..except

+5

你爲什麼要這麼做?擁有從文件系統讀取*的Web服務器的主要優點之一是可以更改站點上的內容,而無需更改服務器本身。現在,如果您需要更改文件或添加新文件,則必須構建新服務器,取下現有服務器,複製新服務器,然後重新啓動它。這看起來很糟糕,即使宕機時間相對較短... – 2012-03-16 23:12:03

+0

@MasonWheeler我其實有幾百個,實際上有近1000個應用程序將動態生成的其他文件。嵌入的東西只是關鍵的東西,永遠不會改變。以上描述僅僅是一個例子。我這樣做的原因是爲了分配。目標是能夠將這個單一的EXE發送給某個人,並讓他們立即能夠運行它。 – 2012-03-17 00:19:44

+1

我可以爲downvote得到一個解釋嗎?或者它只是一個常見的德爾菲仇敵? – 2012-03-17 00:23:13

回答

18

您可以使用FindResource API,像

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

+1並且接受,作品完美。 – 2012-03-16 22:56:56

2

使用Win32 API FindResource()函數。