标签: filesystemwatcher

使用ReadDirectoryChangesW是否需要管理员权限?

MSDN表示使用ReadDirectoryChangesW意味着调用进程具有备份和还原权限.

这是否意味着只有在管理员帐户下启动的流程才能正常运行?

我尝试了以下代码,它在作为受限用户运行时无法启用所需的权限.

void enablePrivileges() 
{       
    enablePrivilege(SE_BACKUP_NAME);
    enablePrivilege(SE_RESTORE_NAME);
}

void enablePrivilege(LPCTSTR name) 
{       
    HANDLE hToken;    
    DWORD status;
    if (::OpenProcessToken(::GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))  
    {        
        TOKEN_PRIVILEGES tp = { 1 };   
        if( ::LookupPrivilegeValue(NULL, name,  &tp.Privileges[0].Luid) )
        {
            tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
            BOOL result = ::AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, NULL);
            verify (result != FALSE);
            status = ::GetLastError();      
        }
        ::CloseHandle(hToken); 
    } 
}
Run Code Online (Sandbox Code Playgroud)

难道我做错了什么?是否有从非管理员用户帐户使用ReadDirectoryChangesW的解决方法?似乎.NET的FileSystemWatcher可以做到这一点.谢谢!

更新:这是该类的完整代码:

  class DirectoryChangesWatcher
  {
  public:
   DirectoryChangesWatcher(wstring directory)
   {
    enablePrivileges();

    hDir = ::CreateFile(directory.c_str(), 
     FILE_LIST_DIRECTORY | FILE_FLAG_OVERLAPPED, 
     FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 
     FILE_FLAG_BACKUP_SEMANTICS, …
Run Code Online (Sandbox Code Playgroud)

c++ security winapi notifications filesystemwatcher

8
推荐指数
1
解决办法
1442
查看次数

检测C#中的文件读取

我正在使用FileSystemWatcher检查文件被修改或删除的时间,但我想知道是否有任何方法可以检查其他应用程序何时读取文件.

示例:我的硬盘驱动器上有文件C:\ test.txt,正在使用FileSystemWatcher查看它.另一个程序(不在我的控制之下)去读取该文件; 我想抓住该事件,如果可能的话,检查正在读取文件的程序,然后相应地修改文件的内容.

c# file-io filesystemwatcher

8
推荐指数
1
解决办法
4778
查看次数

我应该如何轮询大量文件以进行更改?

我想在文件系统中轮询任何已更改,添加或删除的文件或子目录.应尽快检测所有更改,但不要对机器施加压力.操作系统是Windows> = Vista,观察到的部分是本地目录.

通常情况下,我会使用FileSystemWatcher,但这会导致其他程序试图查看相同位置的问题(突出显示,Windows资源管理器).另外,我听说FSW即使对于本地文件夹和大缓冲区也不是很可靠.

我遇到的主要问题是文件和目录的数量可能非常大(猜数为7位).只需每秒检查一次所有文件就会对我的机器造成明显影响.

我的下一个想法是每秒检查整棵树的不同部分以减少整体影响,并可能添加一种启发式方法,例如检查经常更快地更改的文件.

我想知道是否有这种问题的模式,或者是否有人有这种情况的经验.

.net filesystems filesystemwatcher polling

8
推荐指数
1
解决办法
529
查看次数

如何让FileSystemWatcher线程永远运行?

我需要在无限循环中运行FileSystemWatcher来监视文件的更改,但此文件每隔几天才会更改一次,也许每周只更改一次.在FileSystemWatcher的MSDN示例中,有一个循环,而用户没有在控制台输入q:

while(Console.Read()!='q');
Run Code Online (Sandbox Code Playgroud)

我不希望它一直可用,因此它不会被意外杀死 - 它必须在无限循环中无需用户干预的情况下运行.我是否必须将循环更改为

while (true);
Run Code Online (Sandbox Code Playgroud)

所以线程不退出?仅此一点并不理想,因为它会固定CPU - 添加Thread.Sleep调用将消除CPU负载,在这种情况下,由于文件很少更改,可能会长时间休眠.这是最好的方式吗?我应该如何确保此线程保持活动状态,以便FileSystemWatcher可以在文件更改时执行操作?这是在Windows服务器(使用.NET framework 2.0版)上运行,因此如果需要,可以将其作为Windows服务.

filesystems monitoring filesystemwatcher infinite-loop

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

FileSystemEventHandler的其他参数

我正在尝试编写一个程序,可以监视多个文件夹以进行文件创建,并启动相同的操作,但每个文件夹的设置不同.我的问题是为FileSystemEventHandler指定一个额外的参数.我为每个目录创建一个新的FileWatcher来监视并添加Created-action的处理程序:

foreach (String config in configs)
{
    ...
    FileWatcher.Created += new System.IO.FileSystemEventHandler(FileSystemWatcherCreated)
    ...
}

void FileSystemWatcherCreated(object sender, System.IO.FileSystemEventArgs e, MySettings mSettings)
{
    DoSomething(e.FullPath, mSettings);
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能将'mSettings'变量传递给FileSystemWatcherCreated()?

c# filesystemwatcher

7
推荐指数
2
解决办法
6526
查看次数

监视C#中的文件/目录访问

我想开发一个应用程序,它记录在机器上访问的文件/目录.

例如,我转到D:\并进入文件夹文件并打开一个word文件.我希望我的应用程序以以下格式创建日志:

  1. D:\已打开
  2. D:\ documents打开
  3. D:\ documents\secret.docx已打开

我已经使用FileSystemWatcher来实现其他类型的文件系统活动,但无法获取访问它的事件.

.net c# windows file-io filesystemwatcher

7
推荐指数
1
解决办法
2486
查看次数

FileSystemWatcher 更改事件(对于“LastWrite”)不可靠

我试图在磁盘上更新文件时收到通知。我有兴趣在发生刷新时立即收到此通知,但是,似乎 FileSystemWatcher 只会在流打开或关闭时发送事件。

在下面的代码中,我正在写入一个文件并反复将缓冲区刷新到磁盘。然而,FileSystemWatcher 只在写入开始和结束时通知我一次。

有没有其他方法可以获取这些通知?或者我应该为此使用轮询?

编码:

class Program
{
    static void Main(string[] args)
    {
        FileSystemWatcher watcher = new FileSystemWatcher(Environment.CurrentDirectory, "Test.txt");
        watcher.Changed += watcher_Changed;
        watcher.EnableRaisingEvents = true;

        using(TextWriter writer = new StreamWriter("Test.txt"))
        {
            WriteData(writer);
            WriteData(writer);
            WriteData(writer);
            WriteData(writer);
        }

        Thread.Sleep(10000);
    }

    private static void WriteData(TextWriter writer)
    {
        writer.WriteLine("Hello!");
        writer.Flush();
        Console.WriteLine(DateTime.Now.ToString("T") + "] Wrote data");
        Thread.Sleep(3000);
    }

    static void watcher_Changed(object sender, FileSystemEventArgs e)
    {
        Console.WriteLine(DateTime.Now.ToString("T") + "] Watcher changed!");
    }
}
Run Code Online (Sandbox Code Playgroud)

更新 1

我已更正 DateTime 的 ToString 函数以显示秒数。这是上面代码的输出:

11:37:47 AM] Watcher changed! …
Run Code Online (Sandbox Code Playgroud)

.net c# filesystemwatcher

7
推荐指数
1
解决办法
5871
查看次数

如何捕获文件复制/移动事件的详细信息,例如源文件名

只想写一个应用程序来跟踪磁盘中文件之间的关系.

我们知道FileSystemWatcher可以在创建,重命名或删除文件时触发evetns.

但是FileSystemWatcher无法告诉我们源文件的路径.

例如,假设有一个文件F1folder1,然后我们复制F1到另一个名为文件夹folder2,新文件名仍然是F1.在这种情况下,FileSystemWatcher可以告诉我们已经创建了一个新文件folder2.但它不能告诉我们新F1从复制F1folder1,而这些信息是我们需要的.

有什么想法吗?

.net windows filesystems events filesystemwatcher

7
推荐指数
1
解决办法
714
查看次数

单元测试FileSystemWatcher:如何以编程方式触发已更改的事件?

FileSystemWatcher看了一个目录进行更改,当有一个新的XML文件时,它会解析该文件并对其执行某些操作.

我在我的项目中有一些示例XML文件,我用于我编写的解析器的单元测试目的.

我正在寻找一种方法来使用示例XML文件来测试FileSystemWatcher.

是否可以以编程方式创建事件(以某种方式涉及XML文件)以触发FSW.Changed事件?

.net c# unit-testing filesystemwatcher

7
推荐指数
1
解决办法
2946
查看次数

Docker 内的 FileSystemWatcher 没有注意到本地目录的更改

我的 docker 容器内的程序使用 FileSystemWatcher 来监视本地文件夹。我使用以下命令安装了目录:

docker run -v /c/Users/Support/Desktop/inbox:/Users/Support/Desktop/inbox -v /c/Users/Support/Desktop/outbox:/Users/Support/Desktop/outbox -it --name workbeanRun工作豆

我使用 Docker Exec 在容器运行时查看该容器。它可以查看收件箱和发件箱目录以及其中的任何文件。但是,当我将新文件放入收件箱时,FileSystemWatcher 事件不会触发。代码没有任何问题,因为如果我不使用 docker 容器,它就可以正常运行。

安装目录时我还需要做什么吗?或者 FileSystemWatcher 甚至可以在容器内使用吗?

好的,按照要求,程序如下:

using System;
using System.IO;

namespace workbean
{
    class Program
    {
        FileSystemWatcher watcher = new FileSystemWatcher();
        static string sourceDir = "/Users/Support/Desktop/inbox";
        static string destDir = "/Users/Support/Desktop/outbox";


        static void Main(string[] args)
        {
            Console.WriteLine("Testing...");

            Program p = new Program();

            while (true) { }
        }


        public Program()
        {
            watcher.Path = sourceDir;
            watcher.Filter = "*.*";
            watcher.Created += new FileSystemEventHandler(OnCreated);
            watcher.EnableRaisingEvents …
Run Code Online (Sandbox Code Playgroud)

c# filesystemwatcher docker

7
推荐指数
1
解决办法
2084
查看次数