是否有更好的方法来检查文件是否未锁定,然后打开文件以捕获异常。我有一个在目录上运行的filewatcher,我需要在文件在该位置完全移动/创建后对该文件执行某些操作。是不是会因性能受到影响而抛出异常?还有更好的方法吗?
Private Function FileAvailable(ByVal fileName As String) As Boolean
Try
Using inputStream As FileStream = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.None)
Return True
End Using
Catch ex As IOException
Return False
End Try
End Function
或
private bool FileAvailable(string fileName) {
try {
using (FileStream inputStream = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.None)) {
return true;
}
}
catch (IOException ex) {
return false;
}
}
一位小专家就最佳方式提出建议。感谢
该文件正被复制到watch目录中。没有其他用户可以访问该目录。我只需要验证文件是否完全复制到我处理的目录中并自行移动文件。我需要独家访问它。
答案 0 :(得分:8)
你多久会这样做?把它放在上下文中,假设您每50毫秒检查一次 - 这是非常频繁的。我的笔记本电脑(我上次检查过)能够超过100个异常每毫秒 ...因此抛出异常的成本将低于总时间的0.02% - 并且假设它始终是忙!
现在,有一个API来避免这种情况肯定会很好 - 一种TryOpenFile
- 但在它缺席的情况下,我只是把它放在另一个函数中而不用担心。
但请记住,如果你只是返回一个布尔值,那么你的数据一旦返回就会陈旧 - 另一个进程可以在你返回“它没关系”后立即获取一个独占锁。为避免这种情况,您应该考虑返回开放流。
答案 1 :(得分:1)
Mutex怎么样?