咨询区
Dawsy:
我的项目中有一个需求,它需要不断的访问一个文件,很多时候这个访问逻辑都是正常的,但有时候访问太快,会抛出如下异常:
"File in use by another process"
为了能找到其解决方案,我翻遍了google,我发现几乎所有的方式都是用 try,catch
来判断,我是一个有代码洁癖的人,我希望寻找一种更高效的方式。
回答区
Community:
如果不想用 try catch
判断异常类型的话,可以在 Open 文件的时候使用 FileModel.OpenOrCreate
枚举,希望对你有帮助。参考如下代码:
static void Main(string[] args){string filePath = "C:\\Documents And Settings\\yourfilename";bool isFileInUse;isFileInUse = FileInUse(filePath);// Then you can do some checkingif (isFileInUse)Console.WriteLine("File is in use");elseConsole.WriteLine("File is not in use");}static bool FileInUse(string path){try{using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate)){return fs.CanWrite;}}catch (IOException ex){return true;}}
Karl Johan:
你可以使用 FileSystemWatcher
的 Change 事件去监控文件的更变,我虽然没用过这个类,但我觉得在非 try catch 情况下可以值得一试,如果频繁的写入对 FileSystemWatcher 有过大负载的话,建议还是切回到 try catch 上。
点评区
其实常规做法就是将业务代码通过 try catch
包裹起来,然后在 catch 中判断是否存在文件被使用,简单粗暴,比如下面这段代码:
protected virtual bool IsFileLocked(FileInfo file)
{try{using(FileStream stream = file.Open(FileMode.Open, FileAccess.Read, FileShare.None)){stream.Close();}}catch (IOException){return true;}return false;
}
很显然这种用异常来分流业务逻辑,这是一种不推荐的做法,性能也是非常低,上面两位大佬也给了自己的意见,大家可以根据具体场景使用。