txt写入时出现:正由另一进程使用,因此该进程无法访问该文件,有没有好的解决方法

鏡椛氹鈅 2015-07-23 09:47:01

for (int i = 0; i < 10000; i++)
{
using (StreamWriter sw = new StreamWriter(System.AppDomain.CurrentDomain.BaseDirectory + @"\5.txt", true))
{
sw.WriteLine(i.ToString() + "\r");
}
}

上面这段代码,写入数据时,会发生 5.txt正由另一进程使用,因此该进程无法访问该文件.
各位大神,有没有好的解决办法...
...全文
777 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
油条泡胡辣汤 2017-06-02
  • 打赏
  • 举报
回复
刚也出现了同样的情况,GOTO的方式可以解决,但用着着实别扭 更新下现在的解决办法 详见http://blog.csdn.net/sundacheng1989/article/details/14520957 使用FileShare解决
xuzuning 2015-07-24
  • 打赏
  • 举报
回复
单线程时,你肯定会可以避免出现这种情况 但是在多线程时,你该如何处理呢? 显然是在 catch 分支中尝试重入

            loop:
            try
            {
                var a = new StreamWriter("1.txt", true);
            }
            catch (Exception ex)
            {
                //Console.WriteLine(ex.Message.ToString());
                sleep(10);
                goto loop;
            }
xuzuning 2015-07-24
  • 打赏
  • 举报
回复
            try
            {
                var a = new StreamWriter("1.txt", true);
                var b = new StreamWriter("1.txt", true);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message.ToString());
            }
只要目标文件是同一个,则就会发生异常 何况你还是在多线程模式下工作
鏡椛氹鈅 2015-07-24
  • 打赏
  • 举报
回复
引用 1 楼 johnliuyuan 的回复:
把循环放到using语句的里面
这是一个日志输出的功能功能,所以不可能将循环放到Using里面...
鏡椛氹鈅 2015-07-24
  • 打赏
  • 举报
回复
引用 14 楼 piaopiao_lucky 的回复:
我这里测试没问题啊,可以使用using啊
麻烦看下9楼的回复...
  • 打赏
  • 举报
回复
我这里测试没问题啊,可以使用using啊
  • 打赏
  • 举报
回复
然后再看你有什么程序用了独占式在读取这个文件?
  • 打赏
  • 举报
回复
把循环写到using里面吧。。。现在你每次循环都建一个。
ajianchina 2015-07-24
  • 打赏
  • 举报
回复
引用 10 楼 u012804018 的回复:
[quote=引用 6 楼 ajianchina 的回复:] 用了using,但并没有在下一次循环到来之前释放资源,你应该在当前循环内写完后调用Close关闭流及所占资源。

for (int i = 0; i < 10000; i++)
{
    using (StreamWriter sw = new StreamWriter(System.AppDomain.CurrentDomain.BaseDirectory + @"\5.txt", true))
    {
        sw.WriteLine(i.ToString() + "\r");
        sw.Close();
    }
}
只用sw.Close没用的你看Using的用法https://msdn.microsoft.com/zh-cn/library/yh598w02.aspx [/quote] 我注意到StreamWriter为了优化性能他会在内存中缓存据,所以释放资源前调用Flush(),确保所有的数据都写到了磁盘上。
鏡椛氹鈅 2015-07-24
  • 打赏
  • 举报
回复
引用 6 楼 ajianchina 的回复:
用了using,但并没有在下一次循环到来之前释放资源,你应该在当前循环内写完后调用Close关闭流及所占资源。

for (int i = 0; i < 10000; i++)
{
    using (StreamWriter sw = new StreamWriter(System.AppDomain.CurrentDomain.BaseDirectory + @"\5.txt", true))
    {
        sw.WriteLine(i.ToString() + "\r");
        sw.Close();
    }
}
只用sw.Close没用的你看Using的用法https://msdn.microsoft.com/zh-cn/library/yh598w02.aspx
鏡椛氹鈅 2015-07-24
  • 打赏
  • 举报
回复
引用 5 楼 sp1234 的回复:
实际上,你的代码在我这里不会报bug。写10000条数据也不出错。 你可以试试
 using (StreamWriter sw = new StreamWriter(System.AppDomain.CurrentDomain.BaseDirectory + @"\5.txt", true))
  {
               sw.WriteLine(i.ToString() + "\r");
               sw.Close();
  }
这或许就能解决你的问题。
这个确实在单独的执行的时候不会报错,我把他放到WindowsServic里面就会报错... 代码 protected override void OnStart(string[] args) { System.Timers.Timer t = new System.Timers.Timer(100); t.Elapsed += new System.Timers.ElapsedEventHandler(Elapsed); t.AutoReset = true;//设置是执行一次(false)还是一直执行(true); t.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件; } private void Elapsed(object sender, System.Timers.ElapsedEventArgs e) { try { for (int i = 0; i < 10000; i++) { using (StreamWriter sw = new StreamWriter(System.AppDomain.CurrentDomain.BaseDirectory + @"\5.txt", true)) { sw.WriteLine(i.ToString() + "\r"); sw.Close(); } } } catch (Exception ex) { using (StreamWriter sw = new StreamWriter(System.AppDomain.CurrentDomain.BaseDirectory + @"\6.txt", true)) { sw.WriteLine(ex.Message.ToString() + "\r"); sw.Close(); } } } 这样写就会报错,和应该和Timer 没有关系,在Form下面用Timer是不会报错的...
ajianchina 2015-07-23
  • 打赏
  • 举报
回复
发完居然发现被大牛抢先了
ajianchina 2015-07-23
  • 打赏
  • 举报
回复
用了using,但并没有在下一次循环到来之前释放资源,你应该在当前循环内写完后调用Close关闭流及所占资源。

for (int i = 0; i < 10000; i++)
{
    using (StreamWriter sw = new StreamWriter(System.AppDomain.CurrentDomain.BaseDirectory + @"\5.txt", true))
    {
        sw.WriteLine(i.ToString() + "\r");
        sw.Close();
    }
}
  • 打赏
  • 举报
回复
实际上,你的代码在我这里不会报bug。写10000条数据也不出错。 你可以试试
 using (StreamWriter sw = new StreamWriter(System.AppDomain.CurrentDomain.BaseDirectory + @"\5.txt", true))
  {
               sw.WriteLine(i.ToString() + "\r");
               sw.Close();
  }
这或许就能解决你的问题。
  • 打赏
  • 举报
回复
嗯,改一下:
for (int i = 0; i < 10000; i++)
{
    for (var j = 0; j < 5; ++j)
    {
        try
        {
            NewMethod(i);
        }
        catch
        {
            if (j >= 4)
                throw;
        }
    }
}
一般来说,这种代码不会刻意去重试(这里重试了4遍)。程序的最终的架构改变以测试为准,如果测试发现一个实际的系统有这类问题,那么往往就修改程序架构了。例如一个又要不断写入数据又要被读取的文件,它就不是这样的“不断close”的了。
  • 打赏
  • 举报
回复
对于这类无法事先捕获异常状况的代码,你可以使用“重试”的方式来操作。例如
private static void NewMethod(int i)
{
    using (StreamWriter sw = new StreamWriter(System.AppDomain.CurrentDomain.BaseDirectory + @"\5.txt", true))
    {
        sw.WriteLine(i.ToString() + "\r");
    }
}
for (int i = 0; i < 10000; i++)
{
    for (var j = 0; j < 5; ++j)
    {
        try
        {
            NewMethod(i);
        }
        catch
        {
            if (j >= 5)
                throw;
        }
    }
}
alwcelcs 2015-07-23
  • 打赏
  • 举报
回复
StreamWriter sw = new StreamWriter(System.AppDomain.CurrentDomain.BaseDirectory + @"\5.txt", true);
            for (int i = 0; i < 10000; i++)
            {
                    sw.WriteLine(i.ToString() + "\r");
            }
            sw.Flush();
            sw.Close();
john_QQ:2335298917 2015-07-23
  • 打赏
  • 举报
回复
把循环放到using语句的里面

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧