【问题标题】:c# exception file is being used by another processc#异常文件正在被另一个进程使用
【发布时间】:2013-11-30 10:51:44
【问题描述】:

以下两个功能有问题。两者都有一个相同的基本方案,但第一个工作,第二个导致标记行异常(“文件被另一个进程使用”)。

    // this works
    public static void EncryptFile(string FileName)
    {
        string ToEncrypt = null;

        using(StreamReader sr = new StreamReader(FileName))
        {
            ToEncrypt = sr.ReadToEnd();
        }
        using(StreamWriter sw = new StreamWriter(FileName, false))
        {
            string Encrypted = Encrypt(ToEncrypt, true);
            sw.Write(Encrypted);
        }
    }
    // this works not - see commented lin
    public static void DecryptFile(string FileName)
    {
        string ToDecrypt = null;

        using (StreamReader sr = new StreamReader(FileName))
        {
            ToDecrypt = sr.ReadToEnd();
        }
        // here comes the exception
        using (StreamWriter sw = new StreamWriter(FileName, false))
        {
            string Decrypted = Decrypt(ToDecrypt, true);
            sw.Write(Decrypted);
        }
    }

我在读写后尝试了一个额外的 Close() ,但这也不起作用。 希望有人能帮忙。

谢谢

托尔斯滕

【问题讨论】:

    标签: c# file exception process


    【解决方案1】:

    函数是从多个线程调用的吗?如果是,您可能希望在类级别声明一个静态对象,并在该方法的整个主体周围放置一个锁定语句。像这样:

    private static Object syncObject = new Object()
    // this works not - see commented lin
    public static void DecryptFile(string FileName)
    {
        lock(syncObject)
        {
            string ToDecrypt = null;
    
            using (StreamReader sr = new StreamReader(FileName))
            {
                ToDecrypt = sr.ReadToEnd();
            }
            // here comes the exception
            using (StreamWriter sw = new StreamWriter(FileName, false))
            {
                string Decrypted = Decrypt(ToDecrypt, true);
                sw.Write(Decrypted);
            }
        }
    }
    

    您也可以,只是为了好玩,评论 StreamReader 语句并尝试再次运行该方法吗?如果它仍然不起作用,请检查您是否使用 ProcessExplorer 或类似工具在文本编辑器或类似工具中打开了该文件。

    编辑 你能评论 StreamReader 部分吗?所以它看起来像这样:

     public static void DecryptFile(string FileName)
     {
    
        //string ToDecrypt = null;
    
        //using (StreamReader sr = new StreamReader(FileName))
        //{
         //   ToDecrypt = sr.ReadToEnd();
        //}
        // here comes the exception
        using (StreamWriter sw = new StreamWriter(FileName, false))
        {
            string Decrypted = Decrypt(ToDecrypt, true);
            sw.Write(Decrypted);
        }
    
    }
    

    您还可以尝试在 StreamReader 之前和 StreamReader 之后但在 StreamWriter 之前打开该文件的专有 FileStream 吗? http://msdn.microsoft.com/de-de/library/tyhc0kft%28v=vs.110%29.aspx

    您也可以尝试使用另一个文件来实现该方法吗?

    【讨论】:

    • 不,函数不被多个线程使用。我还关闭了所有其他应用程序,例如资源管理器可能会阻止该文件。这很令人困惑,因为第一个功能原则上是相同的并且可以工作。我还注释掉了抛出异常的部分,而不是它的工作原理。所以错误很明显是本地化的,谢谢。
    • 编辑了我的问题。我几乎相信还有其他东西阻止了该文件,因为 StreamReader 通常是非独占的,即使它仍然打开,您应该能够编辑该文件。哦还有一件事:你能在 StreamWriter 的 using 语句上设置一个断点吗?当调试器到达那里时,尝试在文本编辑器中打开文件并对其进行一些更改并尝试保存它。还要检查您的代码并确保您没有在其他任何地方使用该文件。
    • 完成。发现错误。 StreamReader 在函数调用之前打开。愚蠢的错误。非常抱歉,非常感谢。
    • 奇怪,我的印象是 StreamReader 通常是非独占的。这意味着您仍然可以在 StreamReader 打开时写入文件......我猜我错了。
    • 这不起作用:StreamReader sr = new StreamReader(FileName); // 解密文件 DecryptFile(FileName); // 读取元素数据 while ((row = sr.ReadLine()) != null) ...... 现在可以了: // 解密文件 DecryptFile(FileName); // 读取元素数据 StreamReader sr = new StreamReader(FileName); while ((row = sr.ReadLine()) != null) ......因此可以打开两个指向同一个文件的 StreamReader,但似乎在两者都关闭之前无法写入。
    最近更新 更多