Ich möchte einen Windows-Dienst auf einem Windows Server 2008-Server laufen lassen, der ein Verzeichnis auf dem lokalen Server überwacht (d. h. C:\Watch ) und wenn eine neue PDF-Datei in diesem Verzeichnis erstellt wird, kopieren Sie die Datei in die Netzwerkfreigabe (z. B. //192.168.1.2/Share).
Keiner der Server ist Mitglied einer Domäne.
Der Windows-Dienst ist mit einem lokalen Benutzerkonto angemeldet, das auf //server/share zugreifen und ohne Probleme Dateien erstellen und löschen kann.
Ich habe die folgenden, die gut funktioniert, wenn die sourceDir und die destDir sind lokale Ordner wie C:\Source y C:\Dest aber wenn ich das destDir auf einen Netzwerkspeicherort wie //server/share/ oder ////server//share// ändere, erhalte ich die Fehlermeldung "TThe filename, directory name, or volume label syntax is incorrect".
更新しました。 Ich erhalte den obigen Fehler nicht mehr, und wenn ich das sourceDir auf C:\Watch und das destDir auf \server\share\ (wobei der Server ein Windows- oder Ubuntu-Server sein kann) erhalte ich einen System.UnauthorizedAccess-Fehler, von dem ich annehme, dass er vom Zielserver stammt. Wie kann ich die Anmeldeinformationen festlegen, die bei der Verbindung mit dem Zielserver verwendet werden sollen? Denken Sie daran, dass die Server nicht in einer Domäne sind und Windows oder Ubuntu sein können.
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);
}
}