将文件复制到文件观察程序文件夹时,如何识别文件是否已完全复制并可以使用?因为我在文件复制期间收到多个事件.(使用File.Copy通过另一个程序复制该文件.)
我有以下代码:
Imports System.IO
Public Class Blah
Public Sub New()
InitializeComponent()
Dim watcher As New FileSystemWatcher("C:\")
watcher.EnableRaisingEvents = True
AddHandler watcher.Changed, AddressOf watcher_Changed
End Sub
Private Sub watcher_Changed(ByVal sender As Object, ByVal e As FileSystemEventArgs)
MsgBox(e.FullPath)
End Sub
End Class
当我运行它并将更改保存到我的C驱动器上的文件时,代码工作得很好,除了它执行watcher_Changed()方法四次.知道为什么吗?每次changeType为"4".
谢谢.
如何实现FileSystemWatcherFTP位置(在C#中).这个想法是,无论何时在FTP位置添加任何内容,我都希望将其复制到本地计算机.任何想法都会有所帮助.
这是我之前使用.NET进行选择性FTP下载的问题的后续内容.
我需要原始C++/WinAPI中的.Net的FileSystemWatcher模拟.我几乎开始使用FindFirstChangeNotification/FindNextChangeNotification来编写一个代码,但后来我发现我可能不是第一个需要这个并且可能有人愿意分享的人.
理想情况下我需要的是一个可以按如下方式使用的类:
FileWatcher fw;
fw.startWatching("C:\MYDIR", "filename.dat",
FileWatcher::SIZE | FileWatcher::LAST_WRITE,
&myChangeHandler);
...
fw.stopWatching();
Run Code Online (Sandbox Code Playgroud)
或者,如果它会使用像boost :: signal这样的东西,它会更好.但是,除了标准库,提升和原始WinAPI之外,没有其他依赖项.谢谢!
我的应用程序写入一个日志文件(当前使用log4net).我想设置一个计时器和一个后台工作程序来读取日志文件并将其内容打印到我的表单中的某个控件中,同时它正在被写入.
我无法使用FileSystemWatcher类,因为它看起来很破碎:有时事件"已更改"会触发,有时则不会.它具有极低的"汇集率".
所以我创建了一个Timer和一个FileSystemWatcher.在计时器的"tick"事件中,后台工作人员完成其工作.
问题是:如何只读取自上次检查工作人员以来添加的行?
public LogForm()
{
InitializeComponent();
logWatcherTimer.Start();
}
private void logWatcherTimer_Tick(object sender, EventArgs e)
{
FileInfo log = new FileInfo(@"C:\log.txt");
if(!logWorker.IsBusy) logWorker.RunWorkerAsync(log);
}
private void logWorker_DoWork(object sender, DoWorkEventArgs e)
{
// Read only new lines since last check.
FileInfo log = (FileInfo) e.Argument;
// Here is the main question!
}
Run Code Online (Sandbox Code Playgroud)
编辑:代码解决方案(也许有更优雅的方式?):
private void logWatherWorker_DoWork(object sender, DoWorkEventArgs e)
{
// retval
string newLines = string.Empty;
FileInfo log = (FileInfo) e.Argument;
// Just skip …Run Code Online (Sandbox Code Playgroud) 我正在编写一个解决方案,我在其中使用一些应该在运行时可编辑的配置文件.我之前一直FileSystemWatcher在为此目的而使用它并且从来没有遇到太多问题,但现在它在"重命名"事件上引起了CTD.
这段(无用的)代码将在我的设置中重现问题:
private static int _s_renamed;
private static int _s_created;
private static int _s_errors;
private static void monitorConfiguration(string configRootFolder)
{
var fsw = new FileSystemWatcher(configRootFolder, ConfigFilePattern)
{
NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName,
IncludeSubdirectories = false
};
fsw.Renamed += (sender, args) => ++_s_renamed; // <-- ! CTD efter this one !
fsw.Created += (sender, args) => ++_s_created;
fsw.Error += (sender, args) => ++_s_errors;
fsw.EnableRaisingEvents = true;
}
Run Code Online (Sandbox Code Playgroud)
崩溃FileSystemWatcher似乎来自它.如果我在事件处理程序中设置一个断点,FileSystemWatcher.Renamed它会被命中,但是当我走出它时应用程序崩溃了.如果我在FileSystemWatcher.Created事件处理程序中设置断点,则不会发生这种情况.
有什么建议?
编辑1:我在Windows 7 x64(Ultimate)平台上运行.NET 4我已经看过几个关于此类问题的讨论,但所有这些都与尝试更新UI内容的人有关(必须从主要/来自事件处理程序的UI线程).这就是我尝试在实验代码中增加一些计数器的原因.
我正在使用a FileSystemWatcher监视文件夹中的更改,但是一旦我在短时间内进行了几百次修改,我就会错过其中一些因为内部缓冲区溢出.所以我想增加InternalBufferSize(我知道它不会真正解决问题,但会降低它的可能性),但我在文档中看到了这个警告:
但是,增加缓冲区大小是很昂贵的,因为它来自无法换出到磁盘的非分页内存,因此请尽可能减小缓冲区.
所以我的问题是:它真的重要吗?今天大多数计算机都有至少1GB的RAM,所以在我看来,如果我将缓冲区大小设置为1MB(而不是默认的8KB),那么1MB不能换成磁盘就不重要了.或者我错过了什么?我不太了解低级别的东西,如分页/非分页内存,所以我不确定会有什么影响...
我们刚刚开始使用FileSystemWatcher遇到一个奇怪的问题,其中对Dispose()的调用似乎是挂起的.这段代码一段时间没有任何问题,但我们刚刚升级到.NET3.5 SP1,所以我试图找出是否有其他人看到过这种行为.以下是创建FileSystemWatcher的代码:
if (this.fileWatcher == null)
{
this.fileWatcher = new FileSystemWatcher();
}
this.fileWatcher.BeginInit();
this.fileWatcher.IncludeSubdirectories = true;
this.fileWatcher.Path = project.Directory;
this.fileWatcher.EnableRaisingEvents = true;
this.fileWatcher.NotifyFilter = NotifyFilters.Attributes;
this.fileWatcher.Changed += delegate(object s, FileSystemEventArgs args)
{
FileWatcherFileChanged(args);
};
this.fileWatcher.EndInit();
Run Code Online (Sandbox Code Playgroud)
使用它的方法是更新TreeNode对象的状态图像(稍微调整以删除特定于业务的信息):
private void FileWatcherFileChanged(FileSystemEventArgs args)
{
if (this.TreeView != null)
{
if (this.TreeView.InvokeRequired)
{
FileWatcherFileChangedCallback d = new FileWatcherFileChangedCallback(FileWatcherFileChanged);
this.TreeView.Invoke(d, new object[]
{
args
});
}
else
{
switch (args.ChangeType)
{
case WatcherChangeTypes.Changed:
if (String.CompareOrdinal(this.project.FullName, args.FullPath) == 0)
{
this.StateImageKey = GetStateImageKey();
}
else
{ …Run Code Online (Sandbox Code Playgroud) 我有一个filesystemwatcher,它将在修改文件时触发事件.一旦锁被删除,我想从该文件中读取.目前我只是在触发事件时尝试打开文件,当复制大文件时,文件锁在事件发送后保持一段时间,从而阻止文件被打开以进行读访问.
有什么建议?
在Linux中,许多IPC都是通过在一个进程中附加文件并从另一个进程读取新内容来完成的.
我想在Windows/.NET中执行上述操作(使用普通IPC(如管道)太麻烦).我将附加到Python进程中的文件,我想在每次FileSystemWatcher报告事件时读取更改并且只读更改.每次我在寻找更改时,我都不想将整个文件内容读入内存(文件会很大)
每个追加操作都会附加一行数据,这些数据以唯一的递增计数器(时间戳+键)开头,并以换行符结束.