使用C#检查文件是否正在使用中

时间:2019-01-11 18:08:45

标签: c# winforms

我看到了两个问题:

Check if file is in use

Is there a way to check if a file is in use?

他们都没有提供我所需要的全部信息,并且我需要对一些答案进行更多的说明,但是这些问题已有多年历史了,所以我不确定是否应该尝试从中获得答复。在这里。

所以我发布了一个新问题。像

public string myFile;
myFile = @"C:\somepath\somefile.pdf";

if (myFile isinuseorwhatever)
{
     MessageBox.Show("File is in use!! Close it and try again");
     return;
}
else
{
     MessageBox.Show("That worked. Good job!")
     //Do Stuff and lots of lines of stuff.
}

我可以使用异常处理来执行此操作,但是问题是我需要在运行多行代码之前进行检查。

我觉得我需要创建一门课程来检查它,然后运行该课程。老实说,我对编码还很陌生,所以我对类的工作方式不是100%清楚。

我知道使用trycatch的方法,但这在这里不起作用,因为在try块的最后几行代码中发生了异常,因此这些东西会在遇到异常之前发生。就像,该程序复制文件,将其重命名,将其移动到另一个目录,然后删除原始文件,这是它的最后一件事。如果用户打开了文件,它将执行所有操作,但是在尝试删除时会引发异常。在复制,重命名,移动等之前,我需要它引发异常。

3 个答案:

答案 0 :(得分:2)

通过将FileStreamFileShare.None结合使用,可以锁定文件以进行独占访问。因此,如果我们要实现提到的第一个请求

  1. 检查文件是否正在使用中,如果是,请通知用户
  2. 如果没有锁定它,那么没人会打开它
  3. 复制文件
  4. 重命名文件

您可以实现以下代码:

try
{

    using (Stream stream = new FileStream("1.docx", FileMode.Open, FileAccess.ReadWrite, FileShare.None))
    {
        // Here you can copy your file
        // then rename the copied file
    }
}
catch (Exception ex)
{
    MessageBox.Show("File is in use!! Close it and try again");
    return;
}

我认为您知道如何复制和重命名该文件(如果未注释,则将在此处添加代码)。 问题的第二部分有些棘手。因为您不能使用Filestream删除文件。一旦将filestream配置为调用File.Delete("YourFile.doc"),就有可能在那一刻有人准确地访问它。 我建议您在锁定文件时将其截断,以便其他用户无法使用。您也可以保持过程循环,直到文件被释放。代码如下所示:

try
{
    using (Stream stream = new FileStream("1.docx", FileMode.Open, FileAccess.ReadWrite, FileShare.None))
    {
        // Here you can copy your file
        // then rename the copied file
        using (StreamWriter writer = new StreamWriter(stream, Encoding.Unicode))
        {
            writer.Write(""); // truncate the file, making it unusable to others
        }
    }
    while (true)
    {
        try
        {
            File.Delete("1.docx");
        }
        catch 
        {
        }
    }
}
catch (Exception ex)
{
    MessageBox.Show("File is in use!! Close it and try again");
    return;
}

答案 1 :(得分:0)

使用bool值,如果尝试打开文件时抛出异常,则将其设置为false。

示例:

    string path = "Your Path";
    bool available = true;
    try
    {
        using (FileStream fs = File.Open(path, FileMode.Open))
        {

        }
    }
    catch(Exception ex)
    {
        available = false;
    }

答案 2 :(得分:0)

当前@ code-pope接受的答案包含在try-catch中的太多代码,它认为每个异常都是由于“文件正在使用中”而发生的,而实际上,异常也可能由于其他原因而出现

我会做这样的事情:

string path = "some path";
FileStream fs = null; 
try
{
    fs = new FileStream("1.docx", FileMode.Open, FileAccess.ReadWrite, FileShare.None);
}
catch(Exception ex)
{
    //ops, cannot open file, better not keep on
    MessageBox.Show("File is in use!! Close it and try again");
    return;
}

// lets go on now...
using (fs)
{
    // do your work
}