我有以下代码来检测文件是否已在使用中:
public static bool FileInUse(string sFile)
{
FileStream file = null;
try
{
file = new FileStream(sFile, FileMode.Open, FileAccess.ReadWrite);
file.Close();
file = File.OpenWrite(sFile);
file.Close();
return false;
}
catch (Exception)
{
try { file.Close(); }
catch (Exception) { }
return true;
}
}
使用该文件时,
new FileStream(sFile, FileMode.Open, FileAccess.ReadWrite)
不会引发错误,但是File.OpenWrite(sFile)
会引发错误:该进程无法访问该文件,因为它正在被另一个文件使用
处理。
这是为什么?因为我要检查是否可以在写入模式下打开文件。
最佳答案
用于FileStream
的构造函数默认为共享模式FileShare.Read
,这意味着以后将允许打开文件进行读取(但不能写入)的请求。即使该文件已经打开以供读取(如果不是非独占读取),这也将起作用。
在File.OpenWrite
上,MSDN在线指出:
此方法等效于FileStream(String,FileMode,FileAccess,FileShare)构造函数重载,文件模式设置为OpenOrCreate,访问权限设置为Write,共享模式设置为None。
http://msdn.microsoft.com/en-us/library/system.io.file.openwrite(v=vs.110).aspx
这意味着File.OpenWrite
尝试获得对该文件的独占读取访问权限,而不仅仅是独占写入访问权限。
听起来当您测试文件“使用中”时,它已打开供读取。
两种方法都检查文件是否可用于独占写入。您需要确定您的应用程序是否还需要排他性阅读。