public static TextWriter CreateTraceFile(string filebaseName)
{
var traceFileName = AddPIDAndAppDomainNameToFileName(Path.GetFullPath(filebaseName));
var traceDir = Path.GetDirectoryName(traceFileName);
FileStream fstream = null;
var successFullyOpened = false;
for (var i = 0; i < 2; i++) // Retry the open operation in case of errors
{
try
{
Directory.CreateDirectory(Path.GetDirectoryName(traceFileName)); // if the directory to the trace file does not exist create it
fstream = new FileStream(traceFileName, FileMode.Create, FileAccess.Write, FileShare.Read);
successFullyOpened = true;
}
catch (IOException) // try to open the file with another name in case of a locking error
{
traceDir = traceFileName + Guid.NewGuid();
}
if (successFullyOpened)
{
break;
}
}
if (fstream != null)
{
TextWriter writer = new StreamWriter(fstream);
// Create a synchronized TextWriter to enforce proper locking in case of concurrent tracing to file
writer = TextWriter.Synchronized(writer);
return writer;
}
return null;
}