c# - 重新连接后网络服务不工作
问题描述
有一个用于监视网络文件夹的服务,它可以正确执行其功能,但是有一个细微差别:如果网络断开连接,则在恢复连接后,该服务将停止执行其功能,或者关闭该服务。它只解决了重新启动。有人能告诉我如何监控连接吗?(尝试通过ping,但结果是一样的)。
代码
namespace CopyCema
{
public class CopyCema : ServiceBase
{
public const string MyServiceName = "CopyCema";
private void InitializeComponent()
{
this.ServiceName = MyServiceName;
}
Logger logger;
public CopyCema()
{
InitializeComponent();
this.CanStop = true;
this.CanPauseAndContinue = true;
this.AutoLog = true;
this.CanPauseAndContinue = true;
}
protected override void OnStart(string[] args)
{
logger = new Logger();
Thread loggerThread = new Thread(new ThreadStart(logger.Start));
loggerThread.Start();
}
protected override void OnStop()
{
logger.Stop();
Thread.Sleep(1000);
}
}
class Logger
{
FileSystemWatcher watcher;
object obj = new object();
bool enabled = true;
public string _Day()
{
string DTime = "";
var date = DateTime.Now;
int dayOfWeek = (int)date.DayOfWeek;
if (dayOfWeek == 1)
{
DTime = DateTime.Now.AddDays(-3).ToShortDateString().Replace("2019", "19");
}
else
{
DTime = DateTime.Now.AddDays(-1).ToShortDateString().Replace("2019", "19");
}
return DTime;
}
public Logger()
{
string NetDir = @"\\<PC in LAN>\backup\"+_Day();
string DestDir = @"D:\backupchik\"+_Day();
DirectoryInfo NetDirInfo = new DirectoryInfo(NetDir);
if (!NetDirInfo.Exists)
{
NetDirInfo.Create();
}
string[] Files = Directory.GetFiles(NetDir);
if (Files.Length!=0)
{
DirectoryInfo DDirInfo = new DirectoryInfo(DestDir);
if (!DDirInfo.Exists)
{
DDirInfo.Create();
}
foreach(string f in Files)
{
FileInfo FInfo = new FileInfo(DestDir + @"\" + Path.GetFileName(f));
if (!FInfo.Exists)
{
File.Copy(f, DestDir + @"\" + Path.GetFileName(f));
}
}
}
watcher = new FileSystemWatcher(@"\\<PC in LAN>\backup\"+_Day());
watcher.Deleted += Watcher_Deleted;
watcher.Created += Watcher_Created;
watcher.Changed += Watcher_Changed;
watcher.Renamed += Watcher_Renamed;
}
public void Start()
{
watcher.EnableRaisingEvents = true;
while(enabled)
{
Thread.Sleep(1000);
}
}
public void Stop()
{
watcher.EnableRaisingEvents = false;
enabled = false;
}
// переименование файлов
private void Watcher_Renamed(object sender, RenamedEventArgs e)
{
string fileEvent = "переименован в " + e.FullPath;
string filePath = e.OldFullPath;
RecordEntry(fileEvent, filePath);
}
// изменение файлов
private void Watcher_Changed(object sender, FileSystemEventArgs e)
{
string fileEvent = "изменен";
string filePath = e.FullPath;
RecordEntry(fileEvent, filePath);
}
// создание файлов
private void Watcher_Created(object sender, FileSystemEventArgs e)
{
string fileEvent = "создан";
string filePath = e.FullPath;
RecordEntry(fileEvent, filePath);
string sourceDir = @"\\<PC in LAN>\backup\"+_Day();
string DDir = @"D:\backupchik\"+_Day();
Thread.Sleep(2000);
Task Tsk1 = new Task( () => copyD(sourceDir, DDir));
Tsk1.Start();
}
public void copyD(string source0, string source2)
{
string[] files = Directory.GetFiles(source0);
DirectoryInfo DDirInfo = new DirectoryInfo(source2);
string destDir = "";
if (!DDirInfo.Exists)
{
DDirInfo.Create();
}
destDir = @"D:\backupchik\"+_Day();
foreach(string str in files)
{
FileInfo Finfo = new FileInfo(destDir + @"\" + Path.GetFileName(str));
FileInfo FinfoS = new FileInfo(str);
if (!Finfo.Exists)
{
if (FinfoS.Exists)
{
File.Copy(str, destDir + @"\" + Path.GetFileName(str), true);
}
}
}
}
// удаление файлов
private void Watcher_Deleted(object sender, FileSystemEventArgs e)
{
string fileEvent = "удален";
string filePath = e.FullPath;
RecordEntry(fileEvent, filePath);
}
private void RecordEntry(string fileEvent, string filePath)
{
lock (obj)
{
using (StreamWriter writer = new StreamWriter(@"C:\Users\111\Desktop\templog.txt", true))
{
writer.WriteLine(String.Format("{0} файл(папка) {1} был(а) {2}",
DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss"), filePath, fileEvent));
writer.Flush();
}
}
}
}
}
解决方案
推荐阅读
- jquery - 通过ajax提交表单时未定义的索引用户
- packer - 无法使用带有 private_key 身份验证的打包程序在 virtualbox 中创建 OVA
- ruby - RVM 通过 repo 文件自动检测 Ruby 版本的功能在 VSCode 登录 shell 终端中不起作用
- java - 实现自定义注解
- javascript - 如何重写这个双箭头函数
- c# - Stackify 不在 ASP.NET Core 中使用代理
- java - 如何使用两个列表对 recyclerview 进行分页
- unity3d - Unity:玩家跳得很好,但下落非常慢
- python - 写入文件时打印到控制台的数字
- amazon-s3 - Amazon S3 SelectObjectContent 错误 - OverMaxParquetBlockSize