Я хочу, чтобы служба Windows работала на сервере Windows Server 2008, который будет отслеживать каталог на локальном сервере (т. Е. C: \ Watch), и когда в этом каталоге создается новый файл PDF, скопируйте файл в общий сетевой ресурс (т. е. //192.168.1.2/Share).
Ни один из серверов не является членом домена.
Служба Windows имеет свой вход в систему, настроенный для учетной записи локального пользователя, который может получить доступ к // серверу / общему ресурсу, а также создавать и удалять файлы без проблем.
У меня есть следующее, которое прекрасно работает, если sourceDir и destDir являются локальными папками, такими как C: \ Source и C: \ Dest, но если я изменю destDir на сетевое расположение, такое как // server / share / или /// / server // share // Я получаю сообщение об ошибке «Неверный синтаксис имени файла, имени каталога или метки тома».
Обновление:
Я больше не получаю сообщение об ошибке выше, и теперь, когда у меня sourceDir установлен в C: \ Watch, а destDir в \ server \ share \ (где сервер может быть Windows или Ubuntu Server, я получаю ошибку System.UnauthorizedAccess, которая Я предполагаю, что идет от сервера назначения. Как я могу установить учетные данные для использования при подключении к серверу назначения. Помните, что серверы не находятся в домене и могут быть окнами или 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);
}
}