【问题标题】:Check if file is being used before moving it在移动文件之前检查文件是否正在使用
【发布时间】:2020-04-15 06:13:10
【问题描述】:

我正在媒体播放器中播放*.mp4 文件,但同时尝试将文件从一个地方移动到另一个地方,我需要检查该文件是否正在被另一个进程访问,我想阻止移动进程。

public Boolean fileInUse(FileInfo file)
{
    FileStream stream=null;
    try
    {
        stream = file.Open(FileMode.Open, FileAccess.Read, FileShare.None);

    }
    catch (IOException)
    {
        //File is in use
        Console.WriteLine("File is Being used");
        return true;
    }
    finally {
        if (stream != null) {
            stream.Close();
        }
    }
    Console.WriteLine("File is not in use");
    return false;    
}

【问题讨论】:

  • 这能回答你的问题吗? Is there a way to check if a file is in use?
  • 请记住,即使您编写了“如果文件未使用,则移动它”的代码,另一个应用程序可能会在您执行“如果”的时间之间潜入并打开文件以及你做“那么”的时间。确保可以移动文件的唯一有保证的方法是实际移动它,并捕获任何异常。当然,您仍然可以按照您的要求进行先发制人检查,例如提供更好的用户体验(例如,如果您知道无法移动文件,请禁用“移动”按钮)。但是当你最终完成移动时,你仍然必须准备好捕捉异常。
  • @JoeWhite 我没有用于移动过程的 UI,特别是它应该是自动化的,无法禁用按钮,因为我没有。
  • @JoeWhite 不一定会有例外,因为您可以移动正在使用的文件。

标签: c# .net visual-studio io


【解决方案1】:
public Boolean fileInUse(FileInfo file)
{
    bool fileInUse = false;
    FileStream stream = null;
    try
    {
        stream = file.Open(FileMode.Open, FileAccess.Read, FileShare.None);
        stream.Close();
    }
    catch (IOException)
    {
        //File is in use
        Console.WriteLine("File is Being used");
        fileInUse = true;
    }

    Console.WriteLine("File is not in use");
    return fileInUse;    
}

【讨论】:

  • 即使文件正在使用,问题仍然存在,它永远不会抛出 IOException
  • 文件一般没有这个功能。这真的取决于你想要做什么。例如,如果您只想打开一个文件一次,那么您将使用流。流实例的存在(意味着不为空)通常表明它是开放的,因为您将如何确定它的范围。一般来说,如果您想知道文件 X 是否被任何人打开,则没有此类支持。
  • 无论如何这几乎是无用的,因为当调用返回时,有人可能已经打开或关闭了文件。大多数人在尝试写入之前尝试检测打开的文件,但这是不正确的方法。一个文件可以同时被不同的人打开读写。一般来说,您只需尝试该操作,如果它失败,并且您感兴趣,那么您可以检查异常以了解它失败的原因。
猜你喜欢
  • 2019-03-07
  • 1970-01-01
  • 1970-01-01
  • 2012-02-10
  • 2013-12-21
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多