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) 我正在使用FileSystemWatcher检查文件被修改或删除的时间,但我想知道是否有任何方法可以检查其他应用程序何时读取文件.
示例:我的硬盘驱动器上有文件C:\ test.txt,正在使用FileSystemWatcher查看它.另一个程序(不在我的控制之下)去读取该文件; 我想抓住该事件,如果可能的话,检查正在读取文件的程序,然后相应地修改文件的内容.
我想在文件系统中轮询任何已更改,添加或删除的文件或子目录.应尽快检测所有更改,但不要对机器施加压力.操作系统是Windows> = Vista,观察到的部分是本地目录.
通常情况下,我会使用FileSystemWatcher,但这会导致其他程序试图查看相同位置的问题(突出显示,Windows资源管理器).另外,我听说FSW即使对于本地文件夹和大缓冲区也不是很可靠.
我遇到的主要问题是文件和目录的数量可能非常大(猜数为7位).只需每秒检查一次所有文件就会对我的机器造成明显影响.
我的下一个想法是每秒检查整棵树的不同部分以减少整体影响,并可能添加一种启发式方法,例如检查经常更快地更改的文件.
我想知道是否有这种问题的模式,或者是否有人有这种情况的经验.
我需要在无限循环中运行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服务.
我正在尝试编写一个程序,可以监视多个文件夹以进行文件创建,并启动相同的操作,但每个文件夹的设置不同.我的问题是为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()?
我想开发一个应用程序,它记录在机器上访问的文件/目录.
例如,我转到D:\并进入文件夹文件并打开一个word文件.我希望我的应用程序以以下格式创建日志:
我已经使用FileSystemWatcher来实现其他类型的文件系统活动,但无法获取访问它的事件.
我试图在磁盘上更新文件时收到通知。我有兴趣在发生刷新时立即收到此通知,但是,似乎 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)
我已更正 DateTime 的 ToString 函数以显示秒数。这是上面代码的输出:
11:37:47 AM] Watcher changed! …Run Code Online (Sandbox Code Playgroud) 只想写一个应用程序来跟踪磁盘中文件之间的关系.
我们知道FileSystemWatcher可以在创建,重命名或删除文件时触发evetns.
但是FileSystemWatcher无法告诉我们源文件的路径.
例如,假设有一个文件F1中folder1,然后我们复制F1到另一个名为文件夹folder2,新文件名仍然是F1.在这种情况下,FileSystemWatcher可以告诉我们已经创建了一个新文件folder2.但它不能告诉我们新F1从复制F1的folder1,而这些信息是我们需要的.
有什么想法吗?
我FileSystemWatcher看了一个目录进行更改,当有一个新的XML文件时,它会解析该文件并对其执行某些操作.
我在我的项目中有一些示例XML文件,我用于我编写的解析器的单元测试目的.
我正在寻找一种方法来使用示例XML文件来测试FileSystemWatcher.
是否可以以编程方式创建事件(以某种方式涉及XML文件)以触发FSW.Changed事件?
我的 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# ×6
.net ×5
filesystems ×3
file-io ×2
windows ×2
c++ ×1
docker ×1
events ×1
monitoring ×1
polling ×1
security ×1
unit-testing ×1
winapi ×1