Я вижу странное поведение, когда класс StreamWriter записывает дополнительные данные в файл, используя этот код:
public void WriteToCSV(string filename)
{
StreamWriter streamWriter = null;
try
{
streamWriter = new StreamWriter(filename);
Log.Info("Writing CSV report header information ... ");
streamWriter.WriteLine("\"{0}\",\"{1}\",\"{2}\",\"{3}\"", ((int)CSVRecordType.Header).ToString("D2", CultureInfo.CurrentCulture), m_InputFilename, m_LoadStartDate, m_LoadEndDate);
int recordCount = 0;
if (SummarySection)
{
Log.Info("Writing CSV report summary section ... ");
foreach (KeyValuePair<KeyValuePair<LoadStatus, string>, CategoryResult> categoryResult in m_DataLoadResult.DataLoadResults)
{
streamWriter.WriteLine("\"{0}\",\"{1}\",\"{2}\",\"{3}\"", ((int)CSVRecordType.Summary).ToString("D2", CultureInfo.CurrentCulture), categoryResult.Value.StatusString, categoryResult.Value.Count.ToString(CultureInfo.CurrentCulture), categoryResult.Value.Category);
recordCount++;
}
}
Log.Info("Writing CSV report cases section ... ");
foreach (KeyValuePair<KeyValuePair<LoadStatus, string>, CategoryResult> categoryResult in m_DataLoadResult.DataLoadResults)
{
foreach (CaseLoadResult result in categoryResult.Value.CaseLoadResults)
{
if ((LoadStatus.Success == result.Status && SuccessCases) ||
(LoadStatus.Warnings == result.Status && WarningCases) ||
(LoadStatus.Failure == result.Status && FailureCases) ||
(LoadStatus.NotProcessed == result.Status && NotProcessedCases))
{
streamWriter.Write("\"{0}\",\"{1}\",\"{2}\",\"{3}\",\"{4}\"", ((int)CSVRecordType.Result).ToString("D2", CultureInfo.CurrentCulture), result.Status, result.UniqueId, result.Category, result.ClassicReference);
if (RawResponse)
{
streamWriter.Write(",\"{0}\"", result.ResponseXml);
}
streamWriter.WriteLine();
recordCount++;
}
}
}
streamWriter.WriteLine("\"{0}\",\"{1}\"", ((int)CSVRecordType.Count).ToString("D2", CultureInfo.CurrentCulture), recordCount);
Log.Info("CSV report written to '{0}'", fileName);
}
catch (IOException execption)
{
string errorMessage = string.Format(CultureInfo.CurrentCulture, "Unable to write XML report to '{0}'", fileName);
Log.Error(errorMessage);
Log.Error(exception.Message);
throw new MyException(errorMessage, exception);
}
finally
{
if (null != streamWriter)
{
streamWriter.Close();
}
}
}
Созданный файл содержит набор записей в каждой строке от 0 до N, например:
[Record Zero]
[Record One]
...
[Record N]
Однако созданный файл содержит либо пустые значения, либо неполные записи из более высокого уровня файла, добавленного в конец. Например:
[Record Zero]
[Record One]
...
[Record N]
[Lots of nulls]
or
[Record Zero]
[Record One]
...
[Record N]
[Half complete records]
Это также происходит в отдельных фрагментах кода, которые также используют класс StreamWriter. Кроме того, все созданные файлы имеют размеры, кратные 1024. Мне не удалось воспроизвести такое поведение на любой другой машине, и я попытался воссоздать среду. Предыдущие версии приложения не демонстрировали такого поведения, несмотря на тот же код для рассматриваемых методов.
РЕДАКТИРОВАТЬ: добавлен дополнительный код.
StreamWriter
). - person Richard   schedule 14.06.2010[Write to stream]
. - person Henk Holterman   schedule 14.06.2010Flush()
. У меня были ситуации, когда буферизованные данные не удалялись автоматически из StreamWriter. - person Phil Gan   schedule 14.06.2010filename
на локальном диске или на сетевом ресурсе (например, путь UNC)? - person Daniel Renshaw   schedule 14.06.2010