文件系统观察器 OnDelete 事件触发
Filesystem Watcher OnDelete Event fires
我有一个 FileSystemWatcher,它监视文件夹中的 zip 文件,然后在将文件内容添加到文件夹时执行提取。按预期将文件复制或移动到文件夹时,一切正常。 Chrome 或 IE 浏览器将目标另存为或另存为 Link 作为超链接将文件下载到文件夹,但不会触发 OnCreated 事件。相反,当以这种方式将 zip 文件保存到文件夹时,它会触发 OnDeleted。下载超链接可以是基于 Web 服务器的,也可以是本地文件到 pc 的,两者都不起作用。是否需要为此应用单独的通知过滤器?
protected override void OnLoad(EventArgs e)
{
Visible = false; // Hide form window.
ShowInTaskbar = false; // Remove from taskbar.
if (!Directory.Exists(@"c:\fwbuilder"))
{
Directory.CreateDirectory(@"c:\fwbuilder");
}
if (!Directory.Exists(@"c:\fwbuilder\romdata"))
{
Directory.CreateDirectory(@"c:\fwbuilder\romdata");
}
// Create a new FileSystemWatcher object.
FileSystemWatcher fsWatcher = new FileSystemWatcher();
//listBox.Items.Add("Started FileSystemWatcher Service…");
fsWatcher.Path = @"c:\fwbuilder";
// Set Filter.
fsWatcher.Filter = "*.zip";
// Monitor files and subdirectories.
fsWatcher.IncludeSubdirectories = false;
// Monitor all changes specified in the NotifyFilters.
fsWatcher.NotifyFilter = NotifyFilters.Attributes |
NotifyFilters.CreationTime |
NotifyFilters.DirectoryName |
NotifyFilters.FileName |
NotifyFilters.LastAccess |
NotifyFilters.LastWrite |
NotifyFilters.Security |
NotifyFilters.Size;
fsWatcher.EnableRaisingEvents = true;
// Raise Event handlers.
fsWatcher.Changed += new FileSystemEventHandler(OnChanged);
fsWatcher.Created += new FileSystemEventHandler(OnCreated);
fsWatcher.Deleted += new FileSystemEventHandler(OnDeleted);
fsWatcher.Renamed += new RenamedEventHandler(OnRenamed);
fsWatcher.Error += new ErrorEventHandler(OnError);
base.OnLoad(e);
}
如果不查看文件更改的完整详细信息,很难判断磁盘上到底发生了什么。
我建议您做以下小实验,以更好地了解当您从浏览器下载文件并将其保存到您的程序正在监视的文件夹时会发生什么。
- 从您的观察器中删除 *.zip 过滤器并观察所有文件
- 写下所有事件处理程序的日志条目以及时间戳和文件名。
- 运行程序并保存文件并观察日志。
浏览器可能正在创建 临时文件并在下载结束时将其重命名为所需名称。如果确实如此,您可以开始观察重命名操作并在那里触发您的提取操作。
我猜你因为 .zip 过滤器而错过了临时文件的创建事件。
试试这个,让我知道进展如何。此外,post 实验结果(日志)。
我有一个 FileSystemWatcher,它监视文件夹中的 zip 文件,然后在将文件内容添加到文件夹时执行提取。按预期将文件复制或移动到文件夹时,一切正常。 Chrome 或 IE 浏览器将目标另存为或另存为 Link 作为超链接将文件下载到文件夹,但不会触发 OnCreated 事件。相反,当以这种方式将 zip 文件保存到文件夹时,它会触发 OnDeleted。下载超链接可以是基于 Web 服务器的,也可以是本地文件到 pc 的,两者都不起作用。是否需要为此应用单独的通知过滤器?
protected override void OnLoad(EventArgs e)
{
Visible = false; // Hide form window.
ShowInTaskbar = false; // Remove from taskbar.
if (!Directory.Exists(@"c:\fwbuilder"))
{
Directory.CreateDirectory(@"c:\fwbuilder");
}
if (!Directory.Exists(@"c:\fwbuilder\romdata"))
{
Directory.CreateDirectory(@"c:\fwbuilder\romdata");
}
// Create a new FileSystemWatcher object.
FileSystemWatcher fsWatcher = new FileSystemWatcher();
//listBox.Items.Add("Started FileSystemWatcher Service…");
fsWatcher.Path = @"c:\fwbuilder";
// Set Filter.
fsWatcher.Filter = "*.zip";
// Monitor files and subdirectories.
fsWatcher.IncludeSubdirectories = false;
// Monitor all changes specified in the NotifyFilters.
fsWatcher.NotifyFilter = NotifyFilters.Attributes |
NotifyFilters.CreationTime |
NotifyFilters.DirectoryName |
NotifyFilters.FileName |
NotifyFilters.LastAccess |
NotifyFilters.LastWrite |
NotifyFilters.Security |
NotifyFilters.Size;
fsWatcher.EnableRaisingEvents = true;
// Raise Event handlers.
fsWatcher.Changed += new FileSystemEventHandler(OnChanged);
fsWatcher.Created += new FileSystemEventHandler(OnCreated);
fsWatcher.Deleted += new FileSystemEventHandler(OnDeleted);
fsWatcher.Renamed += new RenamedEventHandler(OnRenamed);
fsWatcher.Error += new ErrorEventHandler(OnError);
base.OnLoad(e);
}
如果不查看文件更改的完整详细信息,很难判断磁盘上到底发生了什么。
我建议您做以下小实验,以更好地了解当您从浏览器下载文件并将其保存到您的程序正在监视的文件夹时会发生什么。
- 从您的观察器中删除 *.zip 过滤器并观察所有文件
- 写下所有事件处理程序的日志条目以及时间戳和文件名。
- 运行程序并保存文件并观察日志。
浏览器可能正在创建 临时文件并在下载结束时将其重命名为所需名称。如果确实如此,您可以开始观察重命名操作并在那里触发您的提取操作。
我猜你因为 .zip 过滤器而错过了临时文件的创建事件。
试试这个,让我知道进展如何。此外,post 实验结果(日志)。