Я установил все свойства FSW в конструкторе (EnableRaisingEvents = true, filter = * .tif, IncludeSubdirectories = true, path = bla \ bla \ bla).FileSystemWatcher ведет себя непоследовательно
Приложение запускается на компьютере под управлением Windows Server 2008 R2 Standard и наблюдает за локальной папкой для созданных файлов. Вместо «C: \» я использую имя сети компьютеров «GRAHAM».
Проблема в том, что FSW не всегда срабатывает, когда файлы создаются/перемещаются в наблюдаемый каталог. Кажется, что иногда он делает, но чаще всего это не так.
При отладке и просмотре этой папки с моей машины также наблюдается странное поведение. Если я дистанционно управляю машиной сервера и перемещаю файлы в наблюдаемую папку, ничего не происходит. Но если я перемещаю файлы в просматриваемую папку из общих сетевых папок, FSW запускается каждый раз.
Это очень затрудняет поиск ошибки/ошибки. У кого-нибудь есть идеи?
Это буквально все кода:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace Ekonomikompetens_unikt_namn
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void fileSystemWatcher1_Created(object sender, System.IO.FileSystemEventArgs e)
{
StringBuilder log = new StringBuilder();
try
{
log.Append("--------------------").AppendLine().Append(DateTime.Now).AppendLine().Append("--------------------").AppendLine();
FileInfo file = new FileInfo(e.FullPath);
while (IsFileLocked(file))
{
System.Threading.Thread.Sleep(300);
}
string oFile = e.FullPath;
string nFile = oFile.Insert(oFile.Length - 4, "_" + DateTime.Now.ToString().Replace(" ", "").Replace("-", "").Replace(":", "")).Replace("\\XML Konvertering", "").Replace(@"\\GRAHAM\AnyDoc Invoices", @"\\FAKTURASERVER\AnyDoc");
if (!Directory.Exists(nFile.Substring(0, nFile.LastIndexOf('\\'))))
{
Directory.CreateDirectory(nFile.Substring(0, nFile.LastIndexOf('\\')));
File.Move(oFile, nFile);
Directory.Delete(oFile.Substring(0, oFile.LastIndexOf('\\')));
}
else
{
File.Move(oFile, nFile);
}
log.Append("* Moved and stamped file: ").AppendLine().Append(oFile).Append(" to ").Append(nFile).AppendLine().Append("--------------------").AppendLine();
}
catch (Exception x)
{
log.AppendLine().Append("*** ERROR *** ").Append(x).AppendLine().AppendLine();
}
finally
{
TextWriter tw = new StreamWriter(@"C:\tidslog\log.txt", true, Encoding.Default);
//TextWriter tw = new StreamWriter(@"C:\PROJEKT\tidsstämplarn\log.txt", true, Encoding.Default);
tw.Write(log);
tw.Dispose();
}
}
protected virtual bool IsFileLocked(FileInfo file)
{
FileStream stream = null;
try
{
stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
}
catch (IOException)
{
return true;
}
finally
{
if (stream != null)
stream.Close();
}
return false;
}
}
}
Примечание: Попробовать-всеобъемлющая, наконец, вероятно, не очень хорошо сделано, но я новичок в кодировании и не совсем уверен, как " catch ", регистратор никогда не регистрировал ошибку, хотя. Поскольку FSW никогда не срабатывает, нет никакой возможности для возникновения ошибки. Я догадываюсь.
Некоторые комментарии, основанные на ответе @Anirudh: Поскольку ваш код обработчика событий занят, возможно, ваши файлы остаются незамеченными. То, что вы должны сделать, это asAnirudh suggestion, использовать пул потоков и далее, _fileWatcher.Created + = (sender, e) => YourOwnHandler (e.FullPath); –
Для этих «смотреть папку для новых файлов, которые могут быть заблокированы и перемещать их куда-то еще», я всегда не использую «FileSystemWatcher» и вместо этого использую таймер для сканирования папки с регулярными интервалами (скажем один раз в секунду), собирать имена файлов, а затем пытаться их перемещать. Решение становится намного проще и надежнее, когда вы избегаете борьбы с особенностями «FileSystemWatcher». –
@ ChristopherSirén: Прочтите мою серию исключений: http://blog.gauffin.org/2013/04/what-is-exceptions/. Возможно, это поможет вам лучше понять исключения. – jgauffin