2012-03-16 15 views
9

In Delphi, sto invece creando un'applicazione HTTP o un server Web. È essenzialmente un intero sito Web integrato in un singolo file EXE. I file che sto incorporando includono HTML, JS, CSS, SWF, PNG, XML, ecc. I nomi delle risorse sono gli stessi del nome file originale, con . sostituito con _. Alla fine, ci saranno da qualche parte circa 40-60 file incorporati all'interno dell'EXE.Come posso verificare se una risorsa incorporata esiste o no?

Il problema è che non voglio scrivere il codice avvolgendo ogni singolo file. Al momento, sto dichiarando una costante per ogni risorsa e usando quella costante quando acquisisco la risorsa usando TResourceStream. La richiesta HTTP richiede un file particolare, e dato che avrò un sacco di file, non voglio un modo separato di gestire ogni file. Inoltre, in futuro, quando aggiungo un nuovo file da incorporare, tutto ciò che dovrei fare è aggiungerlo al mio Script di risorse (.rc). Così ho deciso di cambiare il mio meccanismo per risolvere automaticamente il nome file richiesto per il nome della risorsa. Ad esempio, /Home.HTML viene risolto in HOME_HTML che si suppone essere il nome della risorsa incorporata. Devo controllare se esiste una risorsa di questo tipo prima di caricarla.

ho potuto provare per caricarlo e catturare qualsiasi eccezione ma questo produrrebbe errori di eseguire il debug se la risorsa non esiste. Come potrei fare per eseguire un tale controllo senza utilizzare try..except?

+5

Perché vuoi farlo? Uno dei principali vantaggi di avere un server web che legge * dal file system * è che puoi modificare il contenuto del tuo sito senza dover cambiare il server stesso. Al momento, se devi modificare un file o aggiungere un nuovo file, dovrai creare un nuovo server, rimuovere quello esistente, copiarne uno nuovo e riavviarlo. Che sembra male, anche se il tempo di inattività è relativamente breve ... –

+0

@MasonWheeler In realtà ho centinaia, in realtà quasi un migliaio di altri file che l'applicazione genererà dinamicamente. Le cose che sono incorporate sono solo le cose fondamentali che non cambieranno mai. La descrizione precedente era solo un esempio. Il motivo per cui lo sto facendo è per la distribuzione. L'obiettivo è essere in grado di inviare solo questo singolo EXE a qualcuno e averli immediatamente in grado di eseguirlo. –

+1

Posso ottenere una spiegazione per il downvote per favore? O è solo uno dei soliti odiatori di Delphi? –

risposta

18

È possibile utilizzare l'API FindResource, qualcosa come

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

+1 e accettato, funziona perfettamente. –

2

Utilizzare la funzione Win32 API FindResource().

Problemi correlati