Question

I'm trying to use the streamwriter to write into a file that is created temporarily i.e. _logFileName and at the same time write the data written into the file to a string using stream reader. The current code shows no errors but at runtime says that it can not read from _logFileName as it is in use already.

how to do i do this ?

        using (StreamWriter _logFile = File.CreateText(_logFileName))
        {
            //string s = "";
            //using (StreamReader fill_log = new StreamReader(s))
            using (StreamReader fill_log = new StreamReader(_logFileName)) 
            {
                _logFile.WriteLine("Logfile name is: " + _logFileName);
                content += fill_log.ReadLine(); 
                _logFile.WriteLine("LOG FILE STARTED AT: " + _startDateTime.ToString());
                content += fill_log.ReadLine(); 
                _logFile.WriteLine("============================================");
                content += fill_log.ReadLine(); 
                _logFile.Write(_message);
                content += fill_log.ReadLine(); 
                _logFile.WriteLine();
                content += fill_log.ReadLine(); 
            }
            _logFile.Close();
        }

So based on the suggestion i changed the code to this:

 using (var fsWrite = new FileStream(_logFileName, FileMode.Create, FileAccess.Write, FileShare.ReadWrite))
        using (var _logFile = new StreamWriter(fsWrite))
        using (var fsRead = new FileStream(_logFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
        using (var fill_log = new StreamReader(fsRead))
        {
            _logFile.WriteLine();
            content += fill_log.ReadLine();  
            _logFile.WriteLine("TIME OF LOG ENTRY: " + DateTime.Now);
            content += fill_log.ReadLine();
            // Arbitrary objects can also be written to the file.
            _logFile.WriteLine(_message);
            content += fill_log.ReadLine();
            _logFile.Flush();
            _logFile.Close();

On doing so, i am able to red and write simultaneously! that gave no problem. Thanks. But the content string variable seems to end after everyright. and ideas why this would happen ?

Was it helpful?

Solution 2

Another way to achieve what you want is using a specialized TextWriter that writes the StreamWriter and a StringBuilder:

    using (StreamWriter _logFile = File.CreateText(_logFileName))
    {
        using (var builder = new StringBuildingStreamWriter(_logFile)) 
        {
            builder.WriteLine("Logfile name is: " + _logFileName);
            builder.WriteLine("LOG FILE STARTED AT: " + _startDateTime.ToString());
            builder.WriteLine("============================================");
            builder.Write(_message);
            builder.WriteLine();

            content += builder.ToString();
        }            
        _logFile.Close();
    }


public class StringBuildingStreamWriter:TextWriter
{
    StringBuilder sb = new StringBuilder();
    private StreamWriter sw;
    public StringBuildingStreamWriter(StreamWriter sw)
    {
        this.sw = sw;
    }

    public override void WriteLine(string value)
    {
        sb.AppendLine(value);
        sw.WriteLine(value);
    }

    public override void WriteLine()
    {
        sw.WriteLine();
        sb.AppendLine();
    }

    public override void Write(string value)
    {
        sb.Append(value);
        sw.Write(value);
    }

    public override string ToString()
    {
        return sb.ToString();
    }

    public override Encoding Encoding
    {
        get { return UTF8Encoding.UTF8; }
    }
}

OTHER TIPS

In order to be able to simultaneously read and write from the same file you have to create the FileStream object manually using one of the constructors that take a FileShare parameter, for example this one.

using (var fsWrite = new FileStream(name, FileMode.Create, FileAccess.Write, FileShare.ReadWrite))
using (var _logFile = new StreamWriter(fsWrite))
using (var fsRead = new FileStream(name, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (var fill_log = new StreamReader(fsRead))
{
    ...
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top