none
Loop de tiempo si el proceso no obtiene acceso del archivo RRS feed

  • Pregunta

  • Buenos dias foro,

            Junto con saludar y desear buen dia, creando un web service que realiza copias de archivos y luego una query en archivos DBF, ya se que son antiguos pero al realizar la copia de los archivos me sale el siguiente error, el proceso no puede obtener acceso al archivo ya que esta siendo utilizado por otro programa. Deseo poder realizar un loop con tiempo de que si no puede realizar la copia se pueda realizar en X tiempo y no afectar mi proceso de la query.

    Este es mi metodo de copia de archivos

    if (!System.IO.Directory.Exists(carpetaDestino))
                {
                    System.IO.Directory.CreateDirectory(carpetaDestino);
                    if (System.IO.Directory.Exists(carpetaDestino))
                    {
                        foreach (string i in archivos)
                        {
                            string archivo = i;
                            string origen = System.IO.Path.Combine(carpetaOrigen, archivo);
                            System.IO.FileStream file = new System.IO.FileStream(origen, System.IO.FileMode.Open, System.IO.FileAccess.Read);
                            string destino = System.IO.Path.Combine(carpetaDestino, archivo);
                            System.IO.FileStream copia = new System.IO.FileStream(destino, System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite);
                            System.IO.File.Copy(origen, destino, true);
                        }
                    }
                }
                else
                {
                    foreach (string i in archivos)
                    {
                        string archivo = i;
                        string origen = System.IO.Path.Combine(carpetaOrigen, archivo);
                        string destino = System.IO.Path.Combine(carpetaDestino, archivo);
                        System.IO.File.Copy(origen, destino, true);
                        
                    }
                }

    Agrego como estoy utilizando mi Web Method del web service con el codigo ya realizado

    string cadenaCnn = @"Provider=vfpoledb;Data Source=C:\TMPLAUDUS;Collating Sequence=general;";
                string consultaSerie = "SELECT Clientes.idcliente, Clientes.idtipo, Clientes.idvendedor, Clientes.iddealer, Clientes.nombre, Clientes.dirección as direccion, Clientes.comuna, Clientes.cp, Clientes.ciudad, Clientes.región as region, Clientes.país as pais, Clientes.countrycode, Clientes.teléfono as telefono, Clientes.teléfono2 as telefono2, Clientes.fax, Clientes.email, Clientes.dte_email, Clientes.webpage, Clientes.idpricel, Clientes.descuento, Clientes.discountisadditive, Clientes.plazopago, Clientes.idformapag, Clientes.notas, Clientes.idcuenta, Clientes.creditlimit, Clientes.rut, Clientes.dígitoverificación as dgv, Clientes.vatid, Clientes.razónsocial, Clientes.direcciónfacturación as direccionfacturacion, Clientes.comunafacturación as comunafacturacion, Clientes.cpfacturación as cpfacturacion, Clientes.ciudadfacturación as ciudadfacturacion, Clientes.paísfacturación as paisfacturacion, Clientes.countrycode_invoicing, Clientes.giro, Clientes.horario, Clientes.díacobro as diacobro, Clientes.defaultquoteheader, Clientes.defaultquotefooter, Clientes.blocked, Clientes.blocked_exceedcreditlimit, Clientes.blocked_overdueinvoices, Clientes.foreigner, Clientes.createdby, Clientes.createdon, Clientes.modifiedby,  Clientes.modifiedon, Clientes.comercionet_code, Clientes.separador, Clientes.extranet_username, Clientes.extranet_password, Clientes.extranet_allowaccess FROM EMPRESA!CLIENTES CLIENTES WHERE TRANSFORM(Clientes.rut) like " + var + " ";
    
                
    
                try
                {
                    copyTable copiar = new copyTable();
                    copiar.Copy();
                    using (System.Data.OleDb.OleDbConnection cnn = new System.Data.OleDb.OleDbConnection(cadenaCnn))
                    {
                        cnn.Open();
                        System.Data.OleDb.OleDbDataAdapter da = new System.Data.OleDb.OleDbDataAdapter(consultaSerie, cnn);
                        DataSet ds = new DataSet();
                        da.Fill(ds);
                        return ds;
                    }
                }
                catch(Exception ex)
                {
                    string xml = @"<?xml version=""1.0"" encoding=""utf-8""?><authentication><error><coderror>0</coderror><detail>"+ex+"</detail></error></authentication>";
                    DataSet autentica = new DataSet();
                    autentica.ReadXml(new XmlTextReader(new StringReader(xml)));
                    return autentica;
                }
    No se si sera posible, y me imagino que si de que si los archivos no son copiados pueda realizar la query y que si el archivo esta siendo utilizado en otro proceso el sistema espere su turno para realizar la accion
    miércoles, 6 de marzo de 2019 13:04

Respuestas

  • Si elimino dichos stream que me notificas que debiese aplicar para generar los archivos de copia

    La copia YA la tienes. Se hace en la linea donde tienes esto:

    System.IO.File.Copy(origen, destino, true);

    Esa linea hace las copias por si sola. No necesita ni le sirve de nada que previamente a ella abras un Stream sobre "origen" o sobre "destino". Por lo tanto lo unico que tienes que hacer es BORRAR esas dos lineas que construyen Streams y dejar todo lo demas como ya lo tienes.


    miércoles, 6 de marzo de 2019 15:47
    Moderador

Todas las respuestas

  • Creo que tu problema está aquí:

    System.IO.FileStream file = new System.IO.FileStream(origen, ...);
    [...]
    System.IO.FileStream copia = new System.IO.FileStream(destino, ...);
    System.IO.File.Copy(origen, destino, true);

    Fíjate que abres sendos Streams contra el origen y el destino de la copia. Estos Streams no los usas para nada, por lo que son completamente inútiles. Pero el problema es que te mantienen bloqueados los archivos (tanto el de origen como el de destino) por lo que el File.Copy da el error que estás viendo.

    Remedio: Suprime esos Streams superfluos.

    miércoles, 6 de marzo de 2019 13:17
    Moderador
  • Si elimino dichos stream que me notificas que debiese aplicar para generar los archivos de copia
    miércoles, 6 de marzo de 2019 14:11
  • Para la copia solo bastaria con esto:

    string origen = System.IO.Path.Combine(carpetaOrigen, archivo);
    string destino = System.IO.Path.Combine(carpetaDestino, archivo);
     System.IO.File.Copy(origen, destino, true);


    Harold Chia

    miércoles, 6 de marzo de 2019 15:41
  • Si elimino dichos stream que me notificas que debiese aplicar para generar los archivos de copia

    La copia YA la tienes. Se hace en la linea donde tienes esto:

    System.IO.File.Copy(origen, destino, true);

    Esa linea hace las copias por si sola. No necesita ni le sirve de nada que previamente a ella abras un Stream sobre "origen" o sobre "destino". Por lo tanto lo unico que tienes que hacer es BORRAR esas dos lineas que construyen Streams y dejar todo lo demas como ya lo tienes.


    miércoles, 6 de marzo de 2019 15:47
    Moderador