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);
}
}
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
En una nota lateral, ¿cómo puedo usar el @ como en @ "? \\ servidor \ compartir \ "cuando la ruta es una variable de cadena. – etoisarobot
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