none
reemplazar si existe nombre de pdf asp.net c# RRS feed

  • Pregunta

  • asi inserto mis archivos pdf

     string filePath = Flc.PostedFile.FileName;
                            string nombreArchivo = Path.GetFileName(filePath);
                            string ext = Path.GetExtension(nombreArchivo);
                            string tipo = String.Empty;
                            //Set the contenttype based on File Extension
                            switch (ext)
                            {
                                case ".doc":
                                    tipo = "application/vnd.ms-word";
                                    break;
                                case ".docx":
                                    tipo = "application/vnd.ms-word";
                                    break;
                                case ".xls":
                                    tipo = "application/vnd.ms-excel";
                                    break;
                                case ".xlsx":
                                    tipo = "application/vnd.ms-excel";
                                    break;
                                case ".jpg":
                                    tipo = "image/jpg";
                                    break;
                                case ".png":
                                    tipo = "image/png";
                                    break;
                                case ".gif":
                                    tipo = "image/gif";
                                    break;
                                case ".pdf":
                                    tipo = "application/pdf";
                                    break;
                            }
                            if (tipo != String.Empty)
                            {
                                Stream fs = Flca.PostedFile.InputStream;
                                BinaryReader br = new BinaryReader(fs);
                                Byte[] bytes = br.ReadBytes((Int32)fs.Length);
                                if (MyC.Agregar(nombreS, razonsocialS))
                                {
                                    //se muestran avisos
                                    MostrarAvisos(2);//insercion correcta
                                    txtnombre.Text = string.Empty;

    txtrazon.Text = string.Empty

    }

    Quiero que si encuentra un pdf ssu nombre igual lo modifique 

    por ejemplo

    archivo.pdf

    archivo(1).pdf

    archivo(2).pdf

    Espero me entiendan y me puedan yudar, gracias.


    martes, 10 de mayo de 2016 16:08

Respuestas

  • Ojo, que te falta concatenar la ruta completa al nombre del archivo. Sin ella, lo intentará guardar en el directorio actual del ejecutable, que típicamente será c:\windows\system32 cuando la pongas en producción en IIS, cosa que seguramente no es lo que quieres.

    Más o menos tendrás que hacer algo parecido a lo siguiente, pero lo he escrito de memoria y no lo he probado, así que puede que tenga algún errorcillo. No lo copies literalmente, solo es para que te sirva de inspiración, asegúrate de que lo entiendes y amóldalo a tus necesidades corrigiendo los fallos que encuentres.

    string filePath = Flc.PostedFile.FileName;
    string nombreArchivo = Path.GetFileName(filePath);
    string nombreSinExtension = Path.GetFileNameWitoutExtension(nombreArchivo);
    string extension = Path.GetExtension(nombreArchivo);
    string carpetaParaGuardar = Server.MapPath("/MiCarpeta");
    string rutaCompleta = Path.Combine(carpetaParaGuardar, nombreSinExtension);
    string rutaQueProbamos = rutaCompleta;
    If (File.Exists(rutaQueProbamos + extension))
    {
        int numero = 0;
        do 
        {
            ++numero;
            string fichero = rutaQueProbamos+ "(" + numero + ")" + extension;
        } while (File.Exists(fichero));
        rutaCompleta = fichero;
    }
    //Ahora, "rutaCompleta" trae el nombre de fichero que tienes que grabar
    

    jueves, 12 de mayo de 2016 5:36

Todas las respuestas

  • Quiero que si encuentra un pdf ssu nombre igual lo modifique 

    Después de recibir el nombre de fichero, comprueba si existe usando System.IO.File.Exists(...). En caso de que devuelva true, le añades un número y vuelves a comprobar si existe. Repite en un bucle incrementando el número hasta que el Exists devuelva false. Entonces ya grabas el contenido usando el último nombre de archivo que construiste.
    martes, 10 de mayo de 2016 19:32
  • buenas tardes:

    Algo asi tengo un poco de lo que explicas,

     como agregaria el numero en el if de exists??

    ?
    string filePath = Flc.PostedFile.FileName;
    string nombreArchivo = Path.GetFileName(filePath);

    if (File.Exists(nombreArchivo) == true)
                            {
                                nombreArchivo = Path.GetFileName(filePath) + "1";
                           
                                if (File.Exists(nombreArchivo) == false)
                                {
                                    nombreArchivo = Path.GetFileName(filePath);


     string ext = Path.GetExtension(nombreArchivo);
                                    string tipo = String.Empty;
                                    //Set the contenttype based on File Extension
                                    switch (ext)
                                    {
                                        case ".doc":
                                            tipo = "application/vnd.ms-word";
                                            break;
                                        case ".docx":
                                            tipo = "application/vnd.ms-word";
                                            break;
                                        case ".xls":
                                            tipo = "application/vnd.ms-excel";
                                            break;
                                        case ".xlsx":
                                            tipo = "application/vnd.ms-excel";
                                            break;
                                        case ".jpg":
                                            tipo = "image/jpg";
                                            break;
                                        case ".png":
                                            tipo = "image/png";
                                            break;
                                        case ".gif":
                                            tipo = "image/gif";
                                            break;
                                        case ".pdf":
                                            tipo = "application/pdf";
                                            break;
                                    }
                                    if (tipo != String.Empty)
                                    {
                                        Stream fs = Flc.PostedFile.InputStream;
                                        BinaryReader br = new BinaryReader(fs);
                                        Byte[] bytes = br.ReadBytes((Int32)fs.Length);

                                        if (MyC.Agrega(nombre, razonSocial))
                                        {

    miércoles, 11 de mayo de 2016 20:12
  • Ojo, que te falta concatenar la ruta completa al nombre del archivo. Sin ella, lo intentará guardar en el directorio actual del ejecutable, que típicamente será c:\windows\system32 cuando la pongas en producción en IIS, cosa que seguramente no es lo que quieres.

    Más o menos tendrás que hacer algo parecido a lo siguiente, pero lo he escrito de memoria y no lo he probado, así que puede que tenga algún errorcillo. No lo copies literalmente, solo es para que te sirva de inspiración, asegúrate de que lo entiendes y amóldalo a tus necesidades corrigiendo los fallos que encuentres.

    string filePath = Flc.PostedFile.FileName;
    string nombreArchivo = Path.GetFileName(filePath);
    string nombreSinExtension = Path.GetFileNameWitoutExtension(nombreArchivo);
    string extension = Path.GetExtension(nombreArchivo);
    string carpetaParaGuardar = Server.MapPath("/MiCarpeta");
    string rutaCompleta = Path.Combine(carpetaParaGuardar, nombreSinExtension);
    string rutaQueProbamos = rutaCompleta;
    If (File.Exists(rutaQueProbamos + extension))
    {
        int numero = 0;
        do 
        {
            ++numero;
            string fichero = rutaQueProbamos+ "(" + numero + ")" + extension;
        } while (File.Exists(fichero));
        rutaCompleta = fichero;
    }
    //Ahora, "rutaCompleta" trae el nombre de fichero que tienes que grabar
    

    jueves, 12 de mayo de 2016 5:36
  • pero tu lo buscas en una ruta de carpeta, es asi?...,yo los agrego en una tabla
    de sql,tengo campos: nombreArchivo=varchar, tipo=varchar y ruta=varbinary(max)
    asi se guarda bien,pero seria que antes de  insetar ruta(osea bytes)si existe no 
    deje agregar????
    string filePath = FileUpload.PostedFile.FileName;
    string nombreArchivo = Path.GetFileName(filePath);
    string ext = Path.GetExtension(nombreArchivo);

                            
    string tipo = String.Empty;
        //Set the contenttype based on File Extension
    switch (ext)
    {
    case ".doc":
    tipo = "application/vnd.ms-word";
    break;
    case ".docx":
    tipo = "application/vnd.ms-word";
    break;
    case ".xls":
    tipo = "application/vnd.ms-excel";
    break;
    case ".xlsx":
    tipo = "application/vnd.ms-excel";
    break;
    case ".jpg":
    tipo = "image/jpg";
    break;
    case ".png":
    tipo = "image/png";
    break;
    case ".gif":
    tipo = "image/gif";
    break;
    case ".pdf":
    tipo = "application/pdf";
    break;
    }
    if (tipo != String.Empty)
    {
    Stream fs = FileUpload.PostedFile.InputStream;
    BinaryReader br = new BinaryReader(fs);
    Byte[] bytes = br.ReadBytes((Int32)fs.Length);
                                        
    if (MyC.Agregar(nombreArchivo,tipo,bytes))
    {   
    //se muestran avisos
    MostrarAvisos(2);//insercion correcta
    txtnombre.Text = string.Empty;

    -------------------------------------------
     public bool Agregar(string nombreArchivo, string tipo, Byte[] ruta)
        {
            bool Bandera = false;
            try
            {
                SqlConnection oconn = new SqlConnection(myconsql);
                SqlCommand mycomman = new SqlCommand();
                mycomman.CommandText = "Sp_insert";
                mycomman.CommandType = CommandType.StoredProcedure;
                mycomman.Connection = oconn;
                oconn.Open();
             mycomman.Parameters.AddWithValue("@nombreArchivo", nombreArchivo);
                mycomman.Parameters.AddWithValue("@tipo", tipo);
                mycomman.Parameters.Add("@ruta", ruta);
                mycomman.ExecuteNonQuery();
                oconn.Close();
                Bandera = true;
            }
            catch (Exception x)
            {
                throw x;
            }
            return Bandera;
        }
    martes, 17 de mayo de 2016 14:22
  • Bueno, si en lugar de buscarlos en una carpeta los quieres buscar en base de datos, es el mismo principio y el mismo algoritmo. Simplemente cambia las llamadas a File.Exists por llamadas a base de datos que vean si el valor existe en la columna correspondiente. Y revisa el cálculo de las rutas para que se haga en el mismo formato en el que las almacenas en la base de datos.
    martes, 17 de mayo de 2016 14:41
  •  seria algo asi???...

    string fichero;

                            if (File.Exists("SELECT * FROM tabla WHERE nombreArchivo='nombreArchivo'" + ext))
                            {
                            int numero = 0;
                            do 
                            {
                            ++numero;
                            fichero = nombreArchivo+ "(" + numero + ")" + ext;
                            } while (File.Exists(fichero));

                            }

                                                   
    martes, 17 de mayo de 2016 18:14
  • No. Si hicieras eso te buscaría en la carpeta en disco un archivo cuyo nombre fuera el texto "SELECT * FROM tabla WHERE nombreArchivo='nombreArchivo'". Y lo que quieres es buscarlo en base de datos. Así que olvídate por completo del File.Exists, que aquí no tiene absolutamente nada que ver. Si quieres saber si está en la base de datos, lo que quieres no es ver si existe un fichero, sino si existe en la tabla una cadena de texto con el nombre del fichero. No podrás hacerlo con una única línea de texto (salvo que antes configures un ORM para acceder a la base de datos). Necesitarás crear una cadena de conexión, un SqlConnection, un SqlCommand que contenga la select, parametrizar la select y pasarle el nombre a buscar, lanzar el SqlCommand con un ExecuteScalar, cerrar correctamente la conexión, y examinar el valor devuelto por el ExecuteScalar. Si no sabes escribir este tipo de código para acceder a base de datos, entonces pregunta en el foro de ADO.NET, que se dedica precisamente a eso.
    martes, 17 de mayo de 2016 20:54
  • YA HICE Lo que me recomendaste ahora me imagino que antes de agregar ya reviso si existia y lo sustituya por nombrearchiv(1), aun me queda pendiente realizar esto ultimo

    using (SqlConnection connection = new SqlConnection(myconsql = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["bd"].ToString()))
                                        {
                                            String query = "SELECT nombreArchivo FROM tabla WHERE nombreArchivo=@ParameterName";

                                            using (SqlCommand command = new SqlCommand(query, connection))
                                            {
                                                command.Parameters.AddWithValue("@ParameterName", nombreArchivo);

                                                connection.Open();

                                                if (command.ExecuteScalar() == null)
                                                {
                                                    // no existe. Procedo a crearlo
                                                }

                                                }
                                            }
                                        }

      if (MyC.AgregarLineaT( nombreArchivo, tipo, bytes))
                                        {  
                                           

    miércoles, 18 de mayo de 2016 23:00
  • Esto no funcionará:

     if (command.ExecuteScalar() == null)

    Ponle, por ejemplo, en la select esto:

    String query = "SELECT COUNT(*) FROM tabla WHERE nombreArchivo=@ParameterName";

    Y luego en el if puedes consultarlo así:

    if (0 == (int)command.ExecuteScalar())

    jueves, 19 de mayo de 2016 6:32
  • gracias, si asi quedo funcionando :

                    

     SqlConnection con = new SqlConnection(myconsql);
           String query = "SELECT COUNT(*) FROM tabla WHERE nombreArchivo=@ParameterName";

           using (SqlCommand command = new SqlCommand(query, con))
           {
           command.Parameters.AddWithValue("@ParameterName", nombreArchivo);

           con.Open();
               int count  = Convert.ToInt32(command.ExecuteScalar());

                if (count == 0) 
                {
                    return false;
                }
                else
                {
                    return true;

                }

    y cuando agrego me dice que ya existe,ahora bien cuando marque que existe por ejemplo agrego en FileUpload me marca archivo.pdf si existe quiero me ponga archivo(1).pdf , si asi agrego en FileUpload:

                                                                                                                       

    string filePath = Flc.PostedFile.FileName;
                            string nombreArchivo = Path.GetFileName(filePath);
                            string ext = Path.GetExtension(nombreArchivo);


                            string tipo = String.Empty;
                                    //Set the contenttype based on File Extension
                                    switch (ext)
                                    {
                                        case ".doc":
                                            tipo = "application/vnd.ms-word";
                                            break;
                                        case ".docx":
                                            tipo = "application/vnd.ms-word";
                                            break;
                                        case ".xls":
                                            tipo = "application/vnd.ms-excel";
                                            break;
                                        case ".xlsx":
                                            tipo = "application/vnd.ms-excel";
                                            break;
                                        case ".jpg":
                                            tipo = "image/jpg";
                                            break;
                                        case ".png":
                                            tipo = "image/png";
                                            break;
                                        case ".gif":
                                            tipo = "image/gif";
                                            break;
                                        case ".pdf":
                                            tipo = "application/pdf";
                                            break;
                                    }
                                    if (!Existe((nombreArchivo)))
                                    // Response.Write ("Registro No Existe...");
                                    {

                                    if (tipo != String.Empty)
                                    {  
                                        Stream fs = Flc.PostedFile.InputStream;
                                        BinaryReader br = new BinaryReader(fs);
                                        Byte[] bytes = br.ReadBytes((Int32)fs.Length);

    y luego agrego... como se pondria ponga (1).pdf?

    jueves, 19 de mayo de 2016 16:09
  • Rebobina... Vuelve para atrás en la lista de mensajes y fíjate en el mensaje que tenía todo el bloque de código que hacía precisamente eso, solo que lo hacía sobre una carpeta en disco en lugar de sobre la base de datos. Aplica el mismo principio, solo que sustituyendo las partes oportunas para que accedan a base de datos en lugar de a una carpeta.
    jueves, 19 de mayo de 2016 16:27
  • ahora si me quede en blanco, ni idea?

    no tienes un ejemplo?por favor

    jueves, 19 de mayo de 2016 20:00
  • Pero si tienes el ejemplo entero, que era este:

    string filePath = Flc.PostedFile.FileName;
    string nombreArchivo = Path.GetFileName(filePath);
    string nombreSinExtension = Path.GetFileNameWitoutExtension(nombreArchivo);
    string extension = Path.GetExtension(nombreArchivo);
    string carpetaParaGuardar = Server.MapPath("/MiCarpeta");
    string rutaCompleta = Path.Combine(carpetaParaGuardar, nombreSinExtension);
    string rutaQueProbamos = rutaCompleta;
    If (File.Exists(rutaQueProbamos + extension))
    {
       
    int numero = 0;
       
    do
       
    {
           
    ++numero;
           
    string fichero = rutaQueProbamos+ "(" + numero + ")" + extension;
       
    } while (File.Exists(fichero));
        rutaCompleta
    = fichero;
    }
    //Ahora, "rutaCompleta" trae el nombre de fichero que tienes que grabar

    La única pega de ese ejemplo era que usaba File.Exists para ver si el fichero ya existía en una carpeta en disco. Y tú lo que querías es ver si existe en un registro de la base de datos. Pero ya sabes hacer el código para ver si existe en base de datos, porque tú mismo has escrito ese código en otro mensaje anterior. Así que no tienes más que poner ese código dentro de una subrutina que busque el fichero en base de datos y te devuelva un booleano diciendo si existe sí o no. Y luego en el código anterior sustituyes el File.Exists por una llamada a tu subrutina, y ya está.

    viernes, 20 de mayo de 2016 5:17