2011-06-01 21 views
13

Estoy tratando de verificar si un archivo está en el servidor con el código C# detrás de mi página web ASP.NET. Sé que el archivo existe como lo puse en el servidor en un trozo de código de antemano. ¿Alguien puede ver por qué no está encontrando el archivo? Este es el código:Compruebe si existe un archivo en el servidor

wordDocName = "~/specifications/" + Convert.ToInt32(ViewState["projectSelected"]) + ".doc"; 
ViewState["wordDocName"] = wordDocName; 
if (File.Exists(wordDocName)) 
{ 
    btnDownloadWordDoc.Visible = true; 
} 
else 
{ 
    btnDownloadWordDoc.Visible = false; 
} 
+0

¿Está utilizando las convenciones de ruta de Unix en Windows? –

+0

@Kevin: más como URI/URL –

+0

@GreenScreen: ¿por qué convierte su ViewState en un int? Se convertirá nuevamente en una cadena y tendrá 2 conversiones con el riesgo de una ConversionException. – slfan

Respuesta

40

la ruta del archivo debe ser física, no virtual. Utilice

if (File.Exists(Server.MapPath(wordDocName))) 
+3

Información adicional sobre físico vs virtual: [Rutas de proyecto web ASP.NET] (http://msdn.microsoft.com/en-us/library/ms178116.aspx) – MikeM

+0

La respuesta, si se escribe para vb.net, necesita una 3er adicional, paréntesis de cierre. No pude editar la respuesta con un solo personaje, así que estoy comentando. – Doreen

1

Uso

Server.MapPath("~/specifications/" + Convert.ToInt32(ViewState["projectSelected"]) + ".doc") 

para obtener la ruta completa. Eso debería hacer el truco para ti.

0

usted tiene que convertir la ruta a una ruta física con Server.MapPath (relativePath)

if (File.Exists(filePath)) 

wordDocName = "~/specifications/" + ViewState["projectSelected"] + ".doc";   
btnDownloadWordDoc.Visible = File.Exists(Server.MapPath(wordDocName)); 
2

File.Exists() y probablemente todo lo que desea hacer con el archivo necesitará un camino real.

Su wordDocName es una URL relativa.

Utilice simplemente

string fileName = Server.MapPath(wordDocName); 
1

Es necesario utilizar, por ejemplo, Server.MapPath

wordDocName = Server.MapPath("~/specifications/" + Convert.ToInt32(ViewState["projectSelected"]) + ".doc"); 
    ViewState["wordDocName"] = wordDocName; 
    if (File.Exists(wordDocName)) 
    { 
     btnDownloadWordDoc.Visible = true; 
    } 
    else 
    { 
     btnDownloadWordDoc.Visible = false; 
    } 
0

El carácter "~" es un char especial en ASP.NET para obtener especificaciones ruta de acceso virtual y simplemente significa "directorio raíz de la aplicación". No se entiende por .NET BCL como la API File y debe asignarse primero a una ruta física con Server.MapPath() como otros indicaron.

-3

string docname="traintatkalantnoy.txt";

string a = (Server.MapPath(docname)); if (File.Exists(a))

0

esto podría no funcionar si el directorio que contiene el archivo es referenciado por un/enlace simbólico de conexiones. Tengo este caso en mi propia aplicación y si pongo la ruta REAL al archivo, File.Exists() devuelve verdadero. Pero si uso Server.MapPath pero la carpeta es de hecho un cruce con la carpeta, parece fallar. ¿Alguien experimentó el mismo comportamiento?

Cuestiones relacionadas