2011-03-16 34 views
5

Quiero tener un servicio de Windows ejecutándose en un servidor de Windows Server 2008 que supervisará un directorio en el servidor local (es decir, C: \ Watch) y cuando se crea un nuevo pdf en ese directorio, copie el archivo en la red compartir (es decir, //192.168.1.2/Compartir).Cómo copiar un archivo a la ubicación de red desde el servicio de Windows?

Ninguno de los servidores son miembros de un dominio.

El servicio de Windows tiene su inicio de sesión configurado en una cuenta de usuario local que puede acceder // al servidor/compartir y crear y eliminar archivos sin problemas.

Tengo lo siguiente que funciona bien si sourceDir y destDir son carpetas locales como C: \ Source y C: \ Dest, pero si cambio destDir a una ubicación de red como // server/share/or // // servidor // compartir // Recibo el error "T La sintaxis de nombre de archivo, directorio o etiqueta de volumen es incorrecta".

Actualización: yo ya no estoy recibiendo el error anterior y ahora, cuando tengo el SourceDir establecido en C: \ Watch y la DESTDIR se configura en \ server \ share \ (donde el servidor puede ser un Windows o Ubuntu Servidor Obtengo un error de System.UnauthorizedAccess que asumo proviene del servidor de destino. ¿Cómo puedo configurar las credenciales para usar al conectarme con el servidor de destino? Recuerde que los servidores no están en un dominio y pueden ser Windows o Ubuntu.

public partial class Service1 : ServiceBase 
{ 
    private FileSystemWatcher watcher; 
    private string sourceFolder; 
    private string destFolder; 

    public Service1() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnStart(string[] args) 
    { 
     this.sourceFolder = Properties.Settings.Default.sourceDir; 
     this.destFolder = Properties.Settings.Default.destDir; 

     watcher = new FileSystemWatcher(); 
     watcher.Path = this.sourceFolder; 
     watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName; 
     watcher.Filter = "*.pdf"; 

     watcher.Created += new FileSystemEventHandler(watcher_Created); 

     watcher.EnableRaisingEvents = true; 
    } 

    protected override void OnStop() 
    { 
    } 

    private void watcher_Created(object source, FileSystemEventArgs e) 
    { 
     FileInfo fInfo = new FileInfo(e.FullPath); 
     while (IsFileLocked(fInfo)) 
     { 
      Thread.Sleep(500); 
     } 
     System.IO.File.Copy(e.FullPath, this.destFolder + e.Name); 
     System.IO.File.Delete(e.FullPath); 
    } 
} 

Respuesta

4

La parte del servidor sería:

string networkShare = @"\\ServerName\Share\"; 

También tenga en cuenta que la identidad que el servicio está ejecutando afectará si el servicio podrá guardar en esa ubicación. Si está utilizando una cuenta de servicio de dominio para el servicio que se ejecute como, asegúrese de ajustar la década de ACL en la carpeta compartida de destino de la máquina que la proporción está en permitir que escribe

+0

Gracias. Codifiqué @ "\\ server \ share \" pero ahora recibo el siguiente error "El sistema no puede acceder al archivo". Así que supongo que es un permiso, aunque cuando inicio sesión como usuario, el servicio está configurado para iniciar sesión, ya que puedo crear archivos en \\ servidor \ compartir – etoisarobot

+0

En una nota lateral, ¿cómo puedo usar el @ como en @ "? \\ servidor \ compartir \ "cuando la ruta es una variable de cadena. – etoisarobot

+0

Puede almacenar el destino en su app.config y solo leerlo desde allí, en la aplicación.config solo tendría que ser \\ servidor \ compartir – kd7

1

Sobre la base de la respuesta de Oded here Una vez me encontré el servicio como un usuario local que también se configuró en el servidor remoto de Ubuntu funcionó de maravilla.

+1

Excelente para usted, marque su propia respuesta como aceptada o el mío, para que otros puedan beneficiarse. – kd7

Cuestiones relacionadas