我创建了简单的 WPF 控件来监视日志文件中的更改。我使用 FileSystemWatcher 来监视特定文件。我的配置:
Directory = System.IO.Path.GetDirectoryName(logFileFullPath);
Filter = System.IO.Path.GetFileName(logFileFullPath);
NotifyFilter = (NotifyFilters.LastWrite | NotifyFilters.Size);
EnableRaisingEvents = true;
Run Code Online (Sandbox Code Playgroud)
问题是只有在手动刷新目录或打开日志文件后才会显示更改。
我在 log4net 配置中使用 RollingFileAppender,因此应立即写入更改。
问题是:为什么它不起作用以及如何使其起作用?
编辑 :
此外,当我手动更新其他受监控文件时,观察器工作正常。所以这一定是 log4net 的问题。
我想同步我的文件夹,所以我有 10 个 Filesystemwatcher 和 4 个后台工作者。这个想法是,一个观察者可以调用 4 个工作人员中的每一个,但我希望观察者选择一个活跃且自由的工作人员,其他人不应该被触发。
实验:1 名工人被解雇,2-4 名工人没有被解雇。
我在这里做错了什么?
这是我的代码
private void watcher1_OnChanged(object source, FileSystemEventArgs e)
{
// File Name
string file = e.FullPath;
// refresh App.Config
ConfigurationManager.RefreshSection("appSettings");
// Check Worker Active
bool worker1Active = Convert.ToBoolean(ConfigurationManager.AppSettings["worker1Active"]);
bool worker2Active = Convert.ToBoolean(ConfigurationManager.AppSettings["worker2Active"]);
bool worker3Active = Convert.ToBoolean(ConfigurationManager.AppSettings["worker3Active"]);
bool worker4Active = Convert.ToBoolean(ConfigurationManager.AppSettings["worker4Active"]);
// Watcher Nummer
string watcherNr = "Watcher 1";
// Arguments to call worker
List<object> arguments = new List<object>();
arguments.Add(file);
arguments.Add(watcher1_destinationPath);
arguments.Add(watcher1_sourcePath);
arguments.Add(watcherNr);
bool success = false;
while (!success …Run Code Online (Sandbox Code Playgroud) 我正在尝试用 Rust 实现一个文件系统观察器。当文件系统对象发生更改时,我可以接收事件,但确定所做的更改让我感到困惑。我在这里找到了最新发布版本的 Notify 包的代码,它几乎带我完成了整个过程。
如何从 中提取路径和类型event?该事件是一个枚举类型,但不知何故,当它被打印时,我看到了我想要的所有信息。
我显然错过了一些非常基本的东西。
use notify::{watcher, RecursiveMode, Watcher};
use std::sync::mpsc::channel;
use std::time::Duration;
fn main() {
let (tx, rx) = channel();
let mut watcher = watcher(tx, Duration::from_secs(10)).unwrap();
watcher
.watch("/tmp/path", RecursiveMode::Recursive)
.unwrap();
loop {
match rx.recv() {
Ok(event) => {
// **>> event.filename? event.type? how?
println!("{:?}", event);
}
Err(e) => println!("watch error: {:?}", e),
}
}
}
Run Code Online (Sandbox Code Playgroud) 我构建了一个控制台应用程序,用于监视 Windows 2019 Server 上的一组文件夹,并使用相同的文件名将任何新创建的 .txt 文件复制到另一个文件夹。到目前为止,它可以实现基本功能。现在我必须处理这样一个事实:大多数时候,这些文件很大,需要几分钟才能完成创建。我已经浏览了几篇 SO 帖子,并拼凑了以下代码来尝试完成此任务:
using System;
using System.IO;
namespace Folderwatch
{
class Program
{
static void Main(string[] args)
{
string sourcePath = @"C:\Users\me\Documents\SomeFolder";
FileSystemWatcher watcher = new FileSystemWatcher(sourcePath);
watcher.EnableRaisingEvents = true;
watcher.IncludeSubdirectories = true;
watcher.Filter = "*.txt";
// Add event handlers.
watcher.Created += new FileSystemEventHandler(OnCreated);
}
// Define the event handlers.
private static void OnCreated(object source, FileSystemEventArgs e)
{
// Specify what is done when a file is created.
FileInfo file = new FileInfo(e.FullPath);
string …Run Code Online (Sandbox Code Playgroud) 我目前正在尝试让 FileSystemWatcher 工作,如这个问题中所述。在我的研究过程中,我在这个网站上发现了很多描述此类不可靠性的答案和评论。相反,在某些地方提到“轮询”作为观察变化的方法,例如在这个(非常旧的)答案中。我的问题是这到底意味着什么。
所以,我正在尝试将文件更改为通知程序,并且我需要使文件框中的文本更新,只要文件的内容发生更改.这是我到目前为止:
string path = "C:/Users/Max/Dropbox/Public/IM.txt";
StringBuilder b = new StringBuilder();
private void Window_Loaded(object sender, EventArgs e)
{
TB.Text = File.ReadAllText(path);
b.Append(TB.Text);
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = path.Remove(path.Length - 6, 6);
watcher.NotifyFilter = NotifyFilters.LastWrite;
watcher.Filter = "*.txt";
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.EnableRaisingEvents = true;
TB.SelectionStart = TB.Text.Length;
TB.ScrollToCaret();
}
private void OnChanged(object source, FileSystemEventArgs e)
{
TB.Text = File.ReadAllText(path);
}
Run Code Online (Sandbox Code Playgroud)
这似乎正确地引发了事件,但是一旦触及OnChanged事件中的代码,程序退出,没有错误或任何事情,只需关闭.我试图阻止它关闭,我甚至尝试将e.Cancel放在formclosing事件下,但似乎没有任何效果.有任何想法吗?如果需要,我可以提供更多信息.
我以前使用过FileSystemWatcher.但是,我希望有人可以解释它实际上是如何在幕后工作的.
我计划在我正在制作的应用程序中使用它,它将监视大约5个驱动器和300,000个文件.
FileSystemWatcher是否实际上对驱动器进行"检查" - 例如,是否会导致驱动器磨损?它也会影响硬盘"睡眠"的能力
这是我不明白它是如何工作的地方 - 如果它像是在计时器等上扫描驱动器......或者它是否在它执行任何操作之前等待来自操作系统的某种类型的通知.
我只是不想实现一些会导致驱动器额外读取并使驱动器无法休眠的东西.
我有一个文本文件,每次都从服务器数据更新.现在按照我的要求,我必须逐行读取这个文件.我知道如何逐行读取文件,但不知道如何连续读取它.这是我的c#代码逐行读取文件...
if (System.IO.File.Exists(FileToCopy) == true)
{
using (StreamReader reader = new StreamReader(FileToCopy))
{
string line;
string rawcdr;
while ((line = reader.ReadLine()) != null)
{
//Do Processing
}
}
}
Run Code Online (Sandbox Code Playgroud)
根据我的要求,我必须连续观看文本文件以进行更改.假设已在文本文件中添加了一个新行,添加它的那一刻应该由上面定义的代码读取,并且应该根据条件执行处理.
我有这个复杂的代码库,它正在侦听某个文件夹上的FileCreated事件.当文件被创建(其中还包括将文件移动到该文件夹)时,我想读取该文件并对其执行某些操作.它适用于第一个文件,但在所有其他尝试之后抛出异常.在调试模式下(使用VisualStudio),将抛出错误,但如果我只是单击"继续"..它将工作(没有错误).
我发布了简化代码,它证明了这个问题.
例如,启动应用程序,单击"开始"按钮,然后"创建新的文本文件"
输出是:
Working
Run Code Online (Sandbox Code Playgroud)
如果您以完全相同的方式创建2ed文件,则输出为:
Broken: The process cannot access the file 'C:\TestFolder\New Text Document (2).txt' because it is being used by another process.
Working, after breaking
Run Code Online (Sandbox Code Playgroud)
在查看我的代码之后,您将看到上面的打印输出意味着首先抛出了"无法访问文件"异常,但是在catch语句中执行相同的调用突然起作用.
这是没有意义的我,因为文件显然没有使用别的(我只是创造了它)..和它的作品一秒钟后,无论如何....
XAML:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" >
<StackPanel>
<Button Click="Button_Click" Content="Start"/>
</StackPanel>
</Window>
Run Code Online (Sandbox Code Playgroud)
代码背后:
using System;
using System.Diagnostics;
using System.IO;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
namespace WpfApplication1
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e) …Run Code Online (Sandbox Code Playgroud) 我在这里写的主要是关于从哪里开始的建议.我已经实现了一个类,它将使用Java的WatchService递归地查看目录.它可以很好地检测更改,但我注意到一个致命的缺陷:我无法删除正在监视包含正在监视的目录的目录.这似乎是WatchService的限制.
我也看了一下Apache的VFS FileListener,但是在我花费大约6个小时的时间构建一些包装器之前,我想我可能只会问那些比我自己更有知识的人.
我需要看到的目录是完全可操作的,除了被监视的根目录不会被删除或重命名.是否已经有一个好的类我可以用来监视不锁定文件或文件夹的文件和目录?我试图避免使用轮询/哈希比较方法,但我感觉越来越多,好像我需要使用这种方法并烧掉大量的CPU资源.我从哪里开始呢?理想情况下,我需要:
- 检测文件和目录的创建 - 检测文件和目录的删除 - 检测文件和目录的重命名 - 检测文件的修改 - 检测目录之间文件的移动
我也看到一些人认为观察者不可靠,并且他们使用两者的组合(偶尔在观察者失败的某个地方进行轮询),但男人听起来像是一种真正的痛苦,如果不是,我宁愿避免无论如何最好的方式.我有一种感觉,我需要轮询和散列,特别是因为我想检测文件的移动和重命名,但请告诉我们是否存在更好的选项.
在此先感谢,对不起代码特定的问题感到抱歉!
c# ×8
.net ×1
.net-6.0 ×1
file ×1
filestream ×1
filesystems ×1
java ×1
log4net ×1
logging ×1
nio ×1
rust ×1
text-files ×1
winforms ×1