문제

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 ?

도움이 되었습니까?

해결책 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; }
    }
}

다른 팁

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))
{
    ...
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top