2012-03-16 13 views
9

En Delphi, estoy compilando una aplicación HTTP, o un servidor web en su lugar. Básicamente es un sitio web completo integrado en un solo archivo EXE. Los archivos que estoy incrustando incluyen HTML, JS, CSS, SWF, PNG, XML, etc. Los nombres de los recursos son los mismos que los del nombre original, con el . reemplazado por un _. Al final, habrá alrededor de 40-60 archivos incrustados dentro del EXE.¿Cómo puedo verificar si existe o no un recurso incrustado?

El problema es que no quiero escribir el código que envuelve cada uno de los archivos. En este momento, estoy declarando una constante para cada recurso y usando esa constante al adquirir el recurso usando TResourceStream. La solicitud de HTTP está solicitando un archivo en particular, y como tendré varios archivos, no quiero una forma separada de manejar cada archivo. Además, en el futuro, cuando agregue un nuevo archivo para incrustarlo, todo lo que debería hacer es agregarlo a mi Script de Recursos (.rc). Así que decidí cambiar mi mecanismo para resolver automáticamente el nombre de archivo solicitado al nombre del recurso. Por ejemplo, /Home.HTML se resuelve en HOME_HTML, que se supone que es el nombre del recurso incrustado. Necesito verificar si tal recurso existe antes de cargarlo.

pude tratar para cargarlo y captura de cualquier excepción pero esto produciría errores de depuración si el recurso no existe. ¿Cómo voy a realizar dicho control sin usar try..except?

+5

¿Por qué quieres hacer eso? Una de las principales ventajas de tener un servidor web que lee * del sistema de archivos * es que puede cambiar el contenido de su sitio sin tener que cambiar el servidor. En este momento, si necesita cambiar un archivo o agregar un nuevo archivo, tendrá que crear un nuevo servidor, tomar el existente, copiar el nuevo y reiniciarlo. Eso se ve mal, incluso si el tiempo de inactividad es relativamente corto ... –

+0

@MasonWheeler De hecho, tengo cientos, de hecho casi mil otros archivos que la aplicación generará dinámicamente. Lo que está incrustado es solo el material crítico que nunca cambiará. La descripción anterior fue solo una muestra. La razón por la que hago esto es por distribución. El objetivo es poder enviar solo este EXE a alguien y hacer que puedan ejecutarlo inmediatamente. –

+1

¿Puedo obtener una explicación para el voto a favor, por favor? ¿O es solo uno de los habituales enemigos de Delphi? –

Respuesta

18

Puede utilizar la API de FindResource, algo así como

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

+1 y aceptado, funciona perfecto. –

2

Utilice la función Win32 API FindResource().

Cuestiones relacionadas