标签: filesystemwatcher

FileSystemWatcher InternalBufferSize 的理想大小是多少?

我的 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# buffer filesystemwatcher

5
推荐指数
1
解决办法
6541
查看次数

如果文件已打开/正在写入,如何检查 Node.js?

我找到了很多关于 C++、C# 等的答案,但还没有找到适用于 Node.js 的答案。这是我的情况。

我创建了一个模块,用于监视 FTP 服务器中的文件/目录更改(新的或更新的,不关心已删除的文件)。一旦我注意到一个新文件或一个现有文件被更改,我就会收到通知并通知我的模块 B 将此文件同步到 Sourceforge.net。该模块工作正常,立即对变化做出反应。

但我还不满意的是,当添加一个新文件时,该文件会根据文件大小多次收到“修改”事件:文件大小越大,它将收到的“修改”事件越多。这是因为在上传文件时,操作系统会定期将上传的缓冲区刷新到文件系统,从而导致多个“修改”fs.watch事件。

如何检查文件是否仍然打开,以便我知道“修改”事件实际上是因为剩余数据被刷新而发生的,而不是因为文件已被多次更改,所以我可以忽略它?”

一旦文件关闭或写入停止,我就可以通知我的模块 B 同步到 SF.net。

我将不胜感激任何想法。谢谢。

filesystemwatcher fs node.js

5
推荐指数
1
解决办法
2745
查看次数

跟踪文件移动(可能在磁盘之间)的最佳方式,VB.NET(或 C#)

我正在开发一个“动态快捷方式”应用程序,它创建指向注册表项而不是实际文件/可执行文件的特殊快捷方式文件。注册表项包含所需文件的路径。我想要运行一个守护进程,它监视链接到的文件,并在移动或重命名它们时更新它们的注册表项。重命名后我可以使用 System.IO.FileSystemWatcher 进行处理,但是处理移动文件的最佳方法是什么?

我知道这超出了 FSW 的基本功能(尽管是低级文件系统操作)。问题是,最好的方法是什么?

  1. 我读过的大多数帖子/文章都提出了感觉完全“hacky”的方法,这些方法基本上涉及寻找删除,然后在文件的新位置创建,并通过文件大小、元数据、文件之间的时间连接两者。删除/创建触发器、哈希等。这很可能是我必须采用的方法,在所有驱动器上设置 FSW。不过,我希望可能有更好的方法。

  2. 是否可以:

    2.1. 监听 shell 并“听到”移动操作?

    2.2 或者(甚至更激进)替换或添加一些东西到 shell 移动操作中,触发某种事件或执行注册表更新任务本身,从而消除对守护程序的需要?

我有一种感觉,每个人都会告诉我 1. 是唯一的课程,但我期待您的建议。(首选 VB.NET 中的答案,但如果需要,可以从 C# 进行翻译)。

c# vb.net filesystems filesystemwatcher windows-shell

5
推荐指数
1
解决办法
2395
查看次数

Powershell 和 System.IO.FileSystemWatcher

我是 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)

powershell filesystemwatcher

5
推荐指数
1
解决办法
2万
查看次数

AspNetCore 2.1 BackgroundService\IHostedService 中的 FileSystemWatcher

我正在尝试在 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 asp.net-core asp.net-core-2.1

5
推荐指数
1
解决办法
5878
查看次数

如何在带有 .NET 5.0+ 的 Linux 上使用 FileSystemWatcher

我正在尝试使用 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)

.net c# filesystemwatcher cross-platform .net-5

5
推荐指数
0
解决办法
4153
查看次数

在FileSystemWatcher中处理多个更改事件

我有以下子:

  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上找到的答案.

谢谢,斯科特

vb.net filesystemwatcher

4
推荐指数
1
解决办法
4156
查看次数

我在哪里将FileSystemWatcher放在我的mvc应用程序中?

我们有一个asp.net mvc应用程序,我们希望将FileSystemWatcher与它集成.我已经看到了许多关于如何实现FileSystemWatcher的好例子,但我真的不知道将它放在我的应用程序中的哪个位置.它似乎应该从应用程序开始.有任何想法吗?

.net model-view-controller filesystemwatcher

4
推荐指数
1
解决办法
2179
查看次数

添加带子目录的文件夹的FileSystemWatcher事件

我正在使用FileSystemWatcher来监视创建的新文件夹的目录.这可以正常工作,除了这些文件夹中的每一个都可以在其中包含一个或多个子目录.

问题是当我复制顶级文件夹(其中包含一个或多个子目录)时,FileSystemWatcher只捕获顶级文件夹而不是子目录.

例如:将带有子目录'bar'的文件夹'foo'拖到正在监视的目录中FileSystemWatcher通知新目录'foo'已创建,但没有说'bar'

我是否遗漏了具有FileSystemWatcher功能的东西,还是有其他方法可以解决这个问题?

c# filesystemwatcher

4
推荐指数
2
解决办法
9131
查看次数

FileSystemWatcher扭曲文件名

我正在使用FileSystemWatcher检测.docx文件.打开时会检测文件,但文件名始终"已损坏".

3个例子:

  1. 如果我的文件名是:2711111.docx,则收到的文件名FileSystemWatcher.Changed是:〜$ 711111.docx.

  2. 对于文件:*2711111_1.docx*我得到文件名:*〜$ 11111_1.docx*我无法猜出我的文件名是什么,所以我正在寻找一般的解决方案.

  3. 对于包含/以字母开头的文件,它不会发生.

这是我的代码

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)

.net c# filesystemwatcher

4
推荐指数
1
解决办法
1437
查看次数