c#:确保我的文件关闭的最佳方法

时间:2018-03-21 11:08:45

标签: c# file stream

所以我有function检查我的File是否仍在使用中(为了在尝试复制和删除之前等待):

    private static bool IsFileLocked(FileInfo file)
    {
        FileStream stream = null;

        try
        {
            using (stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None))
            {

            }
        }
        catch (IOException)
        {
            // The file is unavailable because it is:
            // 1. Still being written to.
            // 2. Being processed by another thread.
            // 3. Does not exist (has already been processed).

            if (stream != null)
                stream.Close();
            return true;
        }
        finally
        {
            if (stream != null)
                stream.Close();
        }

        //file is not locked
        return false;
    }

所以这足以调用Close()方法或使用using来确保在完成我的方法后file已关闭?

2 个答案:

答案 0 :(得分:1)

其他答案和评论已经指出了代码中的冗余以及为什么您当前的方法可能不会很好。我会尝试给你一些如何解决更普遍问题的指导。

我使用的方法如下:

  1. 创建一个并发队列,跟踪文件待定副本。根据需要方便地添加文件更新此队列;一旦以前的文件处理开始,未来的未知完成(*))。
  2. 创建一个并发队列,跟踪待删除的文件。
  3. 在工作线程上设置计时器,并定期迭代符合复制条件的文件,并尝试复制每个文件。成功删除文件并将其排入待处理的删除队列。
  4. 在同一工作线程(或具有自己的计时器的另一个工作线程)上迭代所有待删除的文件并尝试删除每个文件。成功删除文件。
  5. 继续前进,直到两个队列都空了或世界结束。
  6. 故事的道德:检查文件是否被锁定以便对其执行某些阻止操作是没有意义的,在您执行检查后立即锁定它没有任何阻止。这样做的方法是简单地尝试对文件执行您需要的操作,如果它不起作用,请稍后再试。如果确实如此,嘿,工作完成了,很棒。

    (*)如果你知道文件处理何时完成,那么所有这些都是毫无意义的,在上一步完成时复制和删除。

答案 1 :(得分:0)

我认为你错过了使用声明的重点。具有IDisposible的类可以与using语句一起使用。当using语句结束时,"使用"类自动处理。正确编写的类将关闭所有打开的操作并处理该类。所以,简而言之,只需执行以下操作即可。使用FileAccess和FileShare来满足您的需求。

void t()
    {
        using (FileStream _fileStream = new FileStream(_fileName, FileMode.Open, FileAccess.Read, FileShare.Read))
        {
            using (StreamReader sr = new StreamReader(_fileStream))
            {
               // do file operations
            }
        }
    }