我的 FileSystemWatcher 有问题。
我的应用程序需要监视短时间内在文件夹中创建的大量文件。
当我开始开发它时,我意识到如果我的缓冲区小于 64kb(微软建议的大小),很多文件都不会被通知。我尝试将缓冲区大小增加到超出此范围,直到达到适合我的值,即 2621440 字节!
对于这种情况,您建议使用什么小尺寸,或者缓冲区的理想尺寸是多少?
我的示例代码:
WATCHER = new FileSystemWatcher(SignerDocument.UnsignedPath, "*.pdf");
WATCHER.InternalBufferSize = 2621440; //Great and expensive buffer 2.5mb size!
WATCHER.IncludeSubdirectories = true;
WATCHER.EnableRaisingEvents = true;
WATCHER.Created += new FileSystemEventHandler(watcher_Created);
WATCHER.Renamed += new RenamedEventHandler(watcher_Renamed);
Run Code Online (Sandbox Code Playgroud)
微软在 .NET 2.0 中对此是这么说的:
增加缓冲区大小的成本很高,因为它来自无法换出到磁盘的非分页内存,因此请使缓冲区尽可能小。为了避免缓冲区溢出,请使用 NotifyFilter 和 IncludeSubdirectories 属性过滤掉不需要的更改通知。链接:FileSystemWatcher.InternalBufferSize 属性
我找到了很多关于 C++、C# 等的答案,但还没有找到适用于 Node.js 的答案。这是我的情况。
我创建了一个模块,用于监视 FTP 服务器中的文件/目录更改(新的或更新的,不关心已删除的文件)。一旦我注意到一个新文件或一个现有文件被更改,我就会收到通知并通知我的模块 B 将此文件同步到 Sourceforge.net。该模块工作正常,立即对变化做出反应。
但我还不满意的是,当添加一个新文件时,该文件会根据文件大小多次收到“修改”事件:文件大小越大,它将收到的“修改”事件越多。这是因为在上传文件时,操作系统会定期将上传的缓冲区刷新到文件系统,从而导致多个“修改”fs.watch事件。
题
如何检查文件是否仍然打开,以便我知道“修改”事件实际上是因为剩余数据被刷新而发生的,而不是因为文件已被多次更改,所以我可以忽略它?”
一旦文件关闭或写入停止,我就可以通知我的模块 B 同步到 SF.net。
我将不胜感激任何想法。谢谢。
我正在开发一个“动态快捷方式”应用程序,它创建指向注册表项而不是实际文件/可执行文件的特殊快捷方式文件。注册表项包含所需文件的路径。我想要运行一个守护进程,它监视链接到的文件,并在移动或重命名它们时更新它们的注册表项。重命名后我可以使用 System.IO.FileSystemWatcher 进行处理,但是处理移动文件的最佳方法是什么?
我知道这超出了 FSW 的基本功能(尽管是低级文件系统操作)。问题是,最好的方法是什么?
我读过的大多数帖子/文章都提出了感觉完全“hacky”的方法,这些方法基本上涉及寻找删除,然后在文件的新位置创建,并通过文件大小、元数据、文件之间的时间连接两者。删除/创建触发器、哈希等。这很可能是我必须采用的方法,在所有驱动器上设置 FSW。不过,我希望可能有更好的方法。
是否可以:
2.1. 监听 shell 并“听到”移动操作?
2.2 或者(甚至更激进)替换或添加一些东西到 shell 移动操作中,触发某种事件或执行注册表更新任务本身,从而消除对守护程序的需要?
我有一种感觉,每个人都会告诉我 1. 是唯一的课程,但我期待您的建议。(首选 VB.NET 中的答案,但如果需要,可以从 C# 进行翻译)。
我是 PowerShell 的新手,我正在尝试使用 System.IO.FileSystemWatcher 来监视指定文件夹中文件的存在。但是,一旦检测到文件,我想立即停止监视此文件夹并停止 FileSystemWatcher。计划是将 PowerShell 脚本合并到 SQL 代理中,使用户能够恢复自己的数据库。基本上,我需要知道在找到一个文件后立即停止 FileSystemWatcher 监视的命令。这是到目前为止的脚本。
### SET FOLDER TO WATCH + FILES TO WATCH + SUBFOLDERS YES/NO
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = "C:\TriggerBatch"
$watcher.Filter = "*.*"
$watcher.IncludeSubdirectories = $true
$watcher.EnableRaisingEvents = $true
### DEFINE ACTIONS AFTER A EVENT IS DETECTED
$action = { $path = $Event.SourceEventArgs.FullPath
$changeType = $Event.SourceEventArgs.ChangeType
$logline = "$(Get-Date), $changeType, $path"
Add-content "C:\log2.txt" -value $logline
}
### DECIDE WHICH EVENTS SHOULD BE WATCHED + SET CHECK FREQUENCY
$created = …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 AspNet Core 2.1 应用程序中使用 的实现BackgroundService。我在其中创建一个 FileSystemWatcherExecuteAsync并链接关联的事件,但是,fsw 事件要么从未触发(无法访问?已处理?),要么是我做错了,这是异步的,或者范围混乱。我似乎无法弄清楚。以下是相关代码。
public class FSWImpl : BackgroundService
{
private readonly IHostingEnvironment _env;
private readonly ILogger<LiftAndShift> _logger;
private FileSystemWatcher _fsw;
public LiftAndShift(IHostingEnvironment env, ILogger<FSWImpl> logger)
{
_env = env;
_logger = logger;
}
protected override Task ExecuteAsync(CancellationToken stoppingToken)
{
_logger.LogInformation("Creating new FSW");
var path = Path.Combine(_env.ContentRootPath, "WebData");
_fsw = new FileSystemWatcher(path,"*.json");
_fsw.Created += _fsw_Created;
_fsw.Changed += _fsw_Changed;
_fsw.Renamed += _fsw_Renamed;
_fsw.Error += _fsw_Error;
return Task.CompletedTask;
}
private void _fsw_Error(object sender, ErrorEventArgs …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 FileSystemWatcher 类监视指定目录中的更改。很大程度上基于MS 文档上的示例,该示例在我的 Windows 计算机上运行良好。但问题是,我的目标是 Ubtuntu 18.04 lts 及更高版本来运行它。观察者显然设置得很好(代码执行并打印出控制台/日志消息),但没有任何文件系统事件被触发,即:更改/创建/删除/重命名/等没有任何事件触发这些事件。
使用 Linux 是否需要任何未记录或“隐藏”的设置细节,或者这是否完全不受支持,即使它在 .NET 5 中也不应该用于 Linux/Mac/Unix 构建?我找不到任何关于非 Windows 使用的明确文档,但我认为 .NET 5 应该“可移植”地工作。任何提示/细节将不胜感激,因为我确信其他人也遇到过这个问题,或者至少有可能遇到过。
当前代码适用于 Windows 版本,但不适用于 Linux:
public void WatchFolder()
{
string directoryPath = _configuration["FolderLocation"];
if (string.IsNullOrWhiteSpace(directoryPath))
throw new Exception("Folder location was not set.");
try
{
// setup file system watcher
using var watcher = new FileSystemWatcher(directoryPath);
watcher.NotifyFilter = NotifyFilters.Attributes
| NotifyFilters.CreationTime
| NotifyFilters.DirectoryName
| NotifyFilters.FileName
| NotifyFilters.LastAccess
| NotifyFilters.LastWrite
| NotifyFilters.Security
| NotifyFilters.Size;
// add handler …Run Code Online (Sandbox Code Playgroud) 我有以下子:
Private Sub Watcher_Changed(ByVal sender As System.Object, ByVal e As FileSystemEventArgs)
If Path.GetExtension(e.Name) = ".p2p" Then
Exit Sub
Else
Try
' multiple change events can be thrown. Check that file hasn't already been moved.
While Not File.Exists(e.FullPath)
Exit Try
End While
' throw further processing to a BackGroundWorker
ChangedFullPath = e.FullPath
ChangedFileName = e.Name
FileMover = New BackgroundWorker
AddHandler FileMover.DoWork, New DoWorkEventHandler(AddressOf ProcessFile)
FileMover.RunWorkerAsync()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End If
End Sub
Run Code Online (Sandbox Code Playgroud)
当FTP上传文件时,我仍然收到多个更改文件通知.
我想修改Try,所以它也会抛出更改通知,如果它发生在过去(时间) - 让我们说3秒.它应该是微不足道的,但由于某种原因它今天不会来找我,我的思想并没有围绕我在Google上找到的答案.
谢谢,斯科特
我们有一个asp.net mvc应用程序,我们希望将FileSystemWatcher与它集成.我已经看到了许多关于如何实现FileSystemWatcher的好例子,但我真的不知道将它放在我的应用程序中的哪个位置.它似乎应该从应用程序开始.有任何想法吗?
我正在使用FileSystemWatcher来监视创建的新文件夹的目录.这可以正常工作,除了这些文件夹中的每一个都可以在其中包含一个或多个子目录.
问题是当我复制顶级文件夹(其中包含一个或多个子目录)时,FileSystemWatcher只捕获顶级文件夹而不是子目录.
例如:将带有子目录'bar'的文件夹'foo'拖到正在监视的目录中FileSystemWatcher通知新目录'foo'已创建,但没有说'bar'
我是否遗漏了具有FileSystemWatcher功能的东西,还是有其他方法可以解决这个问题?
我正在使用FileSystemWatcher检测.docx文件.打开时会检测文件,但文件名始终"已损坏".
3个例子:
如果我的文件名是:2711111.docx,则收到的文件名FileSystemWatcher.Changed是:〜$ 711111.docx.
对于文件:*2711111_1.docx*我得到文件名:*〜$ 11111_1.docx*我无法猜出我的文件名是什么,所以我正在寻找一般的解决方案.
对于包含/以字母开头的文件,它不会发生.
这是我的代码
MyPath = String.Format(@"C:\Users\{0}\NRPortbl\ACTIVE\{1}\"",
Public.UserName, Public.UserName);
FileSystemWatcher watcher = new FileSystemWatcher();
if (!System.IO.Directory.Exists(MyPath))
{
Public.Logger.Error(
String.Format
("Path of folders {0} not found", MyPath));
System.Windows.Forms.MessageBox.Show(
String.Format(
"There was a problem loading {0} " +
"NRPortbl libraray, contact administrator", Public.UserName));
return;
}
watcher.Path = MyPath;
watcher.Filter = "*.Docx";
watcher.IncludeSubdirectories = false;
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Deleted += new FileSystemEventHandler(OnDeleted);
watcher.EnableRaisingEvents = true; ...
public void …Run Code Online (Sandbox Code Playgroud) c# ×5
.net ×3
vb.net ×2
.net-5 ×1
asp.net-core ×1
buffer ×1
filesystems ×1
fs ×1
node.js ×1
powershell ×1