2

我有一个文本文件,我想检查它是否已经打开。问题是可以多次打开文件并且没有例外。

我试过了:

stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);

没有例外。

我也试过

using (Stream stream = new FileStream("MyFilename.txt", FileMode.Open))

没有例外。

乃至

System.Diagnostics.Process.GetProcessesByName("MyFilename.txt").Length < 1

但即使文件打开它returns 0

MyFilename.txt只是一个名称,在真实代码中它是真实的文件路径。

我可以写什么?

谢谢!优雅

4

2 回答 2

2

如果记事本没有专门锁定文本文件,那么您需要使用不同的方法

Process[] pList = Process.GetProcessesByName("notepad");
foreach(Process p in pList)
{
    if(p.MainWindowTitle.Contains("MyFilename.txt")
       ......
}

当然,这不是一个愚蠢的解决方案。我可以用写字板或其他文本编辑器打开文件,如果没有锁,我们又会遇到同样的问题

但是,如果您成功地以独占方式打开文件,那么保存其更改是记事本的问题

于 2013-05-27T10:49:26.300 回答
1

是的,有一种方法可以使用FileStreamlike

protected virtual bool IsFileUsed(FileInfo file)
{
    FileStream stream = null;

    try
    {
        stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
    }
    catch (IOException)
    {
        //the file is unavailable because it is:
        //still being written to
        //or being processed by another thread
        //or does not exist (has already been processed)
        return true;
    }
    finally
    {
        if (stream != null)
            stream.Close();
    }

    //file is not in use
    return false;
}
于 2013-05-27T10:39:18.107 回答