【问题标题】:ReWrite text file重写文本文件
【发布时间】:2015-11-19 02:32:14
【问题描述】:

如何重写文本文件(在指定位置)并锁定他?

对于重写它需要读取然后被写入。 - 这很容易 - 但我需要在整个重写过程中将文件锁定到所有其他进程。

我有办法。

    public bool AccessBridge()
    {
        try
        {
            fs = new FileStream("bridge.ini", FileMode.Open, FileAccess.ReadWrite);
            sr = new StreamReader(fs);
            sw = new StreamWriter(fs);
            return true;
        }
        catch (IOException ioe)
        {
            return false;
        }
    }

然后是另一个测试部分:

        string precteno = sr.ReadToEnd();
        //Some modify string
        //now I need delete whole text from file
        sw.Write(precteno);

有什么想法吗?我已经处理了第 2 晚。

【问题讨论】:

    标签: c# filestream streamreader streamwriter


    【解决方案1】:

    使用FileShare.None独占打开即可:

    fs = new FileStream("bridge.ini", FileMode.Open, FileAccess.ReadWrite, FileShare.None);
    

    顺便说一句……如果我是你,我会把那部分放在using

    using (var fs = new FileStream("bridge.ini", FileMode.Open, FileAccess.ReadWrite, FileShare.None))
    {
    }
    

    这样,流就被正确处理了。目前,我在您的代码中没有看到您关闭流的任何地方(也许您正在其他地方执行此操作,因为您已经在该方法之外声明了您的流......但是是的)。

    【讨论】:

    • 这确实是一个很好的做法,但没有解决问题。如何使用相同的流清除文件?
    • @IgorQuirino 解决什么问题?问题是关于锁定文件。那个代码没有做吗?
    • 在整个重写过程中锁定文件。打开流本身将其锁定。没有重写的实现,所以我需要先读然后再写——这是一个问题。所以问题是:如何使用相同的流清除文件?
    • @K.Zdenek 这一切都可以在一个流中完成。您使用 FileShare.None 打开 FileStream,它会锁定它。您使用 StreamReader 从流中读取并使用 StreamWriter 写入流。所以,我不确定你遇到了什么问题。
    • @B.K.当您通过 StreamReader 读取它时,写入从文本文件的末尾位置开始。 FileShare.None 使用(读取默认值)。问题解决了。
    【解决方案2】:

    试试这个:

    public bool AccessBridge()
    {
        try
        {
            fs = new FileStream("bridge.ini", FileMode.Open, FileAccess.ReadWrite); 
            sr = new StreamReader(fs);
            string text = sr.ReadToEnd();
            //do text modifications
            //... 
            sw = new StreamWriter(fs, false);
            sw. Write(text) ;
            return true;
    
        }
        catch (IOException ioe)
        {
            return false;
        }
    }
    

    【讨论】:

    • 它不起作用,因为它没有构造函数。 (仅使用字符串路径)
    【解决方案3】:

    想到自己的Stream后,我反汇编FileStream,发现getter/setter的位置。

    解决方案:

        string precteno = sr.ReadToEnd();
        precteno = stringModificator(precteno);
        fs.Position = 3;
        sw.Write(precteno);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-02
      • 1970-01-01
      • 2021-06-16
      • 2013-09-19
      • 2019-10-21
      相关资源
      最近更新 更多