none
C# Descargar archivos de una unidad compartida a un carpeta local RRS feed

  • Pregunta

  • Hola a todos:

    Alguien me podría ayudar de como copiar archivos de una unidad compartida y guardar en cualquier ruta de la pc.

    Estoy creando un servicio windows y necesito ese metodo para copiar esos archivos. Estoy programando en C# Visual Studio.

    Gracias saludos cordiales.

    martes, 15 de mayo de 2018 17:13

Todas las respuestas

  • Es igual que copiar archivos localmente.

    string archFuente = @"\\servidor\carpetaCompartida\archivo.extension";
    string nomArch = Path.GetFileName(archFuente),
    string destino = @"C:\Destino";
    File.Copy(archFuente, Path.Combine(destino, nomArch));


    Jose R. MCP
    Code Samples

    martes, 15 de mayo de 2018 19:52
    Moderador
  • Hola me sale un error me aparece, necesita usuario y contraseña como haria con ello.

    martes, 15 de mayo de 2018 20:03
  • Está creando un servicio de Windows.  Dicho servicio correrá bajo una identidad específica (cuenta de usuario).  ¿Ya lo ha decidido?  Como tiene que acceder a la red no puede ser LocalSystem; puede ser System o NetworkService, o bien una cuenta de usuario de Active Directory.  ¿Tiene Active Directory?

    En fin, el punto es:  La cuenta de usuario que se utilizará para correr el servicio debe de tener permisos de lectura sobre el directorio compartido.


    Jose R. MCP
    Code Samples

    martes, 15 de mayo de 2018 20:23
    Moderador
  • Hola:

    Además de lo que te ha comentado Jose, y ¿que va a ocurrir, cuando el usuario no este logueado?. O ¿cuando se reinicie el equipo y todavía nadie se haya logueado?.

    Puedes intentarlo con NET USE .... /PERSISTENT:YES

    https://www.portalmastips.com/script-batch-conectar-a-unidad-de-red-automaticamente-con-un-archivo-bat-map-network-drive/

    Pero persiste en el empeño, que aún existen alternativas.

    Además, si el archivo ya existe, y quieres sobreescribirlo, no te olvides, de añadir a File...,true);

    https://msdn.microsoft.com/es-es/library/system.io.file.copy(v=vs.110).aspx

    Un saludo

    martes, 15 de mayo de 2018 21:26
  • @Javi, como es un servicio de Windows, no requiere de un usuario logueado.  No es necesario mapear una letra, de hecho eso complica el asunto con eso de NET USE, en mi opinión.  Lo único que hay que hacer es darle permisos de lectura a la cuenta de usuario bajo la cual corre el servicio de Windows.

    Jose R. MCP Code Samples GitHub Repositories

    martes, 15 de mayo de 2018 21:59
    Moderador
  • En esta opcion del servicio puse NetworkService con el metodo:

                    string archFuente = @"\\USUARIO\extractor_compartir\CarpetaEnvio\test.txt";
                    string nomArch = Path.GetFileName(archFuente);
                    string destino = @"C:\Users\lchacon\Downloads\CarpetaEnvio";
                    File.Copy(archFuente, Path.Combine(destino, nomArch));

    Y no copia los archivos. Cual creen que es el error.

    martes, 15 de mayo de 2018 22:21
  • Cuando pongo LocalSystem me sale. Could not find a part of the path 'T:\CarpetaEnvio. Pero esa carpeta si existe.
    martes, 15 de mayo de 2018 22:24
  • La cuenta de usuario me deja copiar escribir manualmente. Pero mediante codigo no puedo. En la configuracion del servicio Account: da la opcion LocalSystem, NetworkService, LocalSystem y User. Use los 4 y con ninguno copia los archivos. Estoy usando el metodo:

    * donde dice USUARIO pongo la Ip tambien e igual no da.

     string archFuente = @"\\USUARIO\extractor_compartir\CarpetaEnvio\test.txt";
                    string nomArch = Path.GetFileName(archFuente);
                    string destino = @"C:\Users\lchacon\Downloads\CarpetaEnvio";
                    File.Copy(archFuente, Path.Combine(destino, nomArch));

    martes, 15 de mayo de 2018 22:35
  • ¿Se obtiene alguna excepción?  Si es así, muéstrela.

    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT

    martes, 15 de mayo de 2018 22:48
    Moderador
  • Could not find a part of the path 'T:\'.

    *T es una unidad logica

    martes, 15 de mayo de 2018 23:41
  • Bueno, como le dije a Javi, el uso de unidades lo complicaría todo.

    ¿Por qué no mejor se regresa a mis preguntas de usuario?  Decídase por una cuenta de usuario para correr el servicio y asegúrese de que tenga permisos de lectura.  Luego no intente usar una unidad y simplemente utilice la ruta de acceso \\servidor\carpeta.


    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT

    martes, 15 de mayo de 2018 23:54
    Moderador
  • Está creando un servicio de Windows.  Dicho servicio correrá bajo una identidad específica (cuenta de usuario).  ¿Ya lo ha decidido?  Como tiene que acceder a la red no puede ser LocalSystem; puede ser System o NetworkService, o bien una cuenta de usuario de Active Directory.  ¿Tiene Active Directory?

    En fin, el punto es:  La cuenta de usuario que se utilizará para correr el servicio debe de tener permisos de lectura sobre el directorio compartido.


    Jose R. MCP
    Code Samples

    Si utilizo un Active Directory con el alias de T: como unidad logica compartida. Como ejecuto mi metodo con ello. Porque realice un metodo de copiar archivos igual al de siempre.

      string archFuente = @"\\USUARIO\extractor_compartir\CarpetaEnvio\test.txt";
                    string nomArch = Path.GetFileName(archFuente);
                    string destino = @"C:\Users\lchacon\Downloads\CarpetaEnvio";
                    File.Copy(archFuente, Path.Combine(destino, nomArch));

    martes, 15 de mayo de 2018 23:55
  • Ok, la cuenta que utiliza, ¿ya tiene acceso de lectura confirmado?  También recuerde que depurar un servicio de Windows en Visual Studio es complicado.  No es F5 y punto porque normalmente debe recibir la instrucción del SCM de iniciarse.  Normalmente para uno depurar, una de las opciones es simplemente crear una aplicación de consola con la lógica del servicio, y se depura la aplicación de consola.  Pero eso quiere decir que la cuenta de usuario que corre la aplicación no es la configurada en el proyecto de servicio de Windows, es la que está siendo utilizada para correr Visual Studio.

    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT

    miércoles, 16 de mayo de 2018 0:01
    Moderador
  • La cuenta tiene control total. Pero igual me sale. No se puede encontrar una parte de la ruta de acceso 'T:\todo.txt'.

    Cree un formulario con un boton y dentro de ello el metodo del servicio para copiar archivos. cuando lo ejecuto esa aplicacion en modo administrador me sale ese error: No se puede encontrar una parte de la ruta de acceso 'T:\todo.txt'. Pero cuando no ejecuto con administrador si copia el archivo si funciona mediante un boton. Pero como trasladaria eso en mi servicio si tiene el mismo metodo.

    miércoles, 16 de mayo de 2018 17:58
  • Deshaga el mapeo de T: y asegúrese de no mencionar la unidad T: en ninguna parte de su código.

    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT

    miércoles, 16 de mayo de 2018 20:39
    Moderador
  • Entonces como le voy a pasar los archivos a la unidad logica compartida. Si la unica ruta que me dan es esa unidad logica (T:\)
    miércoles, 16 de mayo de 2018 21:09
  • La unidad lógica T: apunta a un servidor y a una carpeta compartida en el servidor.  Utilice esas dos piezas de información para armar la ruta, y deje de utilizar T: que no le está funcionando.

    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT

    miércoles, 16 de mayo de 2018 23:59
    Moderador