gpt4 book ai didi

c# - 文件流打开的 FileSystemWatcher 触发器

转载 作者:可可西里 更新时间:2023-11-01 09:12:16 24 4
gpt4 key购买 nike

我有一个 filesystemwatcher,它会在文件被修改时触发一个事件。一旦锁定被删除,我想从该文件中读取。目前我只是试图在事件被触发后打开文件,当复制一个大文件时,文件锁在事件发送后会保持一段时间,防止文件被打开以进行读取访问。

有什么建议吗?

最佳答案

这个实际上有点麻烦,除非自从我上次不得不处理它以来问题空间发生了显着变化。

最简单的方法是简单地尝试打开文件,捕获生成的 IOException,如果文件被锁定,则将其添加到队列中以供稍后检查。您不能只尝试处理传入的每个文件,因为在各种情况下都会为同一个文件生成多个事件,因此在每个接收到的事件上设置重试循环可能会很快变成灾难。您需要将它们排成队列,并定期检查队列。

这是一个基本的类模板,可以帮助您解决这个问题:

public class FileMonitor : IDisposable
{
private const int PollInterval = 5000;

private FileSystemWatcher watcher;
private HashSet<string> filesToProcess = new HashSet<string>();
private Timer fileTimer; // System.Threading.Timer

public FileMonitor(string path)
{
if (path == null)
throw new ArgumentNullException("path");

watcher = new FileSystemWatcher();
watcher.Path = path;
watcher.NotifyFilter = NotifyFilters.FileName;
watcher.Created += new FileSystemEventHandler(FileCreated);
watcher.EnableRaisingEvents = true;

fileTimer = new Timer(new TimerCallback(ProcessFilesTimer),
null, PollInterval, Timeout.Infinite);
}

public void Dispose()
{
fileTimer.Dispose();
watcher.Dispose();
}

private void FileCreated(object source, FileSystemEventArgs e)
{
lock (filesToProcess)
{
filesToProcess.Add(e.FullPath);
}
}

private void ProcessFile(FileStream fs)
{
// Your code here...
}

private void ProcessFilesTimer(object state)
{
string[] currentFiles;
lock (filesToProcess)
{
currentFiles = filesToProcess.ToArray();
}
foreach (string fileName in currentFiles)
{
TryProcessFile(fileName);
}
fileTimer.Change(PollInterval, Timeout.Infinite);
}

private void TryProcessFile(string fileName)
{
FileStream fs = null;
try
{
FileInfo fi = new FileInfo(fileName);
fs = fi.OpenRead();
}
catch (IOException)
{
// Possibly log this error
return;
}

using (fs)
{
ProcessFile(fs);
}

lock (filesToProcess)
{
filesToProcess.Remove(fileName);
}
}
}

(注意 - 我是凭内存记忆的,所以它可能并不完美 - 如果它有问题请告诉我。)

关于c# - 文件流打开的 FileSystemWatcher 触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2226892/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com