Solved

create file and append it

Posted on 2010-11-11
7
581 Views
Last Modified: 2012-05-10
I want to catch exceptions in a log file. I want to name my log file by date. If the file exists, it should append to it, if file does not exist, it should create one. I tried the following code but get error access to path is denied. I have shared the logs folder and given full control to every one. Please suggest what needs to be done.

I am getting the correct FileName as 11-11-2010.txt and Fullname (with path) as \\myserver\Projects\Results\Logs\11-11-2010.txt

Error: Access to the path '\\myserver\Projects\Results\Logs\11-11-2010.txt' is denied.

Thank You
public void WriteLog(string TextStr)
        {
            string FilePath = ConfigurationManager.AppSettings["LogPath"].ToString();
            
            //Set Filename By Date
            string FileName = DateTime.Now.ToString("MM-dd-yyyy") + ".txt";
            string FullName = FilePath + FileName;
            
            //if file does not exist, create one
            if (!File.Exists(FullName))
            {
                FileStream fileStream = new FileStream(@FullName, FileMode.Append);
            }

            StreamWriter SW;
            SW = File.AppendText(FullName);
            SW.WriteLine(TextStr);
            SW.Close();
        }

Open in new window

0
Comment
Question by:patd1
  • 3
  • 3
7 Comments
 
LVL 33

Accepted Solution

by:
Todd Gerbert earned 500 total points
ID: 34115899
You're not closing the filestream, thus subsequent attempts to write to it will fail...try this, the "using" block will ensure that logWriter is displosed at the closing curly brace
public void WriteLog(string TextStr)
{
	string FilePath = ConfigurationManager.AppSettings["LogPath"].ToString();

	//Set Filename By Date
	string FileName = DateTime.Now.ToString("MM-dd-yyyy") + ".txt";
	string FullName = FilePath + FileName;

	//check if file exists, else create one
	using(StreamWriter logWriter = new StreamWriter(new FileStream(FullName, FileMode.Append, FileAccess.Write, FileShare.Read)))
	{
		logWriter.WriteLine(TextStr);
	}
}

Open in new window

0
 
LVL 35

Expert Comment

by:Miguel Oz
ID: 34115935
Your porlbem is that multiple threads or processes are trying to access your fiel at the same time.
You need to call your file using a lock or a mutex:
use lock if your program is multithreaded.
public void WriteLog(string TextStr)
        {
            string FilePath = ConfigurationManager.AppSettings["LogPath"].ToString();
           
            //Set Filename By Date
            string FileName = DateTime.Now.ToString("MM-dd-yyyy") + ".txt";
            string FullName = FilePath + FileName;
           
            //check if file exists, else create one
lock(this)
{
            FileStream fileStream = new FileStream(@FullName, FileMode.Append);
            StreamWriter SW;
            SW = File.AppendText(FullName);
            SW.WriteLine(TextStr);
            SW.Close();
}
        }


else use mutex
http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx

Alternatives: use Trace class and specify your file, log framework (log4net)
http://stackoverflow.com/questions/1260157/whats-the-most-widely-used-logging-framework-in-c

0
 

Author Comment

by:patd1
ID: 34115989
Another small problem though:
For the new line character I am adding "\\n" to the string, but it is simply writing \n to the file. what do I do to make it write a new line character?

Thanks
0
Announcing the Most Valuable Experts of 2016

MVEs are more concerned with the satisfaction of those they help than with the considerable points they can earn. They are the types of people you feel privileged to call colleagues. Join us in honoring this amazing group of Experts.

 
LVL 33

Expert Comment

by:Todd Gerbert
ID: 34116024
When you put two backslashes together it means "interpret this as a single backslash character, not an escape sequance"
So "\\n" = \n
and "\n" = newline
But, you probably want "\r\n" which is the normal line termination sequence in Windows, or you can use Environment.NewLine - e.g. WriteLine("Hello World!" + Environment.NewLine);
0
 

Author Comment

by:patd1
ID: 34116095
I tried both "\r\n" and Environment.NewLine
Both write \n in my text file
see example:
\nMain Method In ResultGenerator\nCaseNo not passed in.\nSystem.IndexOutOfRangeException: Index was outside the bounds of the array.
   at ResultGenerator.ResultGenerator.Main(String[] args) in E:\Projects\ResultGenerator\ResultGenerator.cs:line 20
0
 
LVL 33

Expert Comment

by:Todd Gerbert
ID: 34116136
If you start a string with "@" then no escape sequences are recognized.
e.g.
@"Hello\r\nWorld" = Hello\r\nWorld
"Hello\r\nWorld" = Hello <newline> World
I recommend you use the String.Format method,
string message = String.Format("{0}\r\n{1}\r\n{2}", "Main Method in ResultGen", "CaseNo not passed", ex.Message);
0
 

Author Comment

by:patd1
ID: 34117092
mas_oz2003:
Thanks for pointing me to alternate soultions for logging. Is it a good idea to write to OS event log?
Any disadvantages?
0

Featured Post

Announcing the Most Valuable Experts of 2016

MVEs are more concerned with the satisfaction of those they help than with the considerable points they can earn. They are the types of people you feel privileged to call colleagues. Join us in honoring this amazing group of Experts.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This article introduced a TextBox that supports transparent background.   Introduction TextBox is the most widely used control component in GUI design. Most GUI controls do not support transparent background and more or less do not have the…
Introduction Hi all and welcome to my first article on Experts Exchange. A while ago, someone asked me if i could do some tutorials on object oriented programming. I decided to do them on C#. Now you may ask me, why's that? Well, one of the re…
Established in 1997, Technology Architects has become one of the most reputable technology solutions companies in the country. TA have been providing businesses with cost effective state-of-the-art solutions and unparalleled service that is designed…

825 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question