我有以下代码来检测文件是否已在使用中:

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尝试获得对该文件的独占读取访问权限,而不仅仅是独占写入访问权限。

听起来当您测试文件“使用中”时,它已打开供读取。

两种方法都检查文件是否可用于独占写入。您需要确定您的应用程序是否还需要排他性阅读。

09-25 20:55