C# 获取文件属性的其他方法?
背景: 我有一个文件监视服务,它使用C# 获取文件属性的其他方法?,c#,filesystemwatcher,C#,Filesystemwatcher,背景: 我有一个文件监视服务,它使用FileSystemWatcher类监视本地系统上的文件更改,并处理创建的,删除的,重命名的等事件。触发这些事件时,我只想使用FileSystemInfo类获取文件的属性,例如FileName,FileSize,CreationTime,LastAccessTime,LastWriteTime 问题: 此服务正在运行时,我无法卸载某些程序,例如(Microsoft Security Essentials)。我有一种感觉,这些服务正在保留标记为删除的文件的资源,
FileSystemWatcher
类监视本地系统上的文件更改,并处理创建的,删除的,重命名的等事件。触发这些事件时,我只想使用FileSystemInfo
类获取文件的属性,例如FileName
,FileSize
,CreationTime
,LastAccessTime
,LastWriteTime
问题:
此服务正在运行时,我无法卸载某些程序,例如(Microsoft Security Essentials)。我有一种感觉,这些服务正在保留标记为删除的文件的资源,因为只有在运行此服务时,我才能卸载这些程序
我的问题是,我如何以替代方法高效地获取文件的属性(如上所述),而不必保留文件的资源
这是我使用文件系统信息的代码
public void OnCreate/OnRenamed(object source, FileSystemEventArgs e)
{ FileInfo file = new FileInfo(e.FullPath);
String output = "<Event><TimeStamp>" + currentTime + "</TimeStamp>";
output += "<Name>" + action + "</Name>";
output += "<Properties><FileName>" + file.Name + "</FileName>";
output += "<FullPath>" + file.FullName + "</FullPath>";
output += "<FileSize>" + file.Length + "</FileSize>";
output += "<CreationTime>" + String.Format("{0:yyyyMMdd-HHmmss.fff}", file.CreationTime) + "</CreationTime>";
output += "<LastAccess>" + String.Format("{0:yyyyMMdd-HHmmss.fff}", file.LastAccessTime) + "</LastAccess>";
output += "<LastWriteTime>" + String.Format("{0:yyyyMMdd-HHmmss.fff}", file.LastWriteTime = DateTime.Now) + "</LastWriteTime></Properties></Event>";
}
public void OnCreate/onrename(对象源、文件系统目标)
{FileInfo file=newfileinfo(e.FullPath);
字符串输出=“当前时间+”;
输出+=“”+操作+“”;
输出+=“”+文件名+“”;
输出+=“”+file.FullName+“”;
输出+=“”+文件长度+“”;
输出+=“”+String.Format(“{0:yyyyMMdd HHmmss.fff}”,file.CreationTime)+”;
输出+=“”+String.Format(“{0:yyyyMMdd HHmmss.fff}”,file.LastAccessTime)+”;
输出+=“”+String.Format(“{0:yyyyMMdd HHmmss.fff}”,file.LastWriteTime=DateTime.Now)+”;
}
真诚地,
Derek使用通常不会“挂起”这些文件。您必须首先弄清楚是什么原因导致其他程序在卸载过程中卡住。用于查看卸载期间访问的文件。该工具非常简单,您需要根据文件系统活动进行筛选。阅读或谷歌搜索
试着一次拿出一件东西来做实验。我假设这些程序在您的服务未运行时成功卸载。这证明确实是您的服务引起了问题。首先对文件系统信息代码进行注释。看看问题是否消失了。然后注释掉FileSystemWatcher,看看它是否有用
更新:看起来这是一句冒犯性的话:
file.LastWriteTime = DateTime.Now
尝试对此分配进行注释,看看它是否解决了问题:
file.LastWriteTime /* = DateTime.Now */
这是一个输入错误还是您真的需要写入LastWriteTime?您可以做的是每次间隔检查LastAccessTime和LastWriteTime,并根据间隔进行快速计算,您可以确定文件是否在间隔时间内最后一次被访问或修改。如果是,做你必须做的。只是一个想法…启动Process Explorer,看看您是否真的保留了这些文件。没有必要去追逐野鹅。你能给我一些建议,让我如何去检查它吗?看。向下滚动至“处理级别故障排除”是否建议我如何检查它?@Derek:请参阅更新的答案,在这种情况下,ProcessMonitor将比ProcessExplorer做得更好。或者你可以简单地通过注释代码并检查它是否有帮助来缩小原因。嗯,在注释了FileSystemInfo上的代码部分后,程序可以正确卸载,但我仍然不明白为什么要删除FileSystemInfo代码部分(在监视系统时,我只获取文件的属性)问题的原因是什么?我已经在编辑的问题中发布了代码。提前感谢您在发现问题时的慷慨帮助。@Derek:看起来没有什么可疑的。然而,我发现这并不是所有的代码,一些变量没有定义,LastAccessTime没有被使用等等。试着注释较小的代码片段,看看问题是否消失。另外,请提供有关您正在卸载的软件以及卸载过程中到底发生了什么的更多信息。亲爱的先生,也许您可以看看我的另一个问题